diff --git a/.doc/itop-version-history.md b/.doc/itop-version-history.md new file mode 100644 index 000000000..6ee4f10e6 --- /dev/null +++ b/.doc/itop-version-history.md @@ -0,0 +1,57 @@ +# iTop version history + +```mermaid +%%{init: { 'logLevel': 'debug', 'theme': 'base', 'gitGraph': {'showBranches': true,'mainBranchName': 'develop','rotateCommitLabel': true}} }%% +gitGraph + commit id: "2016-07-06" tag: "2.3.0" + branch support/2.3 order: 900 + commit id: "2016-07-08" tag: "2.3.1" + commit id: "2016-12-22" tag: "2.3.3" + commit id: "2017-04-14" tag: "2.3.4" + checkout develop + commit id: "2017-07-12" tag: "2.4.0-beta" type: REVERSE + commit id: "2017-11-16" tag: "2.4.0" + branch support/2.4 order: 890 + commit id: "2018-02-14" tag: "2.4.1" + checkout develop + commit id: "2018-04-25" tag: "2.5.0-beta" type: REVERSE + checkout support/2.4 + commit id: "2018-06-14" tag: "2.4.2" + checkout develop + commit id: "2018-06-27" tag: "2.5.0" + branch support/2.5 order: 880 + checkout develop + commit id: "2019-01-09" tag: "2.6.0" + branch support/2.6 order: 870 + commit id: "2019-03-28" tag: "2.6.1" + checkout develop + commit id: "2019-12-18" tag: "2.7.0-beta" type: REVERSE + checkout support/2.5 + commit id: "2020-01-22" tag: "2.5.4" + checkout support/2.6 + commit id: "2020-01-23" tag: "2.6.3" + checkout develop + commit id: "2020-01-29" tag: "2.7.0-beta2" type: REVERSE + branch support/2.7 order: 860 + commit id: "2020-04-01" tag: "2.7.0-1" + checkout support/2.6 + commit id: "2020-04-22" tag: "2.6.4" + checkout support/2.7 + commit id: "2020-06-26" tag: "2.7.1" + checkout support/2.7 + commit id: "2020-12-09" tag: "2.7.3" + commit id: "2021-03-31" tag: "2.7.4" + checkout develop + commit id: "2021-04-06" tag: "3.0.0-beta" type: REVERSE + checkout support/2.7 + commit id: "2021-07-05" tag: "2.7.5" + checkout develop + commit id: "2021-07-05." tag: "3.0.0-beta2" type: REVERSE + checkout support/2.7 + commit id: "2021-12-17" tag: "2.7.6" + checkout develop + commit id: "2022-01-04" tag: "3.0.0" + branch support/3.0 order: 850 + commit id: "2022-04-08" tag: "3.0.1" + checkout develop +``` \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..690f3fdbc --- /dev/null +++ b/.gitattributes @@ -0,0 +1,48 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto + +# Explicitly declare text files you want to always be normalized and converted +# to native line endings on checkout. +*.bash text eol=lf +*.bat text eol=lf +*.cmd text eol=lf +*.css text eol=lf +*.scss text eol=lf +*.dist text eol=lf +.editorconfig text eol=lf +.env* text eol=lf +.gitignore text eol=lf +.htaccess text eol=lf +*.htm text eol=lf +*.html text eol=lf +*.ini text eol=lf +*.js text eol=lf +*.json text eol=lf +*.lock text eol=lf +*.md text eol=lf +*.php text eol=lf +*.php_cs text eol=lf +*.php8 text eol=lf +*.plex text eol=lf +*.sh text eol=lf +*.svg text eol=lf +*.ts text eol=lf +*.twig text eol=lf +*.txt text eol=lf +*.xml text eol=lf +*.xsd text eol=lf +*.yaml text eol=lf +*.yml text eol=lf + +# Denote all files that are truly binary and should not be modified. +*.png binary +*.jpeg binary +*.jpg binary +*.gif binary +*.ico binary +*.pdf binary +*.swf binary +*.zip binary +*.ttf binary +*.woff binary +*.woff2 binary diff --git a/.gitignore b/.gitignore index e0f65ee58..077e29e35 100644 --- a/.gitignore +++ b/.gitignore @@ -51,6 +51,7 @@ test/vendor/* # Jetbrains /.idea/** +!/.idea/IntelliLang.xml # doc. generation /.doc/vendor diff --git a/.idea/IntelliLang.xml b/.idea/IntelliLang.xml new file mode 100644 index 000000000..2703c6f18 --- /dev/null +++ b/.idea/IntelliLang.xml @@ -0,0 +1,15 @@ + + + + + iTop - Class method code + + name(..) = 'method' and count(/itop_design) = 1 + + + iTop - Snippet code + + name(..) = 'snippets' and count(/itop_design) = 1 + + + \ No newline at end of file diff --git a/.make/composer/listOutdated.php b/.make/composer/listOutdated.php index 4c47bfa81..84ab90d74 100644 --- a/.make/composer/listOutdated.php +++ b/.make/composer/listOutdated.php @@ -19,16 +19,23 @@ * */ -$iTopFolder = __DIR__ . "/../../" ; +/** + * Alias for `composer show -loD` + * You can also use `composer outdated -D` + * + * @link https://getcomposer.org/doc/03-cli.md#show + */ -require_once ("$iTopFolder/approot.inc.php"); +$iTopFolder = __DIR__."/../../"; + +require_once("$iTopFolder/approot.inc.php"); $sApproot = APPROOT; $aTrace = array(); $aParamsConfig = array( 'composer-path' => array( - 'default' => 'composer.phar', - ) + 'default' => 'composer', + ), ); $aParamsConfigNotFound = array_flip(array_keys($aParamsConfig)); $aGivenArgs = $argv; diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 58439dd8f..921aaf435 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -28,10 +28,10 @@ If you have an idea you're sure would benefit to all of iTop users, you may reasons to refuse such changes. ### šŸ“„ License and copyright -iTop is distributed under the AGPL-3.0 license (see the [license.txt] file), -your code must comply with this license. +iTop is distributed under the AGPL-3.0 license (see the [license.txt] file). -Combodo has the copyright on each and every source file in the iTop repository: please do not modify the existing file copyrights. +The iTop repository is divided in three parts: iTop (mainly PHP/JS/XML sources and dictionaries), images, and third-party libraries. +Combodo has the copyright on most of the source files in the iTop part of the repository: please do not modify the existing file copyrights. Anyhow, you are encouraged to signal your contribution by the mean of `@author` annotations. If you want to use another license or keep the code ownership (copyright), you may [create an extension][wiki new ext]. @@ -114,9 +114,9 @@ Our tests are located in the `test/` directory, containing a PHPUnit config file * Use the present tense ("Add feature" not "Added feature") * Use the imperative mood ("Move cursor to..." not "Moves cursor to...") * Limit the first line to 72 characters or less -* Please start the commit message with an applicable emoji code (following the [Gitmoji guide](https://gitmoji.carloscuesta.me/)). - Beware to use the code (for example `:bug:`) and not the character (šŸ›) as Unicode support in git clients is very poor for now... - Emoji examples : +* Please start the commit message with an applicable emoji code (following the [Gitmoji guide](https://gitmoji.dev/)). + Beware to use the code (for example `:bug:`) and not the character (šŸ›) as Unicode support in git clients is very poor for now... + Emoji examples : * 🌐 `:globe_with_meridians:` for translations * šŸŽØ `:art:` when improving the format/structure of the code * āš”ļø `:zap:` when improving performance diff --git a/README.md b/README.md index e78cce651..d8f029cde 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ iTop also offers mass import tools to help you being even more efficient. - [Software requirements][4] - [Documentation][5] covering both iTop and its official extensions - [iTop Hub][6] : discover and install extensions ! + - [iTop versions history][7] [1]: https://sourceforge.net/p/itop/discussion/ @@ -48,6 +49,7 @@ iTop also offers mass import tools to help you being even more efficient. [4]: https://www.itophub.io/wiki/page?id=latest:install:upgrading_itop [5]: https://www.itophub.io/wiki [6]: https://store.itophub.io/en_US/ +[7]: .doc/itop-version-history.md [10]: https://www.itophub.io/wiki/page?id=latest%3Adatamodel%3Astart#configuration_management_cmdb [11]: https://www.itophub.io/wiki/page?id=latest%3Adatamodel%3Astart#ticketing @@ -113,6 +115,7 @@ We would like to give a special thank you šŸ¤— to the people from the community - DudekArtur - Karkoff1212 - Laura +- nv35 - Purple Grape - Schlobinux - theBigOne diff --git a/application/cmdbabstract.class.inc.php b/application/cmdbabstract.class.inc.php index 8aa96b247..175377201 100644 --- a/application/cmdbabstract.class.inc.php +++ b/application/cmdbabstract.class.inc.php @@ -341,7 +341,7 @@ JS } /** - * @param \WebPage $oPage warning, since 3.0.0 this parameter was kept for compatibility reason. You shouldn't write directly on the page ! + * @param \WebPage $oPage Warning, since 3.0.0 this parameter was kept for compatibility reason. You shouldn't write directly on the page! * When writing to the page, markup will be put above the real header of the panel. * To insert something IN the panel, we now need to add UIBlocks in either the "subtitle" or "toolbar" sections of the array that will be returned. * @param bool $bEditMode Deprecated parameter in iTop 3.0.0, use {@see GetDisplayMode()} and ENUM_DISPLAY_MODE_* constants instead @@ -361,7 +361,7 @@ JS * @throws \OQLException * * @since 3.0.0 $bEditMode is deprecated, see param documentation above - * @since 3.0.0 changed signature : method must return header content in an array (no more writing directly to the $oPage) + * @since 3.0.0 Changed signature: Method must return header content in an array (no more writing directly to the $oPage) * * @noinspection PhpUnusedParameterInspection */ diff --git a/application/menunode.class.inc.php b/application/menunode.class.inc.php index 60a0edef8..2e71abbc3 100644 --- a/application/menunode.class.inc.php +++ b/application/menunode.class.inc.php @@ -5,8 +5,6 @@ */ use Combodo\iTop\Application\Helper\WebResourcesHelper; -use Combodo\iTop\Application\UI\Base\Component\Title\Title; -use Combodo\iTop\Application\UI\Base\Component\Title\TitleUIBlockFactory; require_once(APPROOT.'/application/utils.inc.php'); require_once(APPROOT.'/application/template.class.inc.php'); @@ -655,8 +653,7 @@ abstract class MenuNode $this->sMenuId = $sMenuId; $this->iParentIndex = $iParentIndex; $this->aReflectionProperties = array(); - if (utils::StrLen($sEnableClass) > 0) - { + if (utils::IsNotNullOrEmptyString($sEnableClass)) { $this->aReflectionProperties['enable_class'] = $sEnableClass; $this->aReflectionProperties['enable_action'] = $iActionCode; $this->aReflectionProperties['enable_permission'] = $iAllowedResults; diff --git a/application/ui.extkeywidget.class.inc.php b/application/ui.extkeywidget.class.inc.php index c54cec21b..c269831f4 100644 --- a/application/ui.extkeywidget.class.inc.php +++ b/application/ui.extkeywidget.class.inc.php @@ -973,7 +973,7 @@ HTML ); $oPage->add_ready_script(<<iId}').dialog({ width: 'auto', height: 'auto', maxHeight: $(window).height() - 50, autoOpen: false, modal: true}); +$('#ac_create_{$this->iId}').dialog({ width: $(window).width() * 0.6, height: 'auto', maxHeight: $(window).height() - 50, autoOpen: false, modal: true}); $('#dcr_{$this->iId} form').removeAttr('onsubmit'); $('#dcr_{$this->iId} form').find('button[type="submit"]').on('click', oACWidget_{$this->iId}.DoCreateObject); JS diff --git a/application/utils.inc.php b/application/utils.inc.php index 2dc6333f1..fa018fefa 100644 --- a/application/utils.inc.php +++ b/application/utils.inc.php @@ -1942,21 +1942,20 @@ class utils */ public static function CompileCSSFromSASS($sSassContent, $aImportPaths = array(), $aVariables = array()) { - $oSass = new Compiler();//['checkImportResolutions'=>true]); + $oSass = new Compiler(); $oSass->setOutputStyle(OutputStyle::COMPRESSED); // Setting our variables - $aCssVariable = []; - foreach ($aVariables as $entry=>$value) { - $aCssVariable[$entry] = ValueConverter::parseValue($value); + $aScssVariables = []; + foreach ($aVariables as $entry => $value) { + $aScssVariables[$entry] = ValueConverter::parseValue($value); } - $oSass->addVariables($aCssVariable); + $oSass->addVariables($aScssVariables); // Setting our imports paths $oSass->setImportPaths($aImportPaths); // Temporary disabling max exec time while compiling $iCurrentMaxExecTime = (int) ini_get('max_execution_time'); set_time_limit(0); // Compiling SASS - //checkImportResolutions $sCss = $oSass->compileString($sSassContent); set_time_limit(intval($iCurrentMaxExecTime)); @@ -2845,6 +2844,36 @@ HTML; return strlen($sString ?? ''); } + /** + * Helper around the native strlen() PHP method to test a string for null or empty value + * + * @link https://www.php.net/releases/8.1/en.php#deprecations_and_bc_breaks "Passing null to non-nullable internal function parameters is deprecated" + * + * @param string|null $sString + * + * @return bool if string null or empty + * @since 3.0.2 N°5302 + */ + public static function IsNullOrEmptyString(?string $sString): bool + { + return $sString === null || strlen($sString) === 0; + } + + /** + * Helper around the native strlen() PHP method to test a string not null or empty value + * + * @link https://www.php.net/releases/8.1/en.php#deprecations_and_bc_breaks "Passing null to non-nullable internal function parameters is deprecated" + * + * @param string|null $sString + * + * @return bool if string is not null and not empty + * @since 3.0.2 N°5302 + */ + public static function IsNotNullOrEmptyString(?string $sString): bool + { + return !static::IsNullOrEmptyString($sString); + } + //---------------------------------------------- // Environment helpers //---------------------------------------------- diff --git a/composer.json b/composer.json index 5b668d290..075fa8d77 100644 --- a/composer.json +++ b/composer.json @@ -1,8 +1,10 @@ { + "name": "combodo/itop", + "description": "IT Operations Portal", "type": "project", - "license": "AGPLv3", + "license": "AGPL-3.0-only", "require": { - "php": ">=7.2.5 <8.0.0", + "php": ">=7.2.5 <8.2.0", "ext-ctype": "*", "ext-dom": "*", "ext-gd": "*", @@ -11,13 +13,13 @@ "ext-mysqli": "*", "ext-soap": "*", "combodo/tcpdf": "~6.4.4", - "guzzlehttp/guzzle": "^6.5.8", + "guzzlehttp/guzzle": "^7.4.5", "laminas/laminas-mail": "^2.11", "laminas/laminas-servicemanager": "^3.5", "league/oauth2-google": "^3.0", "nikic/php-parser": "~4.14.0", "pear/archive_tar": "~1.4.14", - "pelago/emogrifier": "~3.1.0", + "pelago/emogrifier": "^6.0.0", "scssphp/scssphp": "^1.10.3", "symfony/console": "5.4.*", "symfony/dotenv": "5.4.*", diff --git a/composer.lock b/composer.lock index dbf7f11d6..d31091284 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0f484bd03531fb617bd76b2e55b12ba2", + "content-hash": "42018ae57f461e34d9572edb2da564e5", "packages": [ { "name": "combodo/tcpdf", @@ -179,37 +179,45 @@ }, { "name": "guzzlehttp/guzzle", - "version": "6.5.8", + "version": "7.4.5", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981" + "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981", - "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", + "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.9", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.17" + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.1" + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.5 || ^9.3.5", + "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.5-dev" + "dev-master": "7.4-dev" } }, "autoload": { @@ -262,19 +270,20 @@ } ], "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", "keywords": [ "client", "curl", "framework", "http", "http client", + "psr-18", + "psr-7", "rest", "web service" ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/6.5.8" + "source": "https://github.com/guzzle/guzzle/tree/7.4.5" }, "funding": [ { @@ -290,7 +299,7 @@ "type": "tidelift" } ], - "time": "2022-06-20T22:16:07+00:00" + "time": "2022-06-20T22:16:13+00:00" }, { "name": "guzzlehttp/promises", @@ -1445,39 +1454,39 @@ }, { "name": "pelago/emogrifier", - "version": "v3.1.0", + "version": "v6.0.0", "source": { "type": "git", "url": "https://github.com/MyIntervals/emogrifier.git", - "reference": "f6a5c7d44612d86c3901c93f1592f5440e6b2cd8" + "reference": "aa72d5407efac118f3896bcb995a2cba793df0ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MyIntervals/emogrifier/zipball/f6a5c7d44612d86c3901c93f1592f5440e6b2cd8", - "reference": "f6a5c7d44612d86c3901c93f1592f5440e6b2cd8", + "url": "https://api.github.com/repos/MyIntervals/emogrifier/zipball/aa72d5407efac118f3896bcb995a2cba793df0ae", + "reference": "aa72d5407efac118f3896bcb995a2cba793df0ae", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", - "php": "^5.6 || ~7.0 || ~7.1 || ~7.2 || ~7.3 || ~7.4", - "symfony/css-selector": "^2.8 || ^3.0 || ^4.0 || ^5.0" + "php": "~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0", + "sabberworm/php-css-parser": "^8.3.1", + "symfony/css-selector": "^3.4.32 || ^4.4 || ^5.3 || ^6.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.15.3", - "phpmd/phpmd": "^2.7.0", - "phpunit/phpunit": "^5.7.27", - "squizlabs/php_codesniffer": "^3.5.0" + "php-parallel-lint/php-parallel-lint": "^1.3.0", + "phpunit/phpunit": "^8.5.16", + "rawr/cross-data-providers": "^2.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0.x-dev" + "dev-main": "7.0.x-dev" } }, "autoload": { "psr-4": { - "Pelago\\": "src/" + "Pelago\\Emogrifier\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1519,7 +1528,7 @@ "issues": "https://github.com/MyIntervals/emogrifier/issues", "source": "https://github.com/MyIntervals/emogrifier" }, - "time": "2019-12-26T19:37:31+00:00" + "time": "2021-09-16T16:22:04+00:00" }, { "name": "psr/cache", @@ -1668,6 +1677,58 @@ }, "time": "2019-01-08T18:20:26+00:00" }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, { "name": "psr/http-message", "version": "1.0.1", @@ -1815,6 +1876,59 @@ }, "time": "2019-03-08T08:55:37+00:00" }, + { + "name": "sabberworm/php-css-parser", + "version": "8.4.0", + "source": { + "type": "git", + "url": "https://github.com/sabberworm/PHP-CSS-Parser.git", + "reference": "e41d2140031d533348b2192a83f02d8dd8a71d30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/e41d2140031d533348b2192a83f02d8dd8a71d30", + "reference": "e41d2140031d533348b2192a83f02d8dd8a71d30", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=5.6.20" + }, + "require-dev": { + "codacy/coverage": "^1.4", + "phpunit/phpunit": "^4.8.36" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" + }, + "type": "library", + "autoload": { + "psr-4": { + "Sabberworm\\CSS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "support": { + "issues": "https://github.com/sabberworm/PHP-CSS-Parser/issues", + "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.4.0" + }, + "time": "2021-12-11T13:40:54+00:00" + }, { "name": "scssphp/scssphp", "version": "v1.10.3", @@ -1891,16 +2005,16 @@ }, { "name": "symfony/cache", - "version": "v5.4.9", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "a50b7249bea81ddd6d3b799ce40c5521c2f72f0b" + "reference": "c4e387b739022fd4b20abd8edb2143c44c5daa14" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/a50b7249bea81ddd6d3b799ce40c5521c2f72f0b", - "reference": "a50b7249bea81ddd6d3b799ce40c5521c2f72f0b", + "url": "https://api.github.com/repos/symfony/cache/zipball/c4e387b739022fd4b20abd8edb2143c44c5daa14", + "reference": "c4e387b739022fd4b20abd8edb2143c44c5daa14", "shasum": "" }, "require": { @@ -1968,7 +2082,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.9" + "source": "https://github.com/symfony/cache/tree/v5.4.10" }, "funding": [ { @@ -1984,11 +2098,11 @@ "type": "tidelift" } ], - "time": "2022-05-21T10:24:18+00:00" + "time": "2022-06-19T12:03:50+00:00" }, { "name": "symfony/cache-contracts", - "version": "v2.5.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", @@ -2047,7 +2161,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.5.1" + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2" }, "funding": [ { @@ -2146,16 +2260,16 @@ }, { "name": "symfony/console", - "version": "v5.4.9", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb" + "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/829d5d1bf60b2efeb0887b7436873becc71a45eb", - "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb", + "url": "https://api.github.com/repos/symfony/console/zipball/4d671ab4ddac94ee439ea73649c69d9d200b5000", + "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000", "shasum": "" }, "require": { @@ -2225,7 +2339,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.9" + "source": "https://github.com/symfony/console/tree/v5.4.10" }, "funding": [ { @@ -2241,7 +2355,7 @@ "type": "tidelift" } ], - "time": "2022-05-18T06:17:34+00:00" + "time": "2022-06-26T13:00:04+00:00" }, { "name": "symfony/css-selector", @@ -2311,16 +2425,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v5.4.9", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "beecae161577305926ec078c4ed973f2b98880b3" + "reference": "88d1c0d38c2e60f757fa11d89cfc885f0b7f5171" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/beecae161577305926ec078c4ed973f2b98880b3", - "reference": "beecae161577305926ec078c4ed973f2b98880b3", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/88d1c0d38c2e60f757fa11d89cfc885f0b7f5171", + "reference": "88d1c0d38c2e60f757fa11d89cfc885f0b7f5171", "shasum": "" }, "require": { @@ -2380,7 +2494,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.4.9" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.10" }, "funding": [ { @@ -2396,11 +2510,11 @@ "type": "tidelift" } ], - "time": "2022-05-27T06:40:03+00:00" + "time": "2022-06-26T13:00:04+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", @@ -2447,7 +2561,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -2694,7 +2808,7 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", @@ -2753,7 +2867,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" }, "funding": [ { @@ -2900,16 +3014,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v5.4.9", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "1cb89cd3e36d5060545d0f223f00a774fa6430ef" + "reference": "7cbc790e067a23a47b9f0dc59e2ff0ecddbd3e14" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/1cb89cd3e36d5060545d0f223f00a774fa6430ef", - "reference": "1cb89cd3e36d5060545d0f223f00a774fa6430ef", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/7cbc790e067a23a47b9f0dc59e2ff0ecddbd3e14", + "reference": "7cbc790e067a23a47b9f0dc59e2ff0ecddbd3e14", "shasum": "" }, "require": { @@ -3031,7 +3145,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.4.9" + "source": "https://github.com/symfony/framework-bundle/tree/v5.4.10" }, "funding": [ { @@ -3047,20 +3161,20 @@ "type": "tidelift" } ], - "time": "2022-05-27T06:29:07+00:00" + "time": "2022-06-19T13:15:57+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.9", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "6b0d0e4aca38d57605dcd11e2416994b38774522" + "reference": "e7793b7906f72a8cc51054fbca9dcff7a8af1c1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6b0d0e4aca38d57605dcd11e2416994b38774522", - "reference": "6b0d0e4aca38d57605dcd11e2416994b38774522", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e7793b7906f72a8cc51054fbca9dcff7a8af1c1e", + "reference": "e7793b7906f72a8cc51054fbca9dcff7a8af1c1e", "shasum": "" }, "require": { @@ -3104,7 +3218,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.9" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.10" }, "funding": [ { @@ -3120,20 +3234,20 @@ "type": "tidelift" } ], - "time": "2022-05-17T15:07:29+00:00" + "time": "2022-06-19T13:13:40+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.4.9", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8" + "reference": "255ae3b0a488d78fbb34da23d3e0c059874b5948" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/34b121ad3dc761f35fe1346d2f15618f8cbf77f8", - "reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/255ae3b0a488d78fbb34da23d3e0c059874b5948", + "reference": "255ae3b0a488d78fbb34da23d3e0c059874b5948", "shasum": "" }, "require": { @@ -3216,7 +3330,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.4.9" + "source": "https://github.com/symfony/http-kernel/tree/v5.4.10" }, "funding": [ { @@ -3232,7 +3346,7 @@ "type": "tidelift" } ], - "time": "2022-05-27T07:09:08+00:00" + "time": "2022-06-26T16:57:59+00:00" }, { "name": "symfony/polyfill-ctype", @@ -3397,93 +3511,6 @@ ], "time": "2022-05-24T11:49:31+00:00" }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.26.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-24T11:49:31+00:00" - }, { "name": "symfony/polyfill-intl-normalizer", "version": "v1.26.0", @@ -3651,82 +3678,6 @@ ], "time": "2022-05-24T11:49:31+00:00" }, - { - "name": "symfony/polyfill-php72", - "version": "v1.26.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-24T11:49:31+00:00" - }, { "name": "symfony/polyfill-php73", "version": "v1.26.0", @@ -4060,16 +4011,16 @@ }, { "name": "symfony/service-contracts", - "version": "v2.5.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c" + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c", - "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "shasum": "" }, "require": { @@ -4123,7 +4074,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.1" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" }, "funding": [ { @@ -4139,20 +4090,20 @@ "type": "tidelift" } ], - "time": "2022-03-13T20:07:29+00:00" + "time": "2022-05-30T19:17:29+00:00" }, { "name": "symfony/string", - "version": "v5.4.9", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99" + "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", - "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", + "url": "https://api.github.com/repos/symfony/string/zipball/4432bc7df82a554b3e413a8570ce2fea90e94097", + "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097", "shasum": "" }, "require": { @@ -4209,7 +4160,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.9" + "source": "https://github.com/symfony/string/tree/v5.4.10" }, "funding": [ { @@ -4225,20 +4176,20 @@ "type": "tidelift" } ], - "time": "2022-04-19T10:40:37+00:00" + "time": "2022-06-26T15:57:47+00:00" }, { "name": "symfony/translation-contracts", - "version": "v2.5.1", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "1211df0afa701e45a04253110e959d4af4ef0f07" + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1211df0afa701e45a04253110e959d4af4ef0f07", - "reference": "1211df0afa701e45a04253110e959d4af4ef0f07", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", "shasum": "" }, "require": { @@ -4287,7 +4238,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.5.1" + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" }, "funding": [ { @@ -4303,7 +4254,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/twig-bridge", @@ -4606,16 +4557,16 @@ }, { "name": "symfony/var-exporter", - "version": "v5.4.9", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "63249ebfca4e75a357679fa7ba2089cfb898aa67" + "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/63249ebfca4e75a357679fa7ba2089cfb898aa67", - "reference": "63249ebfca4e75a357679fa7ba2089cfb898aa67", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8fc03ee75eeece3d9be1ef47d26d79bea1afb340", + "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340", "shasum": "" }, "require": { @@ -4659,7 +4610,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.9" + "source": "https://github.com/symfony/var-exporter/tree/v5.4.10" }, "funding": [ { @@ -4675,20 +4626,20 @@ "type": "tidelift" } ], - "time": "2022-05-21T10:24:18+00:00" + "time": "2022-05-27T12:56:18+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.3", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e80f87d2c9495966768310fc531b487ce64237a2" + "reference": "04e42926429d9e8b39c174387ab990bf7817f7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2", - "reference": "e80f87d2c9495966768310fc531b487ce64237a2", + "url": "https://api.github.com/repos/symfony/yaml/zipball/04e42926429d9e8b39c174387ab990bf7817f7a2", + "reference": "04e42926429d9e8b39c174387ab990bf7817f7a2", "shasum": "" }, "require": { @@ -4734,7 +4685,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.3" + "source": "https://github.com/symfony/yaml/tree/v5.4.10" }, "funding": [ { @@ -4750,26 +4701,28 @@ "type": "tidelift" } ], - "time": "2022-01-26T16:32:32+00:00" + "time": "2022-06-20T11:50:59+00:00" }, { "name": "thenetworg/oauth2-azure", - "version": "v2.0.1", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/TheNetworg/oauth2-azure.git", - "reference": "2649422a0dc74af32d21d9d738d37abcd5b03998" + "reference": "06fb2d620fb6e6c934f632c7ec7c5ea2e978a844" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TheNetworg/oauth2-azure/zipball/2649422a0dc74af32d21d9d738d37abcd5b03998", - "reference": "2649422a0dc74af32d21d9d738d37abcd5b03998", + "url": "https://api.github.com/repos/TheNetworg/oauth2-azure/zipball/06fb2d620fb6e6c934f632c7ec7c5ea2e978a844", + "reference": "06fb2d620fb6e6c934f632c7ec7c5ea2e978a844", "shasum": "" }, "require": { - "firebase/php-jwt": "~3.0||~4.0||~5.0", + "ext-json": "*", + "ext-openssl": "*", + "firebase/php-jwt": "~3.0||~4.0||~5.0||~6.0", "league/oauth2-client": "~2.0", - "php": "^5.6|^7.0|^8.0" + "php": "^7.1|^8.0" }, "type": "library", "autoload": { @@ -4803,9 +4756,9 @@ ], "support": { "issues": "https://github.com/TheNetworg/oauth2-azure/issues", - "source": "https://github.com/TheNetworg/oauth2-azure/tree/v2.0.1" + "source": "https://github.com/TheNetworg/oauth2-azure/tree/v2.1.1" }, - "time": "2021-01-11T12:20:12+00:00" + "time": "2022-06-23T10:35:36+00:00" }, { "name": "true/punycode", @@ -4999,16 +4952,16 @@ }, { "name": "symfony/web-profiler-bundle", - "version": "v5.4.8", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "909c6eea7815066a80d0a362ed41abd7924e376a" + "reference": "f61c99d8dbd864b11935851b598f784bcff36fc7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/909c6eea7815066a80d0a362ed41abd7924e376a", - "reference": "909c6eea7815066a80d0a362ed41abd7924e376a", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/f61c99d8dbd864b11935851b598f784bcff36fc7", + "reference": "f61c99d8dbd864b11935851b598f784bcff36fc7", "shasum": "" }, "require": { @@ -5059,7 +5012,7 @@ "description": "Provides a development tool that gives detailed information about the execution of any request", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v5.4.8" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v5.4.10" }, "funding": [ { @@ -5075,7 +5028,7 @@ "type": "tidelift" } ], - "time": "2022-04-22T08:14:12+00:00" + "time": "2022-06-06T19:10:58+00:00" } ], "aliases": [], @@ -5084,7 +5037,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=7.2.5 <8.0.0", + "php": ">=7.2.5 <8.1.0", "ext-ctype": "*", "ext-dom": "*", "ext-gd": "*", diff --git a/core/asynctask.class.inc.php b/core/asynctask.class.inc.php index 69eb4e1a4..05bc5bd74 100644 --- a/core/asynctask.class.inc.php +++ b/core/asynctask.class.inc.php @@ -293,7 +293,7 @@ abstract class AsyncTask extends DBObject $this->Set('remaining_retries', $this->GetMaxRetries($iErrorCode)); } - $this->Set('last_error', $sErrorMessage); + $this->SetTrim('last_error', $sErrorMessage); $this->Set('last_error_code', $iErrorCode); // Note: can be ZERO !!! $this->Set('last_attempt', time()); diff --git a/core/config.class.inc.php b/core/config.class.inc.php index 9111586cc..4af341c72 100644 --- a/core/config.class.inc.php +++ b/core/config.class.inc.php @@ -530,7 +530,7 @@ class Config ], 'email_transport' => [ 'type' => 'string', - 'description' => 'Mean to send emails: PHPMail (uses the function mail()) or SMTP (implements the client protocol)', + 'description' => 'Mean to send emails: PHPMail (uses the function mail()), SMTP (implements the client protocol) or SMTP_OAuth (connect to the server using OAuth 2.0)', 'default' => "PHPMail", 'value' => "PHPMail", 'source_of_value' => '', diff --git a/core/designdocument.class.inc.php b/core/designdocument.class.inc.php index 97c65c5d3..3e6e373ed 100644 --- a/core/designdocument.class.inc.php +++ b/core/designdocument.class.inc.php @@ -26,8 +26,10 @@ namespace Combodo\iTop; -use \DOMDocument; -use \DOMFormatException; +use DOMDocument; +use DOMFormatException; +use IssueLog; +use LogAPI; /** * Class \Combodo\iTop\DesignDocument @@ -64,9 +66,13 @@ class DesignDocument extends DOMDocument * @param $filename * @param int $options */ - public function load($filename, $options = 0) + public function load($filename, $options = null) { - parent::load($filename, LIBXML_NOBLANKS); + libxml_clear_errors(); + if (parent::load($filename, LIBXML_NOBLANKS) === false) { + $aErrors = libxml_get_errors(); + IssueLog::Error("Error loading $filename", LogAPI::CHANNEL_DEFAULT, $aErrors); + } } /** @@ -79,10 +85,10 @@ class DesignDocument extends DOMDocument */ // Return type union is not supported by PHP 7.4, we can remove the following PHP attribute and add the return type once iTop min PHP version is PHP 8.0+ #[\ReturnTypeWillChange] - public function save($filename, $options = 0) + public function save($filename, $options = null) { $this->documentElement->setAttribute('xmlns:xsi', "http://www.w3.org/2001/XMLSchema-instance"); - return parent::save($filename, LIBXML_NOBLANKS); + return parent::save($filename); } /** diff --git a/core/metamodel.class.php b/core/metamodel.class.php index 71da54e91..a435576f6 100644 --- a/core/metamodel.class.php +++ b/core/metamodel.class.php @@ -461,7 +461,7 @@ abstract class MetaModel $oStyle = self::$m_aClassParams[$sClass]['style']; $sIcon = $oStyle->GetIconAsAbsUrl(); } - if (utils::StrLen($sIcon) == 0) { + if (utils::IsNullOrEmptyString($sIcon)) { $sParentClass = self::GetParentPersistentClass($sClass); if (strlen($sParentClass) > 0) { return self::GetClassIcon($sParentClass, $bImgTag, $sMoreStyles); @@ -494,7 +494,7 @@ abstract class MetaModel $oStyle = new ormStyle("ibo-class-style--$sClass", "ibo-class-style-alt--$sClass"); } - if ((utils::StrLen($oStyle->GetMainColor()) > 0) && (utils::StrLen($oStyle->GetComplementaryColor()) > 0) && (utils::StrLen($oStyle->GetIconAsRelPath()) > 0)) { + if (utils::IsNotNullOrEmptyString($oStyle->GetMainColor()) && utils::IsNotNullOrEmptyString($oStyle->GetComplementaryColor()) && utils::IsNotNullOrEmptyString($oStyle->GetIconAsRelPath())) { // all the parameters are set, no need to search in the parent classes return $oStyle; } @@ -504,18 +504,18 @@ abstract class MetaModel while (strlen($sParentClass) > 0) { $oParentStyle = self::GetClassStyle($sParentClass); if (!is_null($oParentStyle)) { - if (utils::StrLen($oStyle->GetMainColor()) == 0) { + if (utils::IsNullOrEmptyString($oStyle->GetMainColor())) { $oStyle->SetMainColor($oParentStyle->GetMainColor()); $oStyle->SetStyleClass($oParentStyle->GetStyleClass()); } - if (utils::StrLen($oStyle->GetComplementaryColor()) == 0) { + if (utils::IsNullOrEmptyString($oStyle->GetComplementaryColor())) { $oStyle->SetComplementaryColor($oParentStyle->GetComplementaryColor()); $oStyle->SetAltStyleClass($oParentStyle->GetAltStyleClass()); } - if (utils::StrLen($oStyle->GetIconAsRelPath()) == 0) { + if (utils::IsNullOrEmptyString($oStyle->GetIconAsRelPath())) { $oStyle->SetIcon($oParentStyle->GetIconAsRelPath()); } - if ((utils::StrLen($oStyle->GetMainColor()) > 0) && (utils::StrLen($oStyle->GetComplementaryColor()) > 0) && (utils::StrLen($oStyle->GetIconAsRelPath()) > 0)) { + if (utils::IsNotNullOrEmptyString($oStyle->GetMainColor()) && utils::IsNotNullOrEmptyString($oStyle->GetComplementaryColor()) && utils::IsNotNullOrEmptyString($oStyle->GetIconAsRelPath())) { // all the parameters are set, no need to search in the parent classes return $oStyle; } @@ -523,7 +523,7 @@ abstract class MetaModel $sParentClass = self::GetParentPersistentClass($sParentClass); } - if ((utils::StrLen($oStyle->GetMainColor()) == 0) && (utils::StrLen($oStyle->GetComplementaryColor()) == 0) && (utils::StrLen($oStyle->GetIconAsRelPath()) == 0)) { + if (utils::IsNullOrEmptyString($oStyle->GetMainColor()) && utils::IsNullOrEmptyString($oStyle->GetComplementaryColor()) && utils::IsNullOrEmptyString($oStyle->GetIconAsRelPath())) { return null; } diff --git a/core/ormStyle.class.inc.php b/core/ormStyle.class.inc.php index 8f3b02abf..dabbd59bd 100644 --- a/core/ormStyle.class.inc.php +++ b/core/ormStyle.class.inc.php @@ -50,7 +50,7 @@ class ormStyle */ public function HasMainColor(): bool { - return utils::StrLen($this->sMainColor) > 0; + return utils::IsNotNullOrEmptyString($this->sMainColor); } /** @@ -68,7 +68,7 @@ class ormStyle */ public function SetMainColor(?string $sMainColor) { - $this->sMainColor = (utils::StrLen($sMainColor) === 0) ? null : $sMainColor; + $this->sMainColor = utils::IsNullOrEmptyString($sMainColor) ? null : $sMainColor; return $this; } @@ -78,7 +78,7 @@ class ormStyle */ public function HasComplementaryColor(): bool { - return utils::StrLen($this->sComplementaryColor) > 0; + return utils::IsNotNullOrEmptyString($this->sComplementaryColor); } /** @@ -96,7 +96,7 @@ class ormStyle */ public function SetComplementaryColor(?string $sComplementaryColor) { - $this->sComplementaryColor = (utils::StrLen($sComplementaryColor) === 0) ? null : $sComplementaryColor; + $this->sComplementaryColor = utils::IsNullOrEmptyString($sComplementaryColor) ? null : $sComplementaryColor; return $this; } @@ -116,7 +116,7 @@ class ormStyle */ public function HasStyleClass(): bool { - return utils::StrLen($this->sStyleClass) > 0; + return utils::IsNotNullOrEmptyString($this->sStyleClass); } /** @@ -134,7 +134,7 @@ class ormStyle */ public function SetStyleClass(?string $sStyleClass) { - $this->sStyleClass = (utils::StrLen($sStyleClass) === 0) ? null : $sStyleClass; + $this->sStyleClass = utils::IsNullOrEmptyString($sStyleClass) ? null : $sStyleClass; return $this; } @@ -144,7 +144,7 @@ class ormStyle */ public function HasAltStyleClass(): bool { - return utils::StrLen($this->sAltStyleClass) > 0; + return utils::IsNotNullOrEmptyString($this->sAltStyleClass); } /** @@ -162,7 +162,7 @@ class ormStyle */ public function SetAltStyleClass(?string $sAltStyleClass) { - $this->sAltStyleClass = (utils::StrLen($sAltStyleClass) === 0) ? null : $sAltStyleClass; + $this->sAltStyleClass = utils::IsNullOrEmptyString($sAltStyleClass) ? null : $sAltStyleClass; return $this; } @@ -172,7 +172,7 @@ class ormStyle */ public function HasDecorationClasses(): bool { - return utils::StrLen($this->sDecorationClasses) > 0; + return utils::IsNotNullOrEmptyString($this->sDecorationClasses); } /** @@ -190,7 +190,7 @@ class ormStyle */ public function SetDecorationClasses(?string $sDecorationClasses) { - $this->sDecorationClasses = (utils::StrLen($sDecorationClasses) === 0) ? null : $sDecorationClasses; + $this->sDecorationClasses = utils::IsNullOrEmptyString($sDecorationClasses) ? null : $sDecorationClasses; return $this; } @@ -200,7 +200,7 @@ class ormStyle */ public function HasIcon(): bool { - return utils::StrLen($this->sIcon) > 0; + return utils::IsNotNullOrEmptyString($this->sIcon); } /** @@ -210,7 +210,7 @@ class ormStyle */ public function SetIcon(?string $sIcon) { - $this->sIcon = (utils::StrLen($sIcon) === 0) ? null : $sIcon; + $this->sIcon = utils::IsNullOrEmptyString($sIcon) ? null : $sIcon; return $this; } diff --git a/css/backoffice/components/_field.scss b/css/backoffice/components/_field.scss index f86e7db85..736a756b3 100644 --- a/css/backoffice/components/_field.scss +++ b/css/backoffice/components/_field.scss @@ -94,6 +94,7 @@ $ibo-field--enable-bulk--checkbox--margin-left: $ibo-spacing-300 !default; max-width: 145px; width: 30%; } + .ibo-field--value { margin-top: $ibo-field--value--margin-top--for-large; /* Mostly used to have a clear separation from elements in .ibo-field--comments */ } diff --git a/css/backoffice/components/input/_input-one-way-password.scss b/css/backoffice/components/input/_input-one-way-password.scss index 57a5feecb..f2a3404d0 100644 --- a/css/backoffice/components/input/_input-one-way-password.scss +++ b/css/backoffice/components/input/_input-one-way-password.scss @@ -1,4 +1,4 @@ -/*! +/* * @copyright Copyright (C) 2010-2021 Combodo SARL * @license http://opensource.org/licenses/AGPL-3.0 */ diff --git a/css/backoffice/vendors/_selectize.scss b/css/backoffice/vendors/_selectize.scss index 52851505a..ea917cd4d 100644 --- a/css/backoffice/vendors/_selectize.scss +++ b/css/backoffice/vendors/_selectize.scss @@ -1,4 +1,4 @@ -/*! +/* * @copyright Copyright (C) 2010-2021 Combodo SARL * @license http://opensource.org/licenses/AGPL-3.0 */ diff --git a/css/css-variables.scss b/css/css-variables.scss index 8de8945bb..610ea158c 100644 --- a/css/css-variables.scss +++ b/css/css-variables.scss @@ -16,6 +16,12 @@ * You should have received a copy of the GNU Affero General Public License */ +/********************************************************************************/ +/* */ +/* @deprecated 3.0.0 N°5311 The backoffice now uses files from css/backoffice/* */ +/* */ +/********************************************************************************/ + // Beware the version number MUST be enclosed with quotes otherwise v2.3.0 becomes v2 0.3 .0 $version: "v2.7.7"; $approot-relative: "../../../../" !default; // relative to env-***/branding/themes/***/main.css diff --git a/css/light-grey.scss b/css/light-grey.scss index c3d0522ed..56aad0ef6 100644 --- a/css/light-grey.scss +++ b/css/light-grey.scss @@ -16,6 +16,12 @@ * You should have received a copy of the GNU Affero General Public License */ +/********************************************************************************/ +/* */ +/* @deprecated 3.0.0 N°5311 The backoffice now uses files from css/backoffice/* */ +/* */ +/********************************************************************************/ + @import 'css-variables.scss'; #ibo-main-content, diff --git a/datamodels/2.x/authent-cas/dictionaries/pl.dict.authent-cas.php b/datamodels/2.x/authent-cas/dictionaries/pl.dict.authent-cas.php index 6308e0850..52d4d5124 100644 --- a/datamodels/2.x/authent-cas/dictionaries/pl.dict.authent-cas.php +++ b/datamodels/2.x/authent-cas/dictionaries/pl.dict.authent-cas.php @@ -1,13 +1,13 @@ - 'Użytkownik niedozwolony', - 'CAS:Login:SignIn' => 'Zaloguj się za pomocą CAS', - 'CAS:Login:SignInTooltip' => 'Kliknij tutaj, aby uwierzytelnić się na serwerze CAS', -)); + 'Użytkownik niedozwolony', + 'CAS:Login:SignIn' => 'Zaloguj się za pomocą CAS', + 'CAS:Login:SignInTooltip' => 'Kliknij tutaj, aby uwierzytelnić się na serwerze CAS', +)); diff --git a/datamodels/2.x/authent-ldap/dictionaries/pl.dict.authent-ldap.php b/datamodels/2.x/authent-ldap/dictionaries/pl.dict.authent-ldap.php index f7c90beea..275ad767e 100644 --- a/datamodels/2.x/authent-ldap/dictionaries/pl.dict.authent-ldap.php +++ b/datamodels/2.x/authent-ldap/dictionaries/pl.dict.authent-ldap.php @@ -1,41 +1,41 @@ - - */ - -// Dictionnay conventions -// Class: -// Class:+ -// Class:/Attribute: -// Class:/Attribute:+ -// Class:/Attribute:/Value: -// Class:/Attribute:/Value:+ -// Class:/Stimulus: -// Class:/Stimulus:+ - -// -// Class: UserLDAP -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:UserLDAP' => 'Użytkownik LDAP', - 'Class:UserLDAP+' => 'Użytkownik uwierzytelniony przez LDAP', -)); + + */ + +// Dictionnay conventions +// Class: +// Class:+ +// Class:/Attribute: +// Class:/Attribute:+ +// Class:/Attribute:/Value: +// Class:/Attribute:/Value:+ +// Class:/Stimulus: +// Class:/Stimulus:+ + +// +// Class: UserLDAP +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:UserLDAP' => 'Użytkownik LDAP', + 'Class:UserLDAP+' => 'Użytkownik uwierzytelniony przez LDAP', +)); diff --git a/datamodels/2.x/itop-change-mgmt-itil/dictionaries/pl.dict.itop-change-mgmt-itil.php b/datamodels/2.x/itop-change-mgmt-itil/dictionaries/pl.dict.itop-change-mgmt-itil.php index 2c6dc37de..5b2dbc67d 100644 --- a/datamodels/2.x/itop-change-mgmt-itil/dictionaries/pl.dict.itop-change-mgmt-itil.php +++ b/datamodels/2.x/itop-change-mgmt-itil/dictionaries/pl.dict.itop-change-mgmt-itil.php @@ -1,294 +1,294 @@ - - */ - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Menu:ChangeManagement' => 'Zarządzanie zmianami', - 'Menu:Change:Overview' => 'Przegląd', - 'Menu:Change:Overview+' => '', - 'Menu:NewChange' => 'Nowa zmiana', - 'Menu:NewChange+' => 'Utwórz nowe zgłoszenie zmiany', - 'Menu:SearchChanges' => 'Szukaj zmian', - 'Menu:SearchChanges+' => 'Szukaj zgłoszeń zmian', - 'Menu:Change:Shortcuts' => 'Skróty', - 'Menu:Change:Shortcuts+' => '', - 'Menu:WaitingAcceptance' => 'Zmiany do akceptacji', - 'Menu:WaitingAcceptance+' => '', - 'Menu:WaitingApproval' => 'Zmiany do zatwierdzenia', - 'Menu:WaitingApproval+' => '', - 'Menu:Changes' => 'Otwarte zmiany', - 'Menu:Changes+' => 'Wszystkie otwarte zmiany', - 'Menu:MyChanges' => 'Zmiany przypisane do mnie', - 'Menu:MyChanges+' => 'Zmiany przypisane do mnie (jako Agent)', - 'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => 'Zmiany według kategorii w ciągu ostatnich 7 dni', - 'UI-ChangeManagementOverview-Last-7-days' => 'Liczba zmian w ciągu ostatnich 7 dni', - 'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => 'Zmiany według domeny w ciągu ostatnich 7 dni', - 'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => 'Zmiany według statusu z ostatnich 7 dni', - 'Tickets:Related:OpenChanges' => 'Otwarte zmiany', - 'Tickets:Related:RecentChanges' => 'Ostatnie zmiany (72h)', -)); - -// Dictionnay conventions -// Class: -// Class:+ -// Class:/Attribute: -// Class:/Attribute:+ -// Class:/Attribute:/Value: -// Class:/Attribute:/Value:+ -// Class:/Stimulus: -// Class:/Stimulus:+ - - -// -// Class: Change -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:Change' => 'Zmiana', - 'Class:Change+' => '', - 'Class:Change/Attribute:status' => 'Status', - 'Class:Change/Attribute:status+' => '', - 'Class:Change/Attribute:status/Value:new' => 'Nowa', - 'Class:Change/Attribute:status/Value:new+' => '', - 'Class:Change/Attribute:status/Value:validated' => 'Sprawdzona', - 'Class:Change/Attribute:status/Value:validated+' => '', - 'Class:Change/Attribute:status/Value:rejected' => 'Odrzucona', - 'Class:Change/Attribute:status/Value:rejected+' => '', - 'Class:Change/Attribute:status/Value:assigned' => 'Przydzielona', - 'Class:Change/Attribute:status/Value:assigned+' => '', - 'Class:Change/Attribute:status/Value:plannedscheduled' => 'Planowana i odłożona', - 'Class:Change/Attribute:status/Value:plannedscheduled+' => '', - 'Class:Change/Attribute:status/Value:approved' => 'Zatwierdzona', - 'Class:Change/Attribute:status/Value:approved+' => '', - 'Class:Change/Attribute:status/Value:notapproved' => 'Nie zatwierdzona', - 'Class:Change/Attribute:status/Value:notapproved+' => '', - 'Class:Change/Attribute:status/Value:implemented' => 'Wdrożona', - 'Class:Change/Attribute:status/Value:implemented+' => '', - 'Class:Change/Attribute:status/Value:monitored' => 'Monitorowana', - 'Class:Change/Attribute:status/Value:monitored+' => '', - 'Class:Change/Attribute:status/Value:closed' => 'Zamknięta', - 'Class:Change/Attribute:status/Value:closed+' => '', - 'Class:Change/Attribute:reason' => 'Powód odrzucenia', - 'Class:Change/Attribute:reason+' => '', - 'Class:Change/Attribute:requestor_id' => 'Zgłaszający', - 'Class:Change/Attribute:requestor_id+' => '', - 'Class:Change/Attribute:requestor_email' => 'E-mail zgłaszającego', - 'Class:Change/Attribute:requestor_email+' => '', - 'Class:Change/Attribute:creation_date' => 'Data utworzenia', - 'Class:Change/Attribute:creation_date+' => '', - 'Class:Change/Attribute:impact' => 'Wpływ', - 'Class:Change/Attribute:impact+' => '', - 'Class:Change/Attribute:supervisor_group_id' => 'Zespół nadzorujący', - 'Class:Change/Attribute:supervisor_group_id+' => '', - 'Class:Change/Attribute:supervisor_group_name' => 'Nazwa zespołu nadzorującego', - 'Class:Change/Attribute:supervisor_group_name+' => '', - 'Class:Change/Attribute:supervisor_id' => 'Kierownik', - 'Class:Change/Attribute:supervisor_id+' => '', - 'Class:Change/Attribute:supervisor_email' => 'E-mail kierownika', - 'Class:Change/Attribute:supervisor_email+' => '', - 'Class:Change/Attribute:manager_group_id' => 'Zespół menedżerów', - 'Class:Change/Attribute:manager_group_id+' => '', - 'Class:Change/Attribute:manager_group_name' => 'Nazwa zespołu menedżerskiego', - 'Class:Change/Attribute:manager_group_name+' => '', - 'Class:Change/Attribute:manager_id' => 'Menedżer', - 'Class:Change/Attribute:manager_id+' => '', - 'Class:Change/Attribute:manager_email' => 'E-mail menedżera', - 'Class:Change/Attribute:manager_email+' => '', - 'Class:Change/Attribute:outage' => 'Awaria', - 'Class:Change/Attribute:outage+' => '', - 'Class:Change/Attribute:outage/Value:no' => 'Nie', - 'Class:Change/Attribute:outage/Value:no+' => '', - 'Class:Change/Attribute:outage/Value:yes' => 'Tak', - 'Class:Change/Attribute:outage/Value:yes+' => '', - 'Class:Change/Attribute:fallback' => 'Plan awaryjny', - 'Class:Change/Attribute:fallback+' => '', - 'Class:Change/Attribute:parent_id' => 'Zmiana Åŗródłowa', - 'Class:Change/Attribute:parent_id+' => '', - 'Class:Change/Attribute:parent_name' => 'Zmiana Åŗródłowa', - 'Class:Change/Attribute:parent_name+' => '', - 'Class:Change/Attribute:related_request_list' => 'Powiązane wnioski', - 'Class:Change/Attribute:related_request_list+' => 'Wszystkie prośby użytkowników powiązane z tą zmianą', - 'Class:Change/Attribute:related_problems_list' => 'Powiązane problemy', - 'Class:Change/Attribute:related_problems_list+' => 'Wszystkie problemy związane z tą zmianą', - 'Class:Change/Attribute:related_incident_list' => 'Powiązane incydenty', - 'Class:Change/Attribute:related_incident_list+' => 'Wszystkie incydenty związane z tą zmianą', - 'Class:Change/Attribute:child_changes_list' => 'Zmiany zależne', - 'Class:Change/Attribute:child_changes_list+' => 'Wszystkie zmiany podrzędne powiązane z tą zmianą', - 'Class:Change/Attribute:parent_id_friendlyname' => 'Przyjazna nazwa zmiany Åŗródłowej', - 'Class:Change/Attribute:parent_id_friendlyname+' => '', - 'Class:Change/Attribute:parent_id_finalclass_recall' => 'Typ zmiany', - 'Class:Change/Attribute:parent_id_finalclass_recall+' => '', - 'Class:Change/Stimulus:ev_validate' => 'Sprawdzona', - 'Class:Change/Stimulus:ev_validate+' => '', - 'Class:Change/Stimulus:ev_reject' => 'Odrzucona', - 'Class:Change/Stimulus:ev_reject+' => '', - 'Class:Change/Stimulus:ev_assign' => 'Przydzielona', - 'Class:Change/Stimulus:ev_assign+' => '', - 'Class:Change/Stimulus:ev_reopen' => 'Wznowiona', - 'Class:Change/Stimulus:ev_reopen+' => '', - 'Class:Change/Stimulus:ev_plan' => 'Zaplanowana', - 'Class:Change/Stimulus:ev_plan+' => '', - 'Class:Change/Stimulus:ev_approve' => 'Zatwierdona', - 'Class:Change/Stimulus:ev_approve+' => '', - 'Class:Change/Stimulus:ev_replan' => 'Przeplanowana', - 'Class:Change/Stimulus:ev_replan+' => '', - 'Class:Change/Stimulus:ev_notapprove' => 'Nie zatwierdzona', - 'Class:Change/Stimulus:ev_notapprove+' => '', - 'Class:Change/Stimulus:ev_implement' => 'Wdrożona', - 'Class:Change/Stimulus:ev_implement+' => '', - 'Class:Change/Stimulus:ev_monitor' => 'Monitorowana', - 'Class:Change/Stimulus:ev_monitor+' => '', - 'Class:Change/Stimulus:ev_finish' => 'Zakończona', - 'Class:Change/Stimulus:ev_finish+' => '', -)); - -// -// Class: RoutineChange -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:RoutineChange' => 'Rutynowa zmiana', - 'Class:RoutineChange+' => '', - 'Class:RoutineChange/Stimulus:ev_validate' => 'Sprawdzona', - 'Class:RoutineChange/Stimulus:ev_validate+' => '', - 'Class:RoutineChange/Stimulus:ev_reject' => 'Odrzucona', - 'Class:RoutineChange/Stimulus:ev_reject+' => '', - 'Class:RoutineChange/Stimulus:ev_assign' => 'Przydzielona', - 'Class:RoutineChange/Stimulus:ev_assign+' => '', - 'Class:RoutineChange/Stimulus:ev_reopen' => 'Wznowiona', - 'Class:RoutineChange/Stimulus:ev_reopen+' => '', - 'Class:RoutineChange/Stimulus:ev_plan' => 'Planowana', - 'Class:RoutineChange/Stimulus:ev_plan+' => '', - 'Class:RoutineChange/Stimulus:ev_approve' => 'Zatwierdzona', - 'Class:RoutineChange/Stimulus:ev_approve+' => '', - 'Class:RoutineChange/Stimulus:ev_replan' => 'Przeplanowana', - 'Class:RoutineChange/Stimulus:ev_replan+' => '', - 'Class:RoutineChange/Stimulus:ev_notapprove' => 'Nie zatwierdzona', - 'Class:RoutineChange/Stimulus:ev_notapprove+' => '', - 'Class:RoutineChange/Stimulus:ev_implement' => 'Wdrożona', - 'Class:RoutineChange/Stimulus:ev_implement+' => '', - 'Class:RoutineChange/Stimulus:ev_monitor' => 'Monitorowana', - 'Class:RoutineChange/Stimulus:ev_monitor+' => '', - 'Class:RoutineChange/Stimulus:ev_finish' => 'Zakończona', - 'Class:RoutineChange/Stimulus:ev_finish+' => '', -)); - -// -// Class: ApprovedChange -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:ApprovedChange' => 'Zatwierdzone zmiany', - 'Class:ApprovedChange+' => '', - 'Class:ApprovedChange/Attribute:approval_date' => 'Data zatwierdzenia', - 'Class:ApprovedChange/Attribute:approval_date+' => '', - 'Class:ApprovedChange/Attribute:approval_comment' => 'Komentarz do zatwierdzenia', - 'Class:ApprovedChange/Attribute:approval_comment+' => '', - 'Class:ApprovedChange/Stimulus:ev_validate' => 'Sprawdzona', - 'Class:ApprovedChange/Stimulus:ev_validate+' => '', - 'Class:ApprovedChange/Stimulus:ev_reject' => 'Odrzucona', - 'Class:ApprovedChange/Stimulus:ev_reject+' => '', - 'Class:ApprovedChange/Stimulus:ev_assign' => 'Przydzielona', - 'Class:ApprovedChange/Stimulus:ev_assign+' => '', - 'Class:ApprovedChange/Stimulus:ev_reopen' => 'Wznowiona', - 'Class:ApprovedChange/Stimulus:ev_reopen+' => '', - 'Class:ApprovedChange/Stimulus:ev_plan' => 'Planowana', - 'Class:ApprovedChange/Stimulus:ev_plan+' => '', - 'Class:ApprovedChange/Stimulus:ev_approve' => 'Zatwierdzona', - 'Class:ApprovedChange/Stimulus:ev_approve+' => '', - 'Class:ApprovedChange/Stimulus:ev_replan' => 'Przeplanowana', - 'Class:ApprovedChange/Stimulus:ev_replan+' => '', - 'Class:ApprovedChange/Stimulus:ev_notapprove' => 'Nie zatwierdzona', - 'Class:ApprovedChange/Stimulus:ev_notapprove+' => '', - 'Class:ApprovedChange/Stimulus:ev_implement' => 'Wdrożona', - 'Class:ApprovedChange/Stimulus:ev_implement+' => '', - 'Class:ApprovedChange/Stimulus:ev_monitor' => 'Monitorowana', - 'Class:ApprovedChange/Stimulus:ev_monitor+' => '', - 'Class:ApprovedChange/Stimulus:ev_finish' => 'Zakończona', - 'Class:ApprovedChange/Stimulus:ev_finish+' => '', -)); - -// -// Class: NormalChange -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:NormalChange' => 'Normalna zmiana', - 'Class:NormalChange+' => '', - 'Class:NormalChange/Attribute:acceptance_date' => 'Data akceptacji', - 'Class:NormalChange/Attribute:acceptance_date+' => '', - 'Class:NormalChange/Attribute:acceptance_comment' => 'Komentarz dotyczący akceptacji', - 'Class:NormalChange/Attribute:acceptance_comment+' => '', - 'Class:NormalChange/Stimulus:ev_validate' => 'Sprawdzona', - 'Class:NormalChange/Stimulus:ev_validate+' => '', - 'Class:NormalChange/Stimulus:ev_reject' => 'Odrzucona', - 'Class:NormalChange/Stimulus:ev_reject+' => '', - 'Class:NormalChange/Stimulus:ev_assign' => 'Przydzielona', - 'Class:NormalChange/Stimulus:ev_assign+' => '', - 'Class:NormalChange/Stimulus:ev_reopen' => 'Wznowiona', - 'Class:NormalChange/Stimulus:ev_reopen+' => '', - 'Class:NormalChange/Stimulus:ev_plan' => 'Planowana', - 'Class:NormalChange/Stimulus:ev_plan+' => '', - 'Class:NormalChange/Stimulus:ev_approve' => 'Zatwierdzona', - 'Class:NormalChange/Stimulus:ev_approve+' => '', - 'Class:NormalChange/Stimulus:ev_replan' => 'Przeplanowana', - 'Class:NormalChange/Stimulus:ev_replan+' => '', - 'Class:NormalChange/Stimulus:ev_notapprove' => 'Nie zatwierdzona', - 'Class:NormalChange/Stimulus:ev_notapprove+' => '', - 'Class:NormalChange/Stimulus:ev_implement' => 'Wdrożona', - 'Class:NormalChange/Stimulus:ev_implement+' => '', - 'Class:NormalChange/Stimulus:ev_monitor' => 'Monitorowana', - 'Class:NormalChange/Stimulus:ev_monitor+' => '', - 'Class:NormalChange/Stimulus:ev_finish' => 'Zakończona', - 'Class:NormalChange/Stimulus:ev_finish+' => '', -)); - -// -// Class: EmergencyChange -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:EmergencyChange' => 'Awaryjna zmiana', - 'Class:EmergencyChange+' => '', - 'Class:EmergencyChange/Stimulus:ev_validate' => 'Sprawdzona', - 'Class:EmergencyChange/Stimulus:ev_validate+' => '', - 'Class:EmergencyChange/Stimulus:ev_reject' => 'Odrzucona', - 'Class:EmergencyChange/Stimulus:ev_reject+' => '', - 'Class:EmergencyChange/Stimulus:ev_assign' => 'Przydzielona', - 'Class:EmergencyChange/Stimulus:ev_assign+' => '', - 'Class:EmergencyChange/Stimulus:ev_reopen' => 'Wznowiona', - 'Class:EmergencyChange/Stimulus:ev_reopen+' => '', - 'Class:EmergencyChange/Stimulus:ev_plan' => 'Planowana', - 'Class:EmergencyChange/Stimulus:ev_plan+' => '', - 'Class:EmergencyChange/Stimulus:ev_approve' => 'Zatwierdzona', - 'Class:EmergencyChange/Stimulus:ev_approve+' => '', - 'Class:EmergencyChange/Stimulus:ev_replan' => 'Przeplanowana', - 'Class:EmergencyChange/Stimulus:ev_replan+' => '', - 'Class:EmergencyChange/Stimulus:ev_notapprove' => 'Nie zatwierdzona', - 'Class:EmergencyChange/Stimulus:ev_notapprove+' => '', - 'Class:EmergencyChange/Stimulus:ev_implement' => 'Wdrożona', - 'Class:EmergencyChange/Stimulus:ev_implement+' => '', - 'Class:EmergencyChange/Stimulus:ev_monitor' => 'Monitorowana', - 'Class:EmergencyChange/Stimulus:ev_monitor+' => '', - 'Class:EmergencyChange/Stimulus:ev_finish' => 'Zakończona', - 'Class:EmergencyChange/Stimulus:ev_finish+' => '', -)); + + */ + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Menu:ChangeManagement' => 'Zarządzanie zmianami', + 'Menu:Change:Overview' => 'Przegląd', + 'Menu:Change:Overview+' => '', + 'Menu:NewChange' => 'Nowa zmiana', + 'Menu:NewChange+' => 'Utwórz nowe zgłoszenie zmiany', + 'Menu:SearchChanges' => 'Szukaj zmian', + 'Menu:SearchChanges+' => 'Szukaj zgłoszeń zmian', + 'Menu:Change:Shortcuts' => 'Skróty', + 'Menu:Change:Shortcuts+' => '', + 'Menu:WaitingAcceptance' => 'Zmiany do akceptacji', + 'Menu:WaitingAcceptance+' => '', + 'Menu:WaitingApproval' => 'Zmiany do zatwierdzenia', + 'Menu:WaitingApproval+' => '', + 'Menu:Changes' => 'Otwarte zmiany', + 'Menu:Changes+' => 'Wszystkie otwarte zmiany', + 'Menu:MyChanges' => 'Zmiany przypisane do mnie', + 'Menu:MyChanges+' => 'Zmiany przypisane do mnie (jako Agent)', + 'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => 'Zmiany według kategorii w ciągu ostatnich 7 dni', + 'UI-ChangeManagementOverview-Last-7-days' => 'Liczba zmian w ciągu ostatnich 7 dni', + 'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => 'Zmiany według domeny w ciągu ostatnich 7 dni', + 'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => 'Zmiany według statusu z ostatnich 7 dni', + 'Tickets:Related:OpenChanges' => 'Otwarte zmiany', + 'Tickets:Related:RecentChanges' => 'Ostatnie zmiany (72h)', +)); + +// Dictionnay conventions +// Class: +// Class:+ +// Class:/Attribute: +// Class:/Attribute:+ +// Class:/Attribute:/Value: +// Class:/Attribute:/Value:+ +// Class:/Stimulus: +// Class:/Stimulus:+ + + +// +// Class: Change +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:Change' => 'Zmiana', + 'Class:Change+' => '', + 'Class:Change/Attribute:status' => 'Status', + 'Class:Change/Attribute:status+' => '', + 'Class:Change/Attribute:status/Value:new' => 'Nowa', + 'Class:Change/Attribute:status/Value:new+' => '', + 'Class:Change/Attribute:status/Value:validated' => 'Sprawdzona', + 'Class:Change/Attribute:status/Value:validated+' => '', + 'Class:Change/Attribute:status/Value:rejected' => 'Odrzucona', + 'Class:Change/Attribute:status/Value:rejected+' => '', + 'Class:Change/Attribute:status/Value:assigned' => 'Przydzielona', + 'Class:Change/Attribute:status/Value:assigned+' => '', + 'Class:Change/Attribute:status/Value:plannedscheduled' => 'Planowana i odłożona', + 'Class:Change/Attribute:status/Value:plannedscheduled+' => '', + 'Class:Change/Attribute:status/Value:approved' => 'Zatwierdzona', + 'Class:Change/Attribute:status/Value:approved+' => '', + 'Class:Change/Attribute:status/Value:notapproved' => 'Nie zatwierdzona', + 'Class:Change/Attribute:status/Value:notapproved+' => '', + 'Class:Change/Attribute:status/Value:implemented' => 'Wdrożona', + 'Class:Change/Attribute:status/Value:implemented+' => '', + 'Class:Change/Attribute:status/Value:monitored' => 'Monitorowana', + 'Class:Change/Attribute:status/Value:monitored+' => '', + 'Class:Change/Attribute:status/Value:closed' => 'Zamknięta', + 'Class:Change/Attribute:status/Value:closed+' => '', + 'Class:Change/Attribute:reason' => 'Powód odrzucenia', + 'Class:Change/Attribute:reason+' => '', + 'Class:Change/Attribute:requestor_id' => 'Zgłaszający', + 'Class:Change/Attribute:requestor_id+' => '', + 'Class:Change/Attribute:requestor_email' => 'E-mail zgłaszającego', + 'Class:Change/Attribute:requestor_email+' => '', + 'Class:Change/Attribute:creation_date' => 'Data utworzenia', + 'Class:Change/Attribute:creation_date+' => '', + 'Class:Change/Attribute:impact' => 'Wpływ', + 'Class:Change/Attribute:impact+' => '', + 'Class:Change/Attribute:supervisor_group_id' => 'Zespół nadzorujący', + 'Class:Change/Attribute:supervisor_group_id+' => '', + 'Class:Change/Attribute:supervisor_group_name' => 'Nazwa zespołu nadzorującego', + 'Class:Change/Attribute:supervisor_group_name+' => '', + 'Class:Change/Attribute:supervisor_id' => 'Kierownik', + 'Class:Change/Attribute:supervisor_id+' => '', + 'Class:Change/Attribute:supervisor_email' => 'E-mail kierownika', + 'Class:Change/Attribute:supervisor_email+' => '', + 'Class:Change/Attribute:manager_group_id' => 'Zespół menedżerów', + 'Class:Change/Attribute:manager_group_id+' => '', + 'Class:Change/Attribute:manager_group_name' => 'Nazwa zespołu menedżerskiego', + 'Class:Change/Attribute:manager_group_name+' => '', + 'Class:Change/Attribute:manager_id' => 'Menedżer', + 'Class:Change/Attribute:manager_id+' => '', + 'Class:Change/Attribute:manager_email' => 'E-mail menedżera', + 'Class:Change/Attribute:manager_email+' => '', + 'Class:Change/Attribute:outage' => 'Awaria', + 'Class:Change/Attribute:outage+' => '', + 'Class:Change/Attribute:outage/Value:no' => 'Nie', + 'Class:Change/Attribute:outage/Value:no+' => '', + 'Class:Change/Attribute:outage/Value:yes' => 'Tak', + 'Class:Change/Attribute:outage/Value:yes+' => '', + 'Class:Change/Attribute:fallback' => 'Plan awaryjny', + 'Class:Change/Attribute:fallback+' => '', + 'Class:Change/Attribute:parent_id' => 'Zmiana Åŗródłowa', + 'Class:Change/Attribute:parent_id+' => '', + 'Class:Change/Attribute:parent_name' => 'Zmiana Åŗródłowa', + 'Class:Change/Attribute:parent_name+' => '', + 'Class:Change/Attribute:related_request_list' => 'Powiązane wnioski', + 'Class:Change/Attribute:related_request_list+' => 'Wszystkie prośby użytkowników powiązane z tą zmianą', + 'Class:Change/Attribute:related_problems_list' => 'Powiązane problemy', + 'Class:Change/Attribute:related_problems_list+' => 'Wszystkie problemy związane z tą zmianą', + 'Class:Change/Attribute:related_incident_list' => 'Powiązane incydenty', + 'Class:Change/Attribute:related_incident_list+' => 'Wszystkie incydenty związane z tą zmianą', + 'Class:Change/Attribute:child_changes_list' => 'Zmiany zależne', + 'Class:Change/Attribute:child_changes_list+' => 'Wszystkie zmiany podrzędne powiązane z tą zmianą', + 'Class:Change/Attribute:parent_id_friendlyname' => 'Przyjazna nazwa zmiany Åŗródłowej', + 'Class:Change/Attribute:parent_id_friendlyname+' => '', + 'Class:Change/Attribute:parent_id_finalclass_recall' => 'Typ zmiany', + 'Class:Change/Attribute:parent_id_finalclass_recall+' => '', + 'Class:Change/Stimulus:ev_validate' => 'Sprawdzona', + 'Class:Change/Stimulus:ev_validate+' => '', + 'Class:Change/Stimulus:ev_reject' => 'Odrzucona', + 'Class:Change/Stimulus:ev_reject+' => '', + 'Class:Change/Stimulus:ev_assign' => 'Przydzielona', + 'Class:Change/Stimulus:ev_assign+' => '', + 'Class:Change/Stimulus:ev_reopen' => 'Wznowiona', + 'Class:Change/Stimulus:ev_reopen+' => '', + 'Class:Change/Stimulus:ev_plan' => 'Zaplanowana', + 'Class:Change/Stimulus:ev_plan+' => '', + 'Class:Change/Stimulus:ev_approve' => 'Zatwierdona', + 'Class:Change/Stimulus:ev_approve+' => '', + 'Class:Change/Stimulus:ev_replan' => 'Przeplanowana', + 'Class:Change/Stimulus:ev_replan+' => '', + 'Class:Change/Stimulus:ev_notapprove' => 'Nie zatwierdzona', + 'Class:Change/Stimulus:ev_notapprove+' => '', + 'Class:Change/Stimulus:ev_implement' => 'Wdrożona', + 'Class:Change/Stimulus:ev_implement+' => '', + 'Class:Change/Stimulus:ev_monitor' => 'Monitorowana', + 'Class:Change/Stimulus:ev_monitor+' => '', + 'Class:Change/Stimulus:ev_finish' => 'Zakończona', + 'Class:Change/Stimulus:ev_finish+' => '', +)); + +// +// Class: RoutineChange +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:RoutineChange' => 'Rutynowa zmiana', + 'Class:RoutineChange+' => '', + 'Class:RoutineChange/Stimulus:ev_validate' => 'Sprawdzona', + 'Class:RoutineChange/Stimulus:ev_validate+' => '', + 'Class:RoutineChange/Stimulus:ev_reject' => 'Odrzucona', + 'Class:RoutineChange/Stimulus:ev_reject+' => '', + 'Class:RoutineChange/Stimulus:ev_assign' => 'Przydzielona', + 'Class:RoutineChange/Stimulus:ev_assign+' => '', + 'Class:RoutineChange/Stimulus:ev_reopen' => 'Wznowiona', + 'Class:RoutineChange/Stimulus:ev_reopen+' => '', + 'Class:RoutineChange/Stimulus:ev_plan' => 'Planowana', + 'Class:RoutineChange/Stimulus:ev_plan+' => '', + 'Class:RoutineChange/Stimulus:ev_approve' => 'Zatwierdzona', + 'Class:RoutineChange/Stimulus:ev_approve+' => '', + 'Class:RoutineChange/Stimulus:ev_replan' => 'Przeplanowana', + 'Class:RoutineChange/Stimulus:ev_replan+' => '', + 'Class:RoutineChange/Stimulus:ev_notapprove' => 'Nie zatwierdzona', + 'Class:RoutineChange/Stimulus:ev_notapprove+' => '', + 'Class:RoutineChange/Stimulus:ev_implement' => 'Wdrożona', + 'Class:RoutineChange/Stimulus:ev_implement+' => '', + 'Class:RoutineChange/Stimulus:ev_monitor' => 'Monitorowana', + 'Class:RoutineChange/Stimulus:ev_monitor+' => '', + 'Class:RoutineChange/Stimulus:ev_finish' => 'Zakończona', + 'Class:RoutineChange/Stimulus:ev_finish+' => '', +)); + +// +// Class: ApprovedChange +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:ApprovedChange' => 'Zatwierdzone zmiany', + 'Class:ApprovedChange+' => '', + 'Class:ApprovedChange/Attribute:approval_date' => 'Data zatwierdzenia', + 'Class:ApprovedChange/Attribute:approval_date+' => '', + 'Class:ApprovedChange/Attribute:approval_comment' => 'Komentarz do zatwierdzenia', + 'Class:ApprovedChange/Attribute:approval_comment+' => '', + 'Class:ApprovedChange/Stimulus:ev_validate' => 'Sprawdzona', + 'Class:ApprovedChange/Stimulus:ev_validate+' => '', + 'Class:ApprovedChange/Stimulus:ev_reject' => 'Odrzucona', + 'Class:ApprovedChange/Stimulus:ev_reject+' => '', + 'Class:ApprovedChange/Stimulus:ev_assign' => 'Przydzielona', + 'Class:ApprovedChange/Stimulus:ev_assign+' => '', + 'Class:ApprovedChange/Stimulus:ev_reopen' => 'Wznowiona', + 'Class:ApprovedChange/Stimulus:ev_reopen+' => '', + 'Class:ApprovedChange/Stimulus:ev_plan' => 'Planowana', + 'Class:ApprovedChange/Stimulus:ev_plan+' => '', + 'Class:ApprovedChange/Stimulus:ev_approve' => 'Zatwierdzona', + 'Class:ApprovedChange/Stimulus:ev_approve+' => '', + 'Class:ApprovedChange/Stimulus:ev_replan' => 'Przeplanowana', + 'Class:ApprovedChange/Stimulus:ev_replan+' => '', + 'Class:ApprovedChange/Stimulus:ev_notapprove' => 'Nie zatwierdzona', + 'Class:ApprovedChange/Stimulus:ev_notapprove+' => '', + 'Class:ApprovedChange/Stimulus:ev_implement' => 'Wdrożona', + 'Class:ApprovedChange/Stimulus:ev_implement+' => '', + 'Class:ApprovedChange/Stimulus:ev_monitor' => 'Monitorowana', + 'Class:ApprovedChange/Stimulus:ev_monitor+' => '', + 'Class:ApprovedChange/Stimulus:ev_finish' => 'Zakończona', + 'Class:ApprovedChange/Stimulus:ev_finish+' => '', +)); + +// +// Class: NormalChange +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:NormalChange' => 'Normalna zmiana', + 'Class:NormalChange+' => '', + 'Class:NormalChange/Attribute:acceptance_date' => 'Data akceptacji', + 'Class:NormalChange/Attribute:acceptance_date+' => '', + 'Class:NormalChange/Attribute:acceptance_comment' => 'Komentarz dotyczący akceptacji', + 'Class:NormalChange/Attribute:acceptance_comment+' => '', + 'Class:NormalChange/Stimulus:ev_validate' => 'Sprawdzona', + 'Class:NormalChange/Stimulus:ev_validate+' => '', + 'Class:NormalChange/Stimulus:ev_reject' => 'Odrzucona', + 'Class:NormalChange/Stimulus:ev_reject+' => '', + 'Class:NormalChange/Stimulus:ev_assign' => 'Przydzielona', + 'Class:NormalChange/Stimulus:ev_assign+' => '', + 'Class:NormalChange/Stimulus:ev_reopen' => 'Wznowiona', + 'Class:NormalChange/Stimulus:ev_reopen+' => '', + 'Class:NormalChange/Stimulus:ev_plan' => 'Planowana', + 'Class:NormalChange/Stimulus:ev_plan+' => '', + 'Class:NormalChange/Stimulus:ev_approve' => 'Zatwierdzona', + 'Class:NormalChange/Stimulus:ev_approve+' => '', + 'Class:NormalChange/Stimulus:ev_replan' => 'Przeplanowana', + 'Class:NormalChange/Stimulus:ev_replan+' => '', + 'Class:NormalChange/Stimulus:ev_notapprove' => 'Nie zatwierdzona', + 'Class:NormalChange/Stimulus:ev_notapprove+' => '', + 'Class:NormalChange/Stimulus:ev_implement' => 'Wdrożona', + 'Class:NormalChange/Stimulus:ev_implement+' => '', + 'Class:NormalChange/Stimulus:ev_monitor' => 'Monitorowana', + 'Class:NormalChange/Stimulus:ev_monitor+' => '', + 'Class:NormalChange/Stimulus:ev_finish' => 'Zakończona', + 'Class:NormalChange/Stimulus:ev_finish+' => '', +)); + +// +// Class: EmergencyChange +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:EmergencyChange' => 'Awaryjna zmiana', + 'Class:EmergencyChange+' => '', + 'Class:EmergencyChange/Stimulus:ev_validate' => 'Sprawdzona', + 'Class:EmergencyChange/Stimulus:ev_validate+' => '', + 'Class:EmergencyChange/Stimulus:ev_reject' => 'Odrzucona', + 'Class:EmergencyChange/Stimulus:ev_reject+' => '', + 'Class:EmergencyChange/Stimulus:ev_assign' => 'Przydzielona', + 'Class:EmergencyChange/Stimulus:ev_assign+' => '', + 'Class:EmergencyChange/Stimulus:ev_reopen' => 'Wznowiona', + 'Class:EmergencyChange/Stimulus:ev_reopen+' => '', + 'Class:EmergencyChange/Stimulus:ev_plan' => 'Planowana', + 'Class:EmergencyChange/Stimulus:ev_plan+' => '', + 'Class:EmergencyChange/Stimulus:ev_approve' => 'Zatwierdzona', + 'Class:EmergencyChange/Stimulus:ev_approve+' => '', + 'Class:EmergencyChange/Stimulus:ev_replan' => 'Przeplanowana', + 'Class:EmergencyChange/Stimulus:ev_replan+' => '', + 'Class:EmergencyChange/Stimulus:ev_notapprove' => 'Nie zatwierdzona', + 'Class:EmergencyChange/Stimulus:ev_notapprove+' => '', + 'Class:EmergencyChange/Stimulus:ev_implement' => 'Wdrożona', + 'Class:EmergencyChange/Stimulus:ev_implement+' => '', + 'Class:EmergencyChange/Stimulus:ev_monitor' => 'Monitorowana', + 'Class:EmergencyChange/Stimulus:ev_monitor+' => '', + 'Class:EmergencyChange/Stimulus:ev_finish' => 'Zakończona', + 'Class:EmergencyChange/Stimulus:ev_finish+' => '', +)); diff --git a/datamodels/2.x/itop-change-mgmt/dictionaries/pl.dict.itop-change-mgmt.php b/datamodels/2.x/itop-change-mgmt/dictionaries/pl.dict.itop-change-mgmt.php index 1b4e3e223..36d8ff574 100644 --- a/datamodels/2.x/itop-change-mgmt/dictionaries/pl.dict.itop-change-mgmt.php +++ b/datamodels/2.x/itop-change-mgmt/dictionaries/pl.dict.itop-change-mgmt.php @@ -1,140 +1,140 @@ - - */ - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Menu:ChangeManagement' => 'Zarządzanie zmianami', - 'Menu:Change:Overview' => 'Przegląd', - 'Menu:Change:Overview+' => '', - 'Menu:NewChange' => 'Nowa zmiana', - 'Menu:NewChange+' => 'Utwórz nowe zgłoszenie zmiany', - 'Menu:SearchChanges' => 'Szukaj zmian', - 'Menu:SearchChanges+' => 'Szukaj zgłoszeń zmian', - 'Menu:Change:Shortcuts' => 'Skróty', - 'Menu:Change:Shortcuts+' => '', - 'Menu:WaitingAcceptance' => 'Zmiany do akceptacji', - 'Menu:WaitingAcceptance+' => '', - 'Menu:WaitingApproval' => 'Zmiany do zatwierdzenia', - 'Menu:WaitingApproval+' => '', - 'Menu:Changes' => 'Otwarte zmiany', - 'Menu:Changes+' => 'Wszystkie otwarte zmiany', - 'Menu:MyChanges' => 'Zmiany przypisane do mnie', - 'Menu:MyChanges+' => 'Zmiany przypisane do mnie (jako Agent)', - 'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => 'Zmiany według kategorii w ciągu ostatnich 7 dni', - 'UI-ChangeManagementOverview-Last-7-days' => 'Liczba zmian w ciągu ostatnich 7 dni', - 'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => 'Zmiany według domeny w ciągu ostatnich 7 dni', - 'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => 'Zmiany według statusu z ostatnich 7 dni', - 'Tickets:Related:OpenChanges' => 'Otwarte zmiany', - 'Tickets:Related:RecentChanges' => 'Ostatnie zmiany (72h)', -)); - -// Dictionnay conventions -// Class: -// Class:+ -// Class:/Attribute: -// Class:/Attribute:+ -// Class:/Attribute:/Value: -// Class:/Attribute:/Value:+ -// Class:/Stimulus: -// Class:/Stimulus:+ - - -// -// Class: Change -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:Change' => 'Zmiana', - 'Class:Change+' => '', - 'Class:Change/Attribute:status' => 'Status', - 'Class:Change/Attribute:status+' => '', - 'Class:Change/Attribute:status/Value:new' => 'Nowa', - 'Class:Change/Attribute:status/Value:new+' => '', - 'Class:Change/Attribute:status/Value:assigned' => 'Przydzielona', - 'Class:Change/Attribute:status/Value:assigned+' => '', - 'Class:Change/Attribute:status/Value:planned' => 'Planowana', - 'Class:Change/Attribute:status/Value:planned+' => '', - 'Class:Change/Attribute:status/Value:rejected' => 'Odrzucona', - 'Class:Change/Attribute:status/Value:rejected+' => '', - 'Class:Change/Attribute:status/Value:approved' => 'Zatwierdzona', - 'Class:Change/Attribute:status/Value:approved+' => '', - 'Class:Change/Attribute:status/Value:closed' => 'Zamknięta', - 'Class:Change/Attribute:status/Value:closed+' => '', - 'Class:Change/Attribute:category' => 'Category', - 'Class:Change/Attribute:category+' => '', - 'Class:Change/Attribute:category/Value:application' => 'aplikacja', - 'Class:Change/Attribute:category/Value:application+' => 'aplikacja', - 'Class:Change/Attribute:category/Value:hardware' => 'sprzęt komputerowy', - 'Class:Change/Attribute:category/Value:hardware+' => 'sprzęt komputerowy', - 'Class:Change/Attribute:category/Value:network' => 'sieć', - 'Class:Change/Attribute:category/Value:network+' => 'sieć', - 'Class:Change/Attribute:category/Value:other' => 'inne', - 'Class:Change/Attribute:category/Value:other+' => 'inne', - 'Class:Change/Attribute:category/Value:software' => 'oprogramowanie', - 'Class:Change/Attribute:category/Value:software+' => 'oprogramowanie', - 'Class:Change/Attribute:category/Value:system' => 'system', - 'Class:Change/Attribute:category/Value:system+' => 'system', - 'Class:Change/Attribute:reject_reason' => 'Powód odrzucenia', - 'Class:Change/Attribute:reject_reason+' => '', - 'Class:Change/Attribute:changemanager_id' => 'Menedżer zmiany', - 'Class:Change/Attribute:changemanager_id+' => '', - 'Class:Change/Attribute:changemanager_email' => 'E-mail menedżera zmiany', - 'Class:Change/Attribute:changemanager_email+' => '', - 'Class:Change/Attribute:parent_id' => 'Zmiana Åŗródłowa', - 'Class:Change/Attribute:parent_id+' => '', - 'Class:Change/Attribute:parent_name' => 'Zmiana Åŗródłowa', - 'Class:Change/Attribute:parent_name+' => '', - 'Class:Change/Attribute:creation_date' => 'Data utworzenia', - 'Class:Change/Attribute:creation_date+' => '', - 'Class:Change/Attribute:approval_date' => 'Data zatwierdzenia', - 'Class:Change/Attribute:approval_date+' => '', - 'Class:Change/Attribute:fallback_plan' => 'Plan awaryjny', - 'Class:Change/Attribute:fallback_plan+' => '', - 'Class:Change/Attribute:related_request_list' => 'Powiązane wnioski', - 'Class:Change/Attribute:related_request_list+' => 'Wszystkie prośby użytkowników powiązane z tą zmianą', - 'Class:Change/Attribute:related_incident_list' => 'Powiązane incydenty', - 'Class:Change/Attribute:related_incident_list+' => 'Wszystkie incydenty związane z tą zmianą', - 'Class:Change/Attribute:related_problems_list' => 'Powiązane problemy', - 'Class:Change/Attribute:related_problems_list+' => 'Wszystkie problemy związane z tą zmianą', - 'Class:Change/Attribute:child_changes_list' => 'Zmiany zależne', - 'Class:Change/Attribute:child_changes_list+' => 'Wszystkie zmiany podrzędne powiązane z tą zmianą', - 'Class:Change/Attribute:parent_id_friendlyname' => 'Przyjazna nazwa zmiany Åŗródłowej', - 'Class:Change/Attribute:parent_id_friendlyname+' => '', - 'Class:Change/Stimulus:ev_assign' => 'Przydzielona', - 'Class:Change/Stimulus:ev_assign+' => '', - 'Class:Change/Stimulus:ev_plan' => 'Zaplanowana', - 'Class:Change/Stimulus:ev_plan+' => '', - 'Class:Change/Stimulus:ev_reject' => 'Odrzuona', - 'Class:Change/Stimulus:ev_reject+' => '', - 'Class:Change/Stimulus:ev_reopen' => 'Wznowiona', - 'Class:Change/Stimulus:ev_reopen+' => '', - 'Class:Change/Stimulus:ev_approve' => 'Zatwierdona', - 'Class:Change/Stimulus:ev_approve+' => '', - 'Class:Change/Stimulus:ev_finish' => 'Zamknięta', - 'Class:Change/Stimulus:ev_finish+' => '', - 'Class:Change/Attribute:outage' => 'Awaria', - 'Class:Change/Attribute:outage+' => '', - 'Class:Change/Attribute:outage/Value:no' => 'Nie', - 'Class:Change/Attribute:outage/Value:no+' => '', - 'Class:Change/Attribute:outage/Value:yes' => 'Tak', - 'Class:Change/Attribute:outage/Value:yes+' => '', -)); + + */ + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Menu:ChangeManagement' => 'Zarządzanie zmianami', + 'Menu:Change:Overview' => 'Przegląd', + 'Menu:Change:Overview+' => '', + 'Menu:NewChange' => 'Nowa zmiana', + 'Menu:NewChange+' => 'Utwórz nowe zgłoszenie zmiany', + 'Menu:SearchChanges' => 'Szukaj zmian', + 'Menu:SearchChanges+' => 'Szukaj zgłoszeń zmian', + 'Menu:Change:Shortcuts' => 'Skróty', + 'Menu:Change:Shortcuts+' => '', + 'Menu:WaitingAcceptance' => 'Zmiany do akceptacji', + 'Menu:WaitingAcceptance+' => '', + 'Menu:WaitingApproval' => 'Zmiany do zatwierdzenia', + 'Menu:WaitingApproval+' => '', + 'Menu:Changes' => 'Otwarte zmiany', + 'Menu:Changes+' => 'Wszystkie otwarte zmiany', + 'Menu:MyChanges' => 'Zmiany przypisane do mnie', + 'Menu:MyChanges+' => 'Zmiany przypisane do mnie (jako Agent)', + 'UI-ChangeManagementOverview-ChangeByCategory-last-7-days' => 'Zmiany według kategorii w ciągu ostatnich 7 dni', + 'UI-ChangeManagementOverview-Last-7-days' => 'Liczba zmian w ciągu ostatnich 7 dni', + 'UI-ChangeManagementOverview-ChangeByDomain-last-7-days' => 'Zmiany według domeny w ciągu ostatnich 7 dni', + 'UI-ChangeManagementOverview-ChangeByStatus-last-7-days' => 'Zmiany według statusu z ostatnich 7 dni', + 'Tickets:Related:OpenChanges' => 'Otwarte zmiany', + 'Tickets:Related:RecentChanges' => 'Ostatnie zmiany (72h)', +)); + +// Dictionnay conventions +// Class: +// Class:+ +// Class:/Attribute: +// Class:/Attribute:+ +// Class:/Attribute:/Value: +// Class:/Attribute:/Value:+ +// Class:/Stimulus: +// Class:/Stimulus:+ + + +// +// Class: Change +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:Change' => 'Zmiana', + 'Class:Change+' => '', + 'Class:Change/Attribute:status' => 'Status', + 'Class:Change/Attribute:status+' => '', + 'Class:Change/Attribute:status/Value:new' => 'Nowa', + 'Class:Change/Attribute:status/Value:new+' => '', + 'Class:Change/Attribute:status/Value:assigned' => 'Przydzielona', + 'Class:Change/Attribute:status/Value:assigned+' => '', + 'Class:Change/Attribute:status/Value:planned' => 'Planowana', + 'Class:Change/Attribute:status/Value:planned+' => '', + 'Class:Change/Attribute:status/Value:rejected' => 'Odrzucona', + 'Class:Change/Attribute:status/Value:rejected+' => '', + 'Class:Change/Attribute:status/Value:approved' => 'Zatwierdzona', + 'Class:Change/Attribute:status/Value:approved+' => '', + 'Class:Change/Attribute:status/Value:closed' => 'Zamknięta', + 'Class:Change/Attribute:status/Value:closed+' => '', + 'Class:Change/Attribute:category' => 'Category', + 'Class:Change/Attribute:category+' => '', + 'Class:Change/Attribute:category/Value:application' => 'aplikacja', + 'Class:Change/Attribute:category/Value:application+' => 'aplikacja', + 'Class:Change/Attribute:category/Value:hardware' => 'sprzęt komputerowy', + 'Class:Change/Attribute:category/Value:hardware+' => 'sprzęt komputerowy', + 'Class:Change/Attribute:category/Value:network' => 'sieć', + 'Class:Change/Attribute:category/Value:network+' => 'sieć', + 'Class:Change/Attribute:category/Value:other' => 'inne', + 'Class:Change/Attribute:category/Value:other+' => 'inne', + 'Class:Change/Attribute:category/Value:software' => 'oprogramowanie', + 'Class:Change/Attribute:category/Value:software+' => 'oprogramowanie', + 'Class:Change/Attribute:category/Value:system' => 'system', + 'Class:Change/Attribute:category/Value:system+' => 'system', + 'Class:Change/Attribute:reject_reason' => 'Powód odrzucenia', + 'Class:Change/Attribute:reject_reason+' => '', + 'Class:Change/Attribute:changemanager_id' => 'Menedżer zmiany', + 'Class:Change/Attribute:changemanager_id+' => '', + 'Class:Change/Attribute:changemanager_email' => 'E-mail menedżera zmiany', + 'Class:Change/Attribute:changemanager_email+' => '', + 'Class:Change/Attribute:parent_id' => 'Zmiana Åŗródłowa', + 'Class:Change/Attribute:parent_id+' => '', + 'Class:Change/Attribute:parent_name' => 'Zmiana Åŗródłowa', + 'Class:Change/Attribute:parent_name+' => '', + 'Class:Change/Attribute:creation_date' => 'Data utworzenia', + 'Class:Change/Attribute:creation_date+' => '', + 'Class:Change/Attribute:approval_date' => 'Data zatwierdzenia', + 'Class:Change/Attribute:approval_date+' => '', + 'Class:Change/Attribute:fallback_plan' => 'Plan awaryjny', + 'Class:Change/Attribute:fallback_plan+' => '', + 'Class:Change/Attribute:related_request_list' => 'Powiązane wnioski', + 'Class:Change/Attribute:related_request_list+' => 'Wszystkie prośby użytkowników powiązane z tą zmianą', + 'Class:Change/Attribute:related_incident_list' => 'Powiązane incydenty', + 'Class:Change/Attribute:related_incident_list+' => 'Wszystkie incydenty związane z tą zmianą', + 'Class:Change/Attribute:related_problems_list' => 'Powiązane problemy', + 'Class:Change/Attribute:related_problems_list+' => 'Wszystkie problemy związane z tą zmianą', + 'Class:Change/Attribute:child_changes_list' => 'Zmiany zależne', + 'Class:Change/Attribute:child_changes_list+' => 'Wszystkie zmiany podrzędne powiązane z tą zmianą', + 'Class:Change/Attribute:parent_id_friendlyname' => 'Przyjazna nazwa zmiany Åŗródłowej', + 'Class:Change/Attribute:parent_id_friendlyname+' => '', + 'Class:Change/Stimulus:ev_assign' => 'Przydzielona', + 'Class:Change/Stimulus:ev_assign+' => '', + 'Class:Change/Stimulus:ev_plan' => 'Zaplanowana', + 'Class:Change/Stimulus:ev_plan+' => '', + 'Class:Change/Stimulus:ev_reject' => 'Odrzuona', + 'Class:Change/Stimulus:ev_reject+' => '', + 'Class:Change/Stimulus:ev_reopen' => 'Wznowiona', + 'Class:Change/Stimulus:ev_reopen+' => '', + 'Class:Change/Stimulus:ev_approve' => 'Zatwierdona', + 'Class:Change/Stimulus:ev_approve+' => '', + 'Class:Change/Stimulus:ev_finish' => 'Zamknięta', + 'Class:Change/Stimulus:ev_finish+' => '', + 'Class:Change/Attribute:outage' => 'Awaria', + 'Class:Change/Attribute:outage+' => '', + 'Class:Change/Attribute:outage/Value:no' => 'Nie', + 'Class:Change/Attribute:outage/Value:no+' => '', + 'Class:Change/Attribute:outage/Value:yes' => 'Tak', + 'Class:Change/Attribute:outage/Value:yes+' => '', +)); diff --git a/datamodels/2.x/itop-config-mgmt/dictionaries/pl.dict.itop-config-mgmt.php b/datamodels/2.x/itop-config-mgmt/dictionaries/pl.dict.itop-config-mgmt.php index b5c7f304c..fa8e46ab6 100644 --- a/datamodels/2.x/itop-config-mgmt/dictionaries/pl.dict.itop-config-mgmt.php +++ b/datamodels/2.x/itop-config-mgmt/dictionaries/pl.dict.itop-config-mgmt.php @@ -1,24 +1,24 @@ +/** + * Localized data + * + * @copyright Copyright (C) 2010-2018 Combodo SARL + * @license http://opensource.org/licenses/AGPL-3.0 + * + * 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 */ ////////////////////////////////////////////////////////////////////// // Relations diff --git a/datamodels/2.x/itop-config/dictionaries/pl.dict.itop-config.php b/datamodels/2.x/itop-config/dictionaries/pl.dict.itop-config.php index fdef4e938..a059cc4ce 100644 --- a/datamodels/2.x/itop-config/dictionaries/pl.dict.itop-config.php +++ b/datamodels/2.x/itop-config/dictionaries/pl.dict.itop-config.php @@ -1,39 +1,39 @@ - - */ - -Dict::Add('PL PL', 'Polish', 'Polski', array( - - 'Menu:ConfigEditor' => 'Konfiguracja ogólna', - 'config-edit-title' => 'Edycja pliku konfiguracyjnego', - 'config-edit-intro' => 'Zachowaj ostrożność podczas edycji pliku konfiguracyjnego.', - 'config-apply' => 'Zastosuj', - 'config-apply-title' => 'Zastosuj (Ctrl+S)', - 'config-cancel' => 'Reset', - 'config-saved' => 'Zapisano pomyślnie.', - 'config-confirm-cancel' => 'Twoje zmiany zostaną utracone.', - 'config-no-change' => 'Brak zmian: plik pozostał niezmieniony.', - 'config-reverted' => 'Konfiguracja została przywrócona.', - 'config-parse-error' => 'Linia %2$d: %1$s.
Plik NIE został zaktualizowany.', - 'config-current-line' => 'Edycja linii: %1$s', - 'config-saved-warning-db-password' => 'Zapisano pomyślnie, ale kopia zapasowa nie działa z powodu nieobsługiwanych znaków w haśle bazy danych.', -)); + + */ + +Dict::Add('PL PL', 'Polish', 'Polski', array( + + 'Menu:ConfigEditor' => 'Konfiguracja ogólna', + 'config-edit-title' => 'Edycja pliku konfiguracyjnego', + 'config-edit-intro' => 'Zachowaj ostrożność podczas edycji pliku konfiguracyjnego.', + 'config-apply' => 'Zastosuj', + 'config-apply-title' => 'Zastosuj (Ctrl+S)', + 'config-cancel' => 'Reset', + 'config-saved' => 'Zapisano pomyślnie.', + 'config-confirm-cancel' => 'Twoje zmiany zostaną utracone.', + 'config-no-change' => 'Brak zmian: plik pozostał niezmieniony.', + 'config-reverted' => 'Konfiguracja została przywrócona.', + 'config-parse-error' => 'Linia %2$d: %1$s.
Plik NIE został zaktualizowany.', + 'config-current-line' => 'Edycja linii: %1$s', + 'config-saved-warning-db-password' => 'Zapisano pomyślnie, ale kopia zapasowa nie działa z powodu nieobsługiwanych znaków w haśle bazy danych.', +)); diff --git a/datamodels/2.x/itop-faq-light/dictionaries/pl.dict.itop-faq-light.php b/datamodels/2.x/itop-faq-light/dictionaries/pl.dict.itop-faq-light.php index 2131311e3..710aab598 100644 --- a/datamodels/2.x/itop-faq-light/dictionaries/pl.dict.itop-faq-light.php +++ b/datamodels/2.x/itop-faq-light/dictionaries/pl.dict.itop-faq-light.php @@ -1,96 +1,96 @@ - - */ - -// Dictionnay conventions -// Class: -// Class:+ -// Class:/Attribute: -// Class:/Attribute:+ -// Class:/Attribute:/Value: -// Class:/Attribute:/Value:+ -// Class:/Stimulus: -// Class:/Stimulus:+ - -////////////////////////////////////////////////////////////////////// -// Classes in 'bizmodel' -////////////////////////////////////////////////////////////////////// -// - -// Dictionnay conventions -// Class: -// Class:+ -// Class:/Attribute: -// Class:/Attribute:+ -// Class:/Attribute:/Value: -// Class:/Attribute:/Value:+ -// Class:/Stimulus: -// Class:/Stimulus:+ - -// -// Class: FAQ -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:FAQ' => 'Pytania FAQ', - 'Class:FAQ+' => 'Często Zadawane Pytania', - 'Class:FAQ/Attribute:title' => 'Tytuł', - 'Class:FAQ/Attribute:title+' => '', - 'Class:FAQ/Attribute:summary' => 'Podsumowanie', - 'Class:FAQ/Attribute:summary+' => '', - 'Class:FAQ/Attribute:description' => 'Opis', - 'Class:FAQ/Attribute:description+' => '', - 'Class:FAQ/Attribute:category_id' => 'Kategoria', - 'Class:FAQ/Attribute:category_id+' => '', - 'Class:FAQ/Attribute:category_name' => 'Nazwa kategorii', - 'Class:FAQ/Attribute:category_name+' => '', - 'Class:FAQ/Attribute:error_code' => 'Kod błędu', - 'Class:FAQ/Attribute:error_code+' => '', - 'Class:FAQ/Attribute:key_words' => 'Słowa kluczowe', - 'Class:FAQ/Attribute:key_words+' => '', - 'Class:FAQ/Attribute:domains' => 'Domeny', -)); - -// -// Class: FAQCategory -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:FAQCategory' => 'Kategoria FAQ', - 'Class:FAQCategory+' => 'Kategoria FAQ', - 'Class:FAQCategory/Attribute:name' => 'Nazwa', - 'Class:FAQCategory/Attribute:name+' => '', - 'Class:FAQCategory/Attribute:faq_list' => 'Pytania FAQ', - 'Class:FAQCategory/Attribute:faq_list+' => 'Wszystkie najczęściej zadawane pytania związane z tą kategorią', -)); -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Menu:ProblemManagement' => 'Zarządzanie problemami', - 'Menu:ProblemManagement+' => 'Zarządzanie problemami', - 'Menu:Problem:Shortcuts' => 'Skróty', - 'Menu:FAQCategory' => 'Kategorie pytań FAQ', - 'Menu:FAQCategory+' => 'Wszystkie kategorie pytań FAQ', - 'Menu:FAQ' => 'Pytania FAQ', - 'Menu:FAQ+' => 'Wszystkie pytania FAQ', - 'Brick:Portal:FAQ:Menu' => 'Pytania FAQ', - 'Brick:Portal:FAQ:Title' => 'Często Zadawane Pytania', - 'Brick:Portal:FAQ:Title+' => '

W pośpiechu?

SprawdÅŗ listę najczęściej zadawanych pytań i (być może) od razu znajdÅŗ oczekiwaną odpowiedÅŗ.

', -)); + + */ + +// Dictionnay conventions +// Class: +// Class:+ +// Class:/Attribute: +// Class:/Attribute:+ +// Class:/Attribute:/Value: +// Class:/Attribute:/Value:+ +// Class:/Stimulus: +// Class:/Stimulus:+ + +////////////////////////////////////////////////////////////////////// +// Classes in 'bizmodel' +////////////////////////////////////////////////////////////////////// +// + +// Dictionnay conventions +// Class: +// Class:+ +// Class:/Attribute: +// Class:/Attribute:+ +// Class:/Attribute:/Value: +// Class:/Attribute:/Value:+ +// Class:/Stimulus: +// Class:/Stimulus:+ + +// +// Class: FAQ +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:FAQ' => 'Pytania FAQ', + 'Class:FAQ+' => 'Często Zadawane Pytania', + 'Class:FAQ/Attribute:title' => 'Tytuł', + 'Class:FAQ/Attribute:title+' => '', + 'Class:FAQ/Attribute:summary' => 'Podsumowanie', + 'Class:FAQ/Attribute:summary+' => '', + 'Class:FAQ/Attribute:description' => 'Opis', + 'Class:FAQ/Attribute:description+' => '', + 'Class:FAQ/Attribute:category_id' => 'Kategoria', + 'Class:FAQ/Attribute:category_id+' => '', + 'Class:FAQ/Attribute:category_name' => 'Nazwa kategorii', + 'Class:FAQ/Attribute:category_name+' => '', + 'Class:FAQ/Attribute:error_code' => 'Kod błędu', + 'Class:FAQ/Attribute:error_code+' => '', + 'Class:FAQ/Attribute:key_words' => 'Słowa kluczowe', + 'Class:FAQ/Attribute:key_words+' => '', + 'Class:FAQ/Attribute:domains' => 'Domeny', +)); + +// +// Class: FAQCategory +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:FAQCategory' => 'Kategoria FAQ', + 'Class:FAQCategory+' => 'Kategoria FAQ', + 'Class:FAQCategory/Attribute:name' => 'Nazwa', + 'Class:FAQCategory/Attribute:name+' => '', + 'Class:FAQCategory/Attribute:faq_list' => 'Pytania FAQ', + 'Class:FAQCategory/Attribute:faq_list+' => 'Wszystkie najczęściej zadawane pytania związane z tą kategorią', +)); +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Menu:ProblemManagement' => 'Zarządzanie problemami', + 'Menu:ProblemManagement+' => 'Zarządzanie problemami', + 'Menu:Problem:Shortcuts' => 'Skróty', + 'Menu:FAQCategory' => 'Kategorie pytań FAQ', + 'Menu:FAQCategory+' => 'Wszystkie kategorie pytań FAQ', + 'Menu:FAQ' => 'Pytania FAQ', + 'Menu:FAQ+' => 'Wszystkie pytania FAQ', + 'Brick:Portal:FAQ:Menu' => 'Pytania FAQ', + 'Brick:Portal:FAQ:Title' => 'Często Zadawane Pytania', + 'Brick:Portal:FAQ:Title+' => '

W pośpiechu?

SprawdÅŗ listę najczęściej zadawanych pytań i (być może) od razu znajdÅŗ oczekiwaną odpowiedÅŗ.

', +)); diff --git a/datamodels/2.x/itop-incident-mgmt-itil/dictionaries/pl.dict.itop-incident-mgmt-itil.php b/datamodels/2.x/itop-incident-mgmt-itil/dictionaries/pl.dict.itop-incident-mgmt-itil.php index 074349568..903ef7830 100644 --- a/datamodels/2.x/itop-incident-mgmt-itil/dictionaries/pl.dict.itop-incident-mgmt-itil.php +++ b/datamodels/2.x/itop-incident-mgmt-itil/dictionaries/pl.dict.itop-incident-mgmt-itil.php @@ -1,239 +1,239 @@ - - */ - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Menu:IncidentManagement' => 'Zarządzanie incydentami', - 'Menu:IncidentManagement+' => 'Zarządzanie incydentami', - 'Menu:Incident:Overview' => 'Przegląd', - 'Menu:Incident:Overview+' => 'Przegląd', - 'Menu:NewIncident' => 'Nowy incydent', - 'Menu:NewIncident+' => 'Utwórz nowe zgłoszenie incydentu', - 'Menu:SearchIncidents' => 'Szukaj incydentów', - 'Menu:SearchIncidents+' => 'Szukaj zgłoszeń incydentów', - 'Menu:Incident:Shortcuts' => 'Skróty', - 'Menu:Incident:Shortcuts+' => '', - 'Menu:Incident:MyIncidents' => 'Incydenty przypisane do mnie', - 'Menu:Incident:MyIncidents+' => 'Incydenty przypisane do mnie (jako Agent)', - 'Menu:Incident:EscalatedIncidents' => 'Pilne incydenty', - 'Menu:Incident:EscalatedIncidents+' => 'Pilne incydenty', - 'Menu:Incident:OpenIncidents' => 'Wszystkie otwarte incydenty', - 'Menu:Incident:OpenIncidents+' => 'Wszystkie otwarte incydenty', - 'UI-IncidentManagementOverview-IncidentByPriority-last-14-days' => 'Incydenty z ostatnich 14 dni według priorytetu', - 'UI-IncidentManagementOverview-Last-14-days' => 'Liczba incydentów z ostatnich 14 dni', - 'UI-IncidentManagementOverview-OpenIncidentByStatus' => 'Otwarte incydenty według statusu', - 'UI-IncidentManagementOverview-OpenIncidentByAgent' => 'Otwarte incydenty według agenta', - 'UI-IncidentManagementOverview-OpenIncidentByCustomer' => 'Otwarte incydenty według klienta', -)); - - -// Dictionnay conventions -// Class: -// Class:+ -// Class:/Attribute: -// Class:/Attribute:+ -// Class:/Attribute:/Value: -// Class:/Attribute:/Value:+ -// Class:/Stimulus: -// Class:/Stimulus:+ - -// -// Class: Incident -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:Incident' => 'Incydent', - 'Class:Incident+' => '', - 'Class:Incident/Attribute:status' => 'Status', - 'Class:Incident/Attribute:status+' => '', - 'Class:Incident/Attribute:status/Value:new' => 'Nowy', - 'Class:Incident/Attribute:status/Value:new+' => '', - 'Class:Incident/Attribute:status/Value:escalated_tto' => 'Pilny czas podjęcia', - 'Class:Incident/Attribute:status/Value:escalated_tto+' => '', - 'Class:Incident/Attribute:status/Value:assigned' => 'Przypisany', - 'Class:Incident/Attribute:status/Value:assigned+' => '', - 'Class:Incident/Attribute:status/Value:escalated_ttr' => 'Pilny czas rozwiązania', - 'Class:Incident/Attribute:status/Value:escalated_ttr+' => '', - 'Class:Incident/Attribute:status/Value:waiting_for_approval' => 'Oczekujący', - 'Class:Incident/Attribute:status/Value:waiting_for_approval+' => '', - 'Class:Incident/Attribute:status/Value:pending' => 'Trwający', - 'Class:Incident/Attribute:status/Value:pending+' => '', - 'Class:Incident/Attribute:status/Value:resolved' => 'Rozwiązany', - 'Class:Incident/Attribute:status/Value:resolved+' => '', - 'Class:Incident/Attribute:status/Value:closed' => 'Zamknięty', - 'Class:Incident/Attribute:status/Value:closed+' => '', - 'Class:Incident/Attribute:impact' => 'Wpływ', - 'Class:Incident/Attribute:impact+' => '', - 'Class:Incident/Attribute:impact/Value:1' => 'Wydział', - 'Class:Incident/Attribute:impact/Value:1+' => '', - 'Class:Incident/Attribute:impact/Value:2' => 'Usługa', - 'Class:Incident/Attribute:impact/Value:2+' => '', - 'Class:Incident/Attribute:impact/Value:3' => 'Osoba', - 'Class:Incident/Attribute:impact/Value:3+' => '', - 'Class:Incident/Attribute:priority' => 'Priorytet', - 'Class:Incident/Attribute:priority+' => '', - 'Class:Incident/Attribute:priority/Value:1' => 'krytyczny', - 'Class:Incident/Attribute:priority/Value:1+' => 'krytyczny', - 'Class:Incident/Attribute:priority/Value:2' => 'wysoki', - 'Class:Incident/Attribute:priority/Value:2+' => 'wysoki', - 'Class:Incident/Attribute:priority/Value:3' => 'średni', - 'Class:Incident/Attribute:priority/Value:3+' => 'średni', - 'Class:Incident/Attribute:priority/Value:4' => 'niski', - 'Class:Incident/Attribute:priority/Value:4+' => 'niski', - 'Class:Incident/Attribute:urgency' => 'Pilność', - 'Class:Incident/Attribute:urgency+' => '', - 'Class:Incident/Attribute:urgency/Value:1' => 'krytyczna', - 'Class:Incident/Attribute:urgency/Value:1+' => 'krytyczna', - 'Class:Incident/Attribute:urgency/Value:2' => 'wysoka', - 'Class:Incident/Attribute:urgency/Value:2+' => 'wysoka', - 'Class:Incident/Attribute:urgency/Value:3' => 'średnia', - 'Class:Incident/Attribute:urgency/Value:3+' => 'średnia', - 'Class:Incident/Attribute:urgency/Value:4' => 'niska', - 'Class:Incident/Attribute:urgency/Value:4+' => 'niska', - 'Class:Incident/Attribute:origin' => 'Pochodzenie', - 'Class:Incident/Attribute:origin+' => '', - 'Class:Incident/Attribute:origin/Value:mail' => 'e-mail', - 'Class:Incident/Attribute:origin/Value:mail+' => 'e-mail', - 'Class:Incident/Attribute:origin/Value:monitoring' => 'monitoring', - 'Class:Incident/Attribute:origin/Value:monitoring+' => 'monitoring', - 'Class:Incident/Attribute:origin/Value:phone' => 'telefon', - 'Class:Incident/Attribute:origin/Value:phone+' => 'telefon', - 'Class:Incident/Attribute:origin/Value:portal' => 'portal', - 'Class:Incident/Attribute:origin/Value:portal+' => 'portal', - 'Class:Incident/Attribute:service_id' => 'Usługa', - 'Class:Incident/Attribute:service_id+' => '', - 'Class:Incident/Attribute:service_name' => 'Nazwa usługi', - 'Class:Incident/Attribute:service_name+' => '', - 'Class:Incident/Attribute:servicesubcategory_id' => 'Podkategoria usługi', - 'Class:Incident/Attribute:servicesubcategory_id+' => '', - 'Class:Incident/Attribute:servicesubcategory_name' => 'Nazwa podkategorii usługi', - 'Class:Incident/Attribute:servicesubcategory_name+' => '', - 'Class:Incident/Attribute:escalation_flag' => 'Flaga - Ważny', - 'Class:Incident/Attribute:escalation_flag+' => '', - 'Class:Incident/Attribute:escalation_flag/Value:no' => 'Nie', - 'Class:Incident/Attribute:escalation_flag/Value:no+' => 'Nie', - 'Class:Incident/Attribute:escalation_flag/Value:yes' => 'Tak', - 'Class:Incident/Attribute:escalation_flag/Value:yes+' => 'Tak', - 'Class:Incident/Attribute:escalation_reason' => 'Powód - Ważny', - 'Class:Incident/Attribute:escalation_reason+' => '', - 'Class:Incident/Attribute:assignment_date' => 'Data przydziału', - 'Class:Incident/Attribute:assignment_date+' => '', - 'Class:Incident/Attribute:resolution_date' => 'Data rozwiązania', - 'Class:Incident/Attribute:resolution_date+' => '', - 'Class:Incident/Attribute:last_pending_date' => 'Ostatnia data trwania', - 'Class:Incident/Attribute:last_pending_date+' => '', - 'Class:Incident/Attribute:cumulatedpending' => 'Skumulowany czas trwania', - 'Class:Incident/Attribute:cumulatedpending+' => '', - 'Class:Incident/Attribute:tto' => 'czas na podjęcie (TTO)', - 'Class:Incident/Attribute:tto+' => '', - 'Class:Incident/Attribute:ttr' => 'czas na rozwiązanie (TTR)', - 'Class:Incident/Attribute:ttr+' => '', - 'Class:Incident/Attribute:tto_escalation_deadline' => 'Ostateczny termin podjęcia (TTO)', - 'Class:Incident/Attribute:tto_escalation_deadline+' => '', - 'Class:Incident/Attribute:sla_tto_passed' => 'Gwarantowany czas podjęcia (SLA tto) zaliczony', - 'Class:Incident/Attribute:sla_tto_passed+' => '', - 'Class:Incident/Attribute:sla_tto_over' => 'Gwarantowany czas podjęcia (SLA tto) skończył się', - 'Class:Incident/Attribute:sla_tto_over+' => '', - 'Class:Incident/Attribute:ttr_escalation_deadline' => 'Ostateczny termin rozwiązania TTR', - 'Class:Incident/Attribute:ttr_escalation_deadline+' => '', - 'Class:Incident/Attribute:sla_ttr_passed' => 'Gwarantowany czas rozwiązania (SLA ttr) zaliczony', - 'Class:Incident/Attribute:sla_ttr_passed+' => '', - 'Class:Incident/Attribute:sla_ttr_over' => 'Gwarantowany czas rozwiązania (SLA ttr) skończył się', - 'Class:Incident/Attribute:sla_ttr_over+' => '', - 'Class:Incident/Attribute:time_spent' => 'Opóźnienie rozwiązania', - 'Class:Incident/Attribute:time_spent+' => '', - 'Class:Incident/Attribute:resolution_code' => 'Kod rozwiązania', - 'Class:Incident/Attribute:resolution_code+' => '', - 'Class:Incident/Attribute:resolution_code/Value:assistance' => 'wsparcie', - 'Class:Incident/Attribute:resolution_code/Value:assistance+' => 'wsparcie', - 'Class:Incident/Attribute:resolution_code/Value:bug fixed' => 'usterka naprawiona', - 'Class:Incident/Attribute:resolution_code/Value:bug fixed+' => 'usterka naprawiona', - 'Class:Incident/Attribute:resolution_code/Value:hardware repair' => 'naprawa sprzętu', - 'Class:Incident/Attribute:resolution_code/Value:hardware repair+' => 'naprawa sprzętu', - 'Class:Incident/Attribute:resolution_code/Value:other' => 'inne', - 'Class:Incident/Attribute:resolution_code/Value:other+' => 'inne', - 'Class:Incident/Attribute:resolution_code/Value:software patch' => 'poprawka oprogramowania', - 'Class:Incident/Attribute:resolution_code/Value:software patch+' => 'poprawka oprogramowania', - 'Class:Incident/Attribute:resolution_code/Value:system update' => 'aktualizacja systemu', - 'Class:Incident/Attribute:resolution_code/Value:system update+' => 'aktualizacja systemu', - 'Class:Incident/Attribute:resolution_code/Value:training' => 'szkolenie', - 'Class:Incident/Attribute:resolution_code/Value:training+' => 'szkolenie', - 'Class:Incident/Attribute:solution' => 'Rozwiązanie', - 'Class:Incident/Attribute:solution+' => '', - 'Class:Incident/Attribute:pending_reason' => 'Powód oczekiwania', - 'Class:Incident/Attribute:pending_reason+' => '', - 'Class:Incident/Attribute:parent_incident_id' => 'Źródłowy incydent', - 'Class:Incident/Attribute:parent_incident_id+' => '', - 'Class:Incident/Attribute:parent_incident_ref' => 'Powiązany Åŗródłowy incydent', - 'Class:Incident/Attribute:parent_incident_ref+' => '', - 'Class:Incident/Attribute:parent_change_id' => 'Źródłowa zmiana', - 'Class:Incident/Attribute:parent_change_id+' => '', - 'Class:Incident/Attribute:parent_change_ref' => 'Powiązana Åŗródłowa zmiana', - 'Class:Incident/Attribute:parent_change_ref+' => '', - 'Class:Incident/Attribute:parent_problem_id' => 'Źródłowy problem', - 'Class:Incident/Attribute:parent_problem_id+' => '', - 'Class:Incident/Attribute:parent_problem_ref' => 'Powiązany Åŗródłowy problem', - 'Class:Incident/Attribute:parent_problem_ref+' => '', - 'Class:Incident/Attribute:related_request_list' => 'Zależne zgłoszenia', - 'Class:Incident/Attribute:related_request_list+' => '', - 'Class:Incident/Attribute:child_incidents_list' => 'Zależne incydenty', - 'Class:Incident/Attribute:child_incidents_list+' => 'Wszystkie podrzędne incydenty związane z tym incydentem', - 'Class:Incident/Attribute:public_log' => 'Dziennik publiczny', - 'Class:Incident/Attribute:public_log+' => '', - 'Class:Incident/Attribute:user_satisfaction' => 'Zadowolenie użytkownika', - 'Class:Incident/Attribute:user_satisfaction+' => '', - 'Class:Incident/Attribute:user_satisfaction/Value:1' => 'Bardzo zadowolony', - 'Class:Incident/Attribute:user_satisfaction/Value:1+' => 'Bardzo zadowolony', - 'Class:Incident/Attribute:user_satisfaction/Value:2' => 'Dość zadowolony', - 'Class:Incident/Attribute:user_satisfaction/Value:2+' => 'Dość zadowolony', - 'Class:Incident/Attribute:user_satisfaction/Value:3' => 'Raczej niezadowolony', - 'Class:Incident/Attribute:user_satisfaction/Value:3+' => 'Raczej niezadowolony', - 'Class:Incident/Attribute:user_satisfaction/Value:4' => 'Bardzo niezadowolony', - 'Class:Incident/Attribute:user_satisfaction/Value:4+' => 'Bardzo niezadowolony', - 'Class:Incident/Attribute:user_comment' => 'Komentarz użytkownika', - 'Class:Incident/Attribute:user_comment+' => '', - 'Class:Incident/Attribute:parent_incident_id_friendlyname' => 'parent_incident_id_friendlyname', - 'Class:Incident/Attribute:parent_incident_id_friendlyname+' => '', - 'Class:Incident/Stimulus:ev_assign' => 'Przydzielony', - 'Class:Incident/Stimulus:ev_assign+' => '', - 'Class:Incident/Stimulus:ev_reassign' => 'Przydzielony ponownie', - 'Class:Incident/Stimulus:ev_reassign+' => '', - 'Class:Incident/Stimulus:ev_pending' => 'Trwający', - 'Class:Incident/Stimulus:ev_pending+' => '', - 'Class:Incident/Stimulus:ev_timeout' => 'Po czasie', - 'Class:Incident/Stimulus:ev_timeout+' => '', - 'Class:Incident/Stimulus:ev_autoresolve' => 'Automatyczne rozwiązanie', - 'Class:Incident/Stimulus:ev_autoresolve+' => '', - 'Class:Incident/Stimulus:ev_autoclose' => 'Automatyczne zamknięcie', - 'Class:Incident/Stimulus:ev_autoclose+' => '', - 'Class:Incident/Stimulus:ev_resolve' => 'Oznacz jako rozwiązany', - 'Class:Incident/Stimulus:ev_resolve+' => '', - 'Class:Incident/Stimulus:ev_close' => 'Zamknij to zgłoszenie', - 'Class:Incident/Stimulus:ev_close+' => '', - 'Class:Incident/Stimulus:ev_reopen' => 'Otwórz ponownie', - 'Class:Incident/Stimulus:ev_reopen+' => '', - 'Class:Incident/Error:CannotAssignParentIncidentIdToSelf' => 'Nie można przypisać zdarzenia nadrzędnego do samego zdarzenia', - - 'Class:Incident/Method:ResolveChildTickets' => 'Rozpatrz zgłoszenia podrzędne', - 'Class:Incident/Method:ResolveChildTickets+' => 'Połącz rozwiązanie kaskadowo ze zgłoszeniem podrzędnym (ev_autoresolve) i dopasuj następujące cechy: usługa, zespół, agent, informacje o rozwiązaniu', - 'Tickets:Related:OpenIncidents' => 'Otwarte incydenty', -)); + + */ + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Menu:IncidentManagement' => 'Zarządzanie incydentami', + 'Menu:IncidentManagement+' => 'Zarządzanie incydentami', + 'Menu:Incident:Overview' => 'Przegląd', + 'Menu:Incident:Overview+' => 'Przegląd', + 'Menu:NewIncident' => 'Nowy incydent', + 'Menu:NewIncident+' => 'Utwórz nowe zgłoszenie incydentu', + 'Menu:SearchIncidents' => 'Szukaj incydentów', + 'Menu:SearchIncidents+' => 'Szukaj zgłoszeń incydentów', + 'Menu:Incident:Shortcuts' => 'Skróty', + 'Menu:Incident:Shortcuts+' => '', + 'Menu:Incident:MyIncidents' => 'Incydenty przypisane do mnie', + 'Menu:Incident:MyIncidents+' => 'Incydenty przypisane do mnie (jako Agent)', + 'Menu:Incident:EscalatedIncidents' => 'Pilne incydenty', + 'Menu:Incident:EscalatedIncidents+' => 'Pilne incydenty', + 'Menu:Incident:OpenIncidents' => 'Wszystkie otwarte incydenty', + 'Menu:Incident:OpenIncidents+' => 'Wszystkie otwarte incydenty', + 'UI-IncidentManagementOverview-IncidentByPriority-last-14-days' => 'Incydenty z ostatnich 14 dni według priorytetu', + 'UI-IncidentManagementOverview-Last-14-days' => 'Liczba incydentów z ostatnich 14 dni', + 'UI-IncidentManagementOverview-OpenIncidentByStatus' => 'Otwarte incydenty według statusu', + 'UI-IncidentManagementOverview-OpenIncidentByAgent' => 'Otwarte incydenty według agenta', + 'UI-IncidentManagementOverview-OpenIncidentByCustomer' => 'Otwarte incydenty według klienta', +)); + + +// Dictionnay conventions +// Class: +// Class:+ +// Class:/Attribute: +// Class:/Attribute:+ +// Class:/Attribute:/Value: +// Class:/Attribute:/Value:+ +// Class:/Stimulus: +// Class:/Stimulus:+ + +// +// Class: Incident +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:Incident' => 'Incydent', + 'Class:Incident+' => '', + 'Class:Incident/Attribute:status' => 'Status', + 'Class:Incident/Attribute:status+' => '', + 'Class:Incident/Attribute:status/Value:new' => 'Nowy', + 'Class:Incident/Attribute:status/Value:new+' => '', + 'Class:Incident/Attribute:status/Value:escalated_tto' => 'Pilny czas podjęcia', + 'Class:Incident/Attribute:status/Value:escalated_tto+' => '', + 'Class:Incident/Attribute:status/Value:assigned' => 'Przypisany', + 'Class:Incident/Attribute:status/Value:assigned+' => '', + 'Class:Incident/Attribute:status/Value:escalated_ttr' => 'Pilny czas rozwiązania', + 'Class:Incident/Attribute:status/Value:escalated_ttr+' => '', + 'Class:Incident/Attribute:status/Value:waiting_for_approval' => 'Oczekujący', + 'Class:Incident/Attribute:status/Value:waiting_for_approval+' => '', + 'Class:Incident/Attribute:status/Value:pending' => 'Trwający', + 'Class:Incident/Attribute:status/Value:pending+' => '', + 'Class:Incident/Attribute:status/Value:resolved' => 'Rozwiązany', + 'Class:Incident/Attribute:status/Value:resolved+' => '', + 'Class:Incident/Attribute:status/Value:closed' => 'Zamknięty', + 'Class:Incident/Attribute:status/Value:closed+' => '', + 'Class:Incident/Attribute:impact' => 'Wpływ', + 'Class:Incident/Attribute:impact+' => '', + 'Class:Incident/Attribute:impact/Value:1' => 'Wydział', + 'Class:Incident/Attribute:impact/Value:1+' => '', + 'Class:Incident/Attribute:impact/Value:2' => 'Usługa', + 'Class:Incident/Attribute:impact/Value:2+' => '', + 'Class:Incident/Attribute:impact/Value:3' => 'Osoba', + 'Class:Incident/Attribute:impact/Value:3+' => '', + 'Class:Incident/Attribute:priority' => 'Priorytet', + 'Class:Incident/Attribute:priority+' => '', + 'Class:Incident/Attribute:priority/Value:1' => 'krytyczny', + 'Class:Incident/Attribute:priority/Value:1+' => 'krytyczny', + 'Class:Incident/Attribute:priority/Value:2' => 'wysoki', + 'Class:Incident/Attribute:priority/Value:2+' => 'wysoki', + 'Class:Incident/Attribute:priority/Value:3' => 'średni', + 'Class:Incident/Attribute:priority/Value:3+' => 'średni', + 'Class:Incident/Attribute:priority/Value:4' => 'niski', + 'Class:Incident/Attribute:priority/Value:4+' => 'niski', + 'Class:Incident/Attribute:urgency' => 'Pilność', + 'Class:Incident/Attribute:urgency+' => '', + 'Class:Incident/Attribute:urgency/Value:1' => 'krytyczna', + 'Class:Incident/Attribute:urgency/Value:1+' => 'krytyczna', + 'Class:Incident/Attribute:urgency/Value:2' => 'wysoka', + 'Class:Incident/Attribute:urgency/Value:2+' => 'wysoka', + 'Class:Incident/Attribute:urgency/Value:3' => 'średnia', + 'Class:Incident/Attribute:urgency/Value:3+' => 'średnia', + 'Class:Incident/Attribute:urgency/Value:4' => 'niska', + 'Class:Incident/Attribute:urgency/Value:4+' => 'niska', + 'Class:Incident/Attribute:origin' => 'Pochodzenie', + 'Class:Incident/Attribute:origin+' => '', + 'Class:Incident/Attribute:origin/Value:mail' => 'e-mail', + 'Class:Incident/Attribute:origin/Value:mail+' => 'e-mail', + 'Class:Incident/Attribute:origin/Value:monitoring' => 'monitoring', + 'Class:Incident/Attribute:origin/Value:monitoring+' => 'monitoring', + 'Class:Incident/Attribute:origin/Value:phone' => 'telefon', + 'Class:Incident/Attribute:origin/Value:phone+' => 'telefon', + 'Class:Incident/Attribute:origin/Value:portal' => 'portal', + 'Class:Incident/Attribute:origin/Value:portal+' => 'portal', + 'Class:Incident/Attribute:service_id' => 'Usługa', + 'Class:Incident/Attribute:service_id+' => '', + 'Class:Incident/Attribute:service_name' => 'Nazwa usługi', + 'Class:Incident/Attribute:service_name+' => '', + 'Class:Incident/Attribute:servicesubcategory_id' => 'Podkategoria usługi', + 'Class:Incident/Attribute:servicesubcategory_id+' => '', + 'Class:Incident/Attribute:servicesubcategory_name' => 'Nazwa podkategorii usługi', + 'Class:Incident/Attribute:servicesubcategory_name+' => '', + 'Class:Incident/Attribute:escalation_flag' => 'Flaga - Ważny', + 'Class:Incident/Attribute:escalation_flag+' => '', + 'Class:Incident/Attribute:escalation_flag/Value:no' => 'Nie', + 'Class:Incident/Attribute:escalation_flag/Value:no+' => 'Nie', + 'Class:Incident/Attribute:escalation_flag/Value:yes' => 'Tak', + 'Class:Incident/Attribute:escalation_flag/Value:yes+' => 'Tak', + 'Class:Incident/Attribute:escalation_reason' => 'Powód - Ważny', + 'Class:Incident/Attribute:escalation_reason+' => '', + 'Class:Incident/Attribute:assignment_date' => 'Data przydziału', + 'Class:Incident/Attribute:assignment_date+' => '', + 'Class:Incident/Attribute:resolution_date' => 'Data rozwiązania', + 'Class:Incident/Attribute:resolution_date+' => '', + 'Class:Incident/Attribute:last_pending_date' => 'Ostatnia data trwania', + 'Class:Incident/Attribute:last_pending_date+' => '', + 'Class:Incident/Attribute:cumulatedpending' => 'Skumulowany czas trwania', + 'Class:Incident/Attribute:cumulatedpending+' => '', + 'Class:Incident/Attribute:tto' => 'czas na podjęcie (TTO)', + 'Class:Incident/Attribute:tto+' => '', + 'Class:Incident/Attribute:ttr' => 'czas na rozwiązanie (TTR)', + 'Class:Incident/Attribute:ttr+' => '', + 'Class:Incident/Attribute:tto_escalation_deadline' => 'Ostateczny termin podjęcia (TTO)', + 'Class:Incident/Attribute:tto_escalation_deadline+' => '', + 'Class:Incident/Attribute:sla_tto_passed' => 'Gwarantowany czas podjęcia (SLA tto) zaliczony', + 'Class:Incident/Attribute:sla_tto_passed+' => '', + 'Class:Incident/Attribute:sla_tto_over' => 'Gwarantowany czas podjęcia (SLA tto) skończył się', + 'Class:Incident/Attribute:sla_tto_over+' => '', + 'Class:Incident/Attribute:ttr_escalation_deadline' => 'Ostateczny termin rozwiązania TTR', + 'Class:Incident/Attribute:ttr_escalation_deadline+' => '', + 'Class:Incident/Attribute:sla_ttr_passed' => 'Gwarantowany czas rozwiązania (SLA ttr) zaliczony', + 'Class:Incident/Attribute:sla_ttr_passed+' => '', + 'Class:Incident/Attribute:sla_ttr_over' => 'Gwarantowany czas rozwiązania (SLA ttr) skończył się', + 'Class:Incident/Attribute:sla_ttr_over+' => '', + 'Class:Incident/Attribute:time_spent' => 'Opóźnienie rozwiązania', + 'Class:Incident/Attribute:time_spent+' => '', + 'Class:Incident/Attribute:resolution_code' => 'Kod rozwiązania', + 'Class:Incident/Attribute:resolution_code+' => '', + 'Class:Incident/Attribute:resolution_code/Value:assistance' => 'wsparcie', + 'Class:Incident/Attribute:resolution_code/Value:assistance+' => 'wsparcie', + 'Class:Incident/Attribute:resolution_code/Value:bug fixed' => 'usterka naprawiona', + 'Class:Incident/Attribute:resolution_code/Value:bug fixed+' => 'usterka naprawiona', + 'Class:Incident/Attribute:resolution_code/Value:hardware repair' => 'naprawa sprzętu', + 'Class:Incident/Attribute:resolution_code/Value:hardware repair+' => 'naprawa sprzętu', + 'Class:Incident/Attribute:resolution_code/Value:other' => 'inne', + 'Class:Incident/Attribute:resolution_code/Value:other+' => 'inne', + 'Class:Incident/Attribute:resolution_code/Value:software patch' => 'poprawka oprogramowania', + 'Class:Incident/Attribute:resolution_code/Value:software patch+' => 'poprawka oprogramowania', + 'Class:Incident/Attribute:resolution_code/Value:system update' => 'aktualizacja systemu', + 'Class:Incident/Attribute:resolution_code/Value:system update+' => 'aktualizacja systemu', + 'Class:Incident/Attribute:resolution_code/Value:training' => 'szkolenie', + 'Class:Incident/Attribute:resolution_code/Value:training+' => 'szkolenie', + 'Class:Incident/Attribute:solution' => 'Rozwiązanie', + 'Class:Incident/Attribute:solution+' => '', + 'Class:Incident/Attribute:pending_reason' => 'Powód oczekiwania', + 'Class:Incident/Attribute:pending_reason+' => '', + 'Class:Incident/Attribute:parent_incident_id' => 'Źródłowy incydent', + 'Class:Incident/Attribute:parent_incident_id+' => '', + 'Class:Incident/Attribute:parent_incident_ref' => 'Powiązany Åŗródłowy incydent', + 'Class:Incident/Attribute:parent_incident_ref+' => '', + 'Class:Incident/Attribute:parent_change_id' => 'Źródłowa zmiana', + 'Class:Incident/Attribute:parent_change_id+' => '', + 'Class:Incident/Attribute:parent_change_ref' => 'Powiązana Åŗródłowa zmiana', + 'Class:Incident/Attribute:parent_change_ref+' => '', + 'Class:Incident/Attribute:parent_problem_id' => 'Źródłowy problem', + 'Class:Incident/Attribute:parent_problem_id+' => '', + 'Class:Incident/Attribute:parent_problem_ref' => 'Powiązany Åŗródłowy problem', + 'Class:Incident/Attribute:parent_problem_ref+' => '', + 'Class:Incident/Attribute:related_request_list' => 'Zależne zgłoszenia', + 'Class:Incident/Attribute:related_request_list+' => '', + 'Class:Incident/Attribute:child_incidents_list' => 'Zależne incydenty', + 'Class:Incident/Attribute:child_incidents_list+' => 'Wszystkie podrzędne incydenty związane z tym incydentem', + 'Class:Incident/Attribute:public_log' => 'Dziennik publiczny', + 'Class:Incident/Attribute:public_log+' => '', + 'Class:Incident/Attribute:user_satisfaction' => 'Zadowolenie użytkownika', + 'Class:Incident/Attribute:user_satisfaction+' => '', + 'Class:Incident/Attribute:user_satisfaction/Value:1' => 'Bardzo zadowolony', + 'Class:Incident/Attribute:user_satisfaction/Value:1+' => 'Bardzo zadowolony', + 'Class:Incident/Attribute:user_satisfaction/Value:2' => 'Dość zadowolony', + 'Class:Incident/Attribute:user_satisfaction/Value:2+' => 'Dość zadowolony', + 'Class:Incident/Attribute:user_satisfaction/Value:3' => 'Raczej niezadowolony', + 'Class:Incident/Attribute:user_satisfaction/Value:3+' => 'Raczej niezadowolony', + 'Class:Incident/Attribute:user_satisfaction/Value:4' => 'Bardzo niezadowolony', + 'Class:Incident/Attribute:user_satisfaction/Value:4+' => 'Bardzo niezadowolony', + 'Class:Incident/Attribute:user_comment' => 'Komentarz użytkownika', + 'Class:Incident/Attribute:user_comment+' => '', + 'Class:Incident/Attribute:parent_incident_id_friendlyname' => 'parent_incident_id_friendlyname', + 'Class:Incident/Attribute:parent_incident_id_friendlyname+' => '', + 'Class:Incident/Stimulus:ev_assign' => 'Przydzielony', + 'Class:Incident/Stimulus:ev_assign+' => '', + 'Class:Incident/Stimulus:ev_reassign' => 'Przydzielony ponownie', + 'Class:Incident/Stimulus:ev_reassign+' => '', + 'Class:Incident/Stimulus:ev_pending' => 'Trwający', + 'Class:Incident/Stimulus:ev_pending+' => '', + 'Class:Incident/Stimulus:ev_timeout' => 'Po czasie', + 'Class:Incident/Stimulus:ev_timeout+' => '', + 'Class:Incident/Stimulus:ev_autoresolve' => 'Automatyczne rozwiązanie', + 'Class:Incident/Stimulus:ev_autoresolve+' => '', + 'Class:Incident/Stimulus:ev_autoclose' => 'Automatyczne zamknięcie', + 'Class:Incident/Stimulus:ev_autoclose+' => '', + 'Class:Incident/Stimulus:ev_resolve' => 'Oznacz jako rozwiązany', + 'Class:Incident/Stimulus:ev_resolve+' => '', + 'Class:Incident/Stimulus:ev_close' => 'Zamknij to zgłoszenie', + 'Class:Incident/Stimulus:ev_close+' => '', + 'Class:Incident/Stimulus:ev_reopen' => 'Otwórz ponownie', + 'Class:Incident/Stimulus:ev_reopen+' => '', + 'Class:Incident/Error:CannotAssignParentIncidentIdToSelf' => 'Nie można przypisać zdarzenia nadrzędnego do samego zdarzenia', + + 'Class:Incident/Method:ResolveChildTickets' => 'Rozpatrz zgłoszenia podrzędne', + 'Class:Incident/Method:ResolveChildTickets+' => 'Połącz rozwiązanie kaskadowo ze zgłoszeniem podrzędnym (ev_autoresolve) i dopasuj następujące cechy: usługa, zespół, agent, informacje o rozwiązaniu', + 'Tickets:Related:OpenIncidents' => 'Otwarte incydenty', +)); diff --git a/datamodels/2.x/itop-knownerror-mgmt/dictionaries/pl.dict.itop-knownerror-mgmt.php b/datamodels/2.x/itop-knownerror-mgmt/dictionaries/pl.dict.itop-knownerror-mgmt.php index 96b2248a7..f6a8c2eed 100644 --- a/datamodels/2.x/itop-knownerror-mgmt/dictionaries/pl.dict.itop-knownerror-mgmt.php +++ b/datamodels/2.x/itop-knownerror-mgmt/dictionaries/pl.dict.itop-knownerror-mgmt.php @@ -1,146 +1,146 @@ - - */ - -// Dictionnay conventions -// Class: -// Class:+ -// Class:/Attribute: -// Class:/Attribute:+ -// Class:/Attribute:/Value: -// Class:/Attribute:/Value:+ -// Class:/Stimulus: -// Class:/Stimulus:+ - -////////////////////////////////////////////////////////////////////// -// Classes in 'bizmodel' -////////////////////////////////////////////////////////////////////// -// - -// Dictionnay conventions -// Class: -// Class:+ -// Class:/Attribute: -// Class:/Attribute:+ -// Class:/Attribute:/Value: -// Class:/Attribute:/Value:+ -// Class:/Stimulus: -// Class:/Stimulus:+ - -// -// Class: KnownError -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:KnownError' => 'Znany błąd', - 'Class:KnownError+' => 'Udokumentowano błąd dotyczący znanego problemu', - 'Class:KnownError/Attribute:name' => 'Nazwa', - 'Class:KnownError/Attribute:name+' => '', - 'Class:KnownError/Attribute:org_id' => 'Klient', - 'Class:KnownError/Attribute:org_id+' => '', - 'Class:KnownError/Attribute:cust_name' => 'Nazwa klienta', - 'Class:KnownError/Attribute:cust_name+' => '', - 'Class:KnownError/Attribute:problem_id' => 'Powiązany problem', - 'Class:KnownError/Attribute:problem_id+' => '', - 'Class:KnownError/Attribute:problem_ref' => 'Powiązane informacje o problemie', - 'Class:KnownError/Attribute:problem_ref+' => '', - 'Class:KnownError/Attribute:symptom' => 'Symptom (objaw)', - 'Class:KnownError/Attribute:symptom+' => '', - 'Class:KnownError/Attribute:root_cause' => 'Przyczyna', - 'Class:KnownError/Attribute:root_cause+' => '', - 'Class:KnownError/Attribute:workaround' => 'Obejście', - 'Class:KnownError/Attribute:workaround+' => '', - 'Class:KnownError/Attribute:solution' => 'Rozwiązanie', - 'Class:KnownError/Attribute:solution+' => '', - 'Class:KnownError/Attribute:error_code' => 'Kod błędu', - 'Class:KnownError/Attribute:error_code+' => '', - 'Class:KnownError/Attribute:domain' => 'Domena', - 'Class:KnownError/Attribute:domain+' => '', - 'Class:KnownError/Attribute:domain/Value:Application' => 'Aplikacja', - 'Class:KnownError/Attribute:domain/Value:Application+' => 'Aplikacja', - 'Class:KnownError/Attribute:domain/Value:Desktop' => 'Desktop', - 'Class:KnownError/Attribute:domain/Value:Desktop+' => 'Desktop', - 'Class:KnownError/Attribute:domain/Value:Network' => 'Sieć', - 'Class:KnownError/Attribute:domain/Value:Network+' => 'Sieć', - 'Class:KnownError/Attribute:domain/Value:Server' => 'Serwer', - 'Class:KnownError/Attribute:domain/Value:Server+' => 'Serwer', - 'Class:KnownError/Attribute:vendor' => 'Sprzedawca', - 'Class:KnownError/Attribute:vendor+' => '', - 'Class:KnownError/Attribute:model' => 'Model', - 'Class:KnownError/Attribute:model+' => '', - 'Class:KnownError/Attribute:version' => 'Wersja', - 'Class:KnownError/Attribute:version+' => '', - 'Class:KnownError/Attribute:ci_list' => 'Konfiguracje', - 'Class:KnownError/Attribute:ci_list+' => 'Wszystkie elementy konfiguracji związane z tym znanym błędem', - 'Class:KnownError/Attribute:document_list' => 'Dokumenty', - 'Class:KnownError/Attribute:document_list+' => 'Wszystkie dokumenty związane z tym znanym błędem', -)); - -// -// Class: lnkErrorToFunctionalCI -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkErrorToFunctionalCI' => 'Połączenie Błąd / Konfiguracja', - 'Class:lnkErrorToFunctionalCI+' => 'Konfiguracje związane ze znanym błędem', - 'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id' => 'Konfiguracja', - 'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id+' => '', - 'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name' => 'Nazwa konfiguracji', - 'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name+' => '', - 'Class:lnkErrorToFunctionalCI/Attribute:error_id' => 'Błąd', - 'Class:lnkErrorToFunctionalCI/Attribute:error_id+' => '', - 'Class:lnkErrorToFunctionalCI/Attribute:error_name' => 'Nazwa błędu', - 'Class:lnkErrorToFunctionalCI/Attribute:error_name+' => '', - 'Class:lnkErrorToFunctionalCI/Attribute:reason' => 'Powód', - 'Class:lnkErrorToFunctionalCI/Attribute:reason+' => '', -)); - -// -// Class: lnkDocumentToError -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkDocumentToError' => 'Połączenie Dokumenty / Błędy', - 'Class:lnkDocumentToError+' => 'Łącze między dokumentem a znanym błędem', - 'Class:lnkDocumentToError/Attribute:document_id' => 'Dokument', - 'Class:lnkDocumentToError/Attribute:document_id+' => '', - 'Class:lnkDocumentToError/Attribute:document_name' => 'Nazwa dokumentu', - 'Class:lnkDocumentToError/Attribute:document_name+' => '', - 'Class:lnkDocumentToError/Attribute:error_id' => 'Błąd', - 'Class:lnkDocumentToError/Attribute:error_id+' => '', - 'Class:lnkDocumentToError/Attribute:error_name' => 'Nazwa błędu', - 'Class:lnkDocumentToError/Attribute:error_name+' => '', - 'Class:lnkDocumentToError/Attribute:link_type' => 'link_type', - 'Class:lnkDocumentToError/Attribute:link_type+' => '', -)); - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Menu:ProblemManagement' => 'Zarządzanie problemami', - 'Menu:ProblemManagement+' => 'Zarządzanie problemami', - 'Menu:Problem:Shortcuts' => 'Skróty', - 'Menu:NewError' => 'Nowy znany błąd', - 'Menu:NewError+' => 'Utworzenie nowego znanego błędu', - 'Menu:SearchError' => 'Wyszukaj znane błędy', - 'Menu:SearchError+' => 'Wyszukaj znane błędy', - 'Menu:Problem:KnownErrors' => 'Wszystkie znane błędy', - 'Menu:Problem:KnownErrors+' => 'Wszystkie znane błędy', -)); + + */ + +// Dictionnay conventions +// Class: +// Class:+ +// Class:/Attribute: +// Class:/Attribute:+ +// Class:/Attribute:/Value: +// Class:/Attribute:/Value:+ +// Class:/Stimulus: +// Class:/Stimulus:+ + +////////////////////////////////////////////////////////////////////// +// Classes in 'bizmodel' +////////////////////////////////////////////////////////////////////// +// + +// Dictionnay conventions +// Class: +// Class:+ +// Class:/Attribute: +// Class:/Attribute:+ +// Class:/Attribute:/Value: +// Class:/Attribute:/Value:+ +// Class:/Stimulus: +// Class:/Stimulus:+ + +// +// Class: KnownError +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:KnownError' => 'Znany błąd', + 'Class:KnownError+' => 'Udokumentowano błąd dotyczący znanego problemu', + 'Class:KnownError/Attribute:name' => 'Nazwa', + 'Class:KnownError/Attribute:name+' => '', + 'Class:KnownError/Attribute:org_id' => 'Klient', + 'Class:KnownError/Attribute:org_id+' => '', + 'Class:KnownError/Attribute:cust_name' => 'Nazwa klienta', + 'Class:KnownError/Attribute:cust_name+' => '', + 'Class:KnownError/Attribute:problem_id' => 'Powiązany problem', + 'Class:KnownError/Attribute:problem_id+' => '', + 'Class:KnownError/Attribute:problem_ref' => 'Powiązane informacje o problemie', + 'Class:KnownError/Attribute:problem_ref+' => '', + 'Class:KnownError/Attribute:symptom' => 'Symptom (objaw)', + 'Class:KnownError/Attribute:symptom+' => '', + 'Class:KnownError/Attribute:root_cause' => 'Przyczyna', + 'Class:KnownError/Attribute:root_cause+' => '', + 'Class:KnownError/Attribute:workaround' => 'Obejście', + 'Class:KnownError/Attribute:workaround+' => '', + 'Class:KnownError/Attribute:solution' => 'Rozwiązanie', + 'Class:KnownError/Attribute:solution+' => '', + 'Class:KnownError/Attribute:error_code' => 'Kod błędu', + 'Class:KnownError/Attribute:error_code+' => '', + 'Class:KnownError/Attribute:domain' => 'Domena', + 'Class:KnownError/Attribute:domain+' => '', + 'Class:KnownError/Attribute:domain/Value:Application' => 'Aplikacja', + 'Class:KnownError/Attribute:domain/Value:Application+' => 'Aplikacja', + 'Class:KnownError/Attribute:domain/Value:Desktop' => 'Desktop', + 'Class:KnownError/Attribute:domain/Value:Desktop+' => 'Desktop', + 'Class:KnownError/Attribute:domain/Value:Network' => 'Sieć', + 'Class:KnownError/Attribute:domain/Value:Network+' => 'Sieć', + 'Class:KnownError/Attribute:domain/Value:Server' => 'Serwer', + 'Class:KnownError/Attribute:domain/Value:Server+' => 'Serwer', + 'Class:KnownError/Attribute:vendor' => 'Sprzedawca', + 'Class:KnownError/Attribute:vendor+' => '', + 'Class:KnownError/Attribute:model' => 'Model', + 'Class:KnownError/Attribute:model+' => '', + 'Class:KnownError/Attribute:version' => 'Wersja', + 'Class:KnownError/Attribute:version+' => '', + 'Class:KnownError/Attribute:ci_list' => 'Konfiguracje', + 'Class:KnownError/Attribute:ci_list+' => 'Wszystkie elementy konfiguracji związane z tym znanym błędem', + 'Class:KnownError/Attribute:document_list' => 'Dokumenty', + 'Class:KnownError/Attribute:document_list+' => 'Wszystkie dokumenty związane z tym znanym błędem', +)); + +// +// Class: lnkErrorToFunctionalCI +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkErrorToFunctionalCI' => 'Połączenie Błąd / Konfiguracja', + 'Class:lnkErrorToFunctionalCI+' => 'Konfiguracje związane ze znanym błędem', + 'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id' => 'Konfiguracja', + 'Class:lnkErrorToFunctionalCI/Attribute:functionalci_id+' => '', + 'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name' => 'Nazwa konfiguracji', + 'Class:lnkErrorToFunctionalCI/Attribute:functionalci_name+' => '', + 'Class:lnkErrorToFunctionalCI/Attribute:error_id' => 'Błąd', + 'Class:lnkErrorToFunctionalCI/Attribute:error_id+' => '', + 'Class:lnkErrorToFunctionalCI/Attribute:error_name' => 'Nazwa błędu', + 'Class:lnkErrorToFunctionalCI/Attribute:error_name+' => '', + 'Class:lnkErrorToFunctionalCI/Attribute:reason' => 'Powód', + 'Class:lnkErrorToFunctionalCI/Attribute:reason+' => '', +)); + +// +// Class: lnkDocumentToError +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkDocumentToError' => 'Połączenie Dokumenty / Błędy', + 'Class:lnkDocumentToError+' => 'Łącze między dokumentem a znanym błędem', + 'Class:lnkDocumentToError/Attribute:document_id' => 'Dokument', + 'Class:lnkDocumentToError/Attribute:document_id+' => '', + 'Class:lnkDocumentToError/Attribute:document_name' => 'Nazwa dokumentu', + 'Class:lnkDocumentToError/Attribute:document_name+' => '', + 'Class:lnkDocumentToError/Attribute:error_id' => 'Błąd', + 'Class:lnkDocumentToError/Attribute:error_id+' => '', + 'Class:lnkDocumentToError/Attribute:error_name' => 'Nazwa błędu', + 'Class:lnkDocumentToError/Attribute:error_name+' => '', + 'Class:lnkDocumentToError/Attribute:link_type' => 'link_type', + 'Class:lnkDocumentToError/Attribute:link_type+' => '', +)); + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Menu:ProblemManagement' => 'Zarządzanie problemami', + 'Menu:ProblemManagement+' => 'Zarządzanie problemami', + 'Menu:Problem:Shortcuts' => 'Skróty', + 'Menu:NewError' => 'Nowy znany błąd', + 'Menu:NewError+' => 'Utworzenie nowego znanego błędu', + 'Menu:SearchError' => 'Wyszukaj znane błędy', + 'Menu:SearchError+' => 'Wyszukaj znane błędy', + 'Menu:Problem:KnownErrors' => 'Wszystkie znane błędy', + 'Menu:Problem:KnownErrors+' => 'Wszystkie znane błędy', +)); diff --git a/datamodels/2.x/itop-oauth-client/README.md b/datamodels/2.x/itop-oauth-client/README.md index a520ac75c..9a45ad911 100644 --- a/datamodels/2.x/itop-oauth-client/README.md +++ b/datamodels/2.x/itop-oauth-client/README.md @@ -1,2 +1,5 @@ # Extension OAuth 2.0 client +## GMail + +If the account is in test, after 7 days the tokens are no longer valid, you have to renew the tokens manually. diff --git a/datamodels/2.x/itop-oauth-client/ajax.php b/datamodels/2.x/itop-oauth-client/ajax.php index 1b81b0829..4fbbbf477 100644 --- a/datamodels/2.x/itop-oauth-client/ajax.php +++ b/datamodels/2.x/itop-oauth-client/ajax.php @@ -17,8 +17,7 @@ if (version_compare(ITOP_DESIGN_LATEST_VERSION , '3.0') >= 0) { } $oUpdateController = new AjaxOauthClientController($sTemplates, 'itop-oauth-client'); -$oUpdateController->AllowOnlyAdmin(); -$oUpdateController->SetDefaultOperation('CreateMailbox'); +$oUpdateController->SetMenuId('OAuthClient'); $oUpdateController->HandleOperation(); diff --git a/datamodels/2.x/itop-oauth-client/datamodel.itop-oauth-client.xml b/datamodels/2.x/itop-oauth-client/datamodel.itop-oauth-client.xml index 70c6eeeea..df80f7eb2 100644 --- a/datamodels/2.x/itop-oauth-client/datamodel.itop-oauth-client.xml +++ b/datamodels/2.x/itop-oauth-client/datamodel.itop-oauth-client.xml @@ -5,7 +5,7 @@ cmdbAbstractObject - cloud,searchable + grant_by_profile,application true autoincrement priv_oauth_client @@ -17,14 +17,15 @@ - - + @@ -119,22 +120,35 @@ public Overload-DBObject Get('scope'); - if ($this->Get('status') == 'inactive') { - $oPage->p(''.Dict::S('itop-oauth-client:Message:MissingToken').''); - } elseif (($sScope == 'SMTP' || $sScope == 'EMail') && $oConfig->Get('email_transport_smtp.username') == $this->Get('name')) { - $sLabel = Dict::S('itop-oauth-client:UsedForSMTP'); - $sTestLabel = Dict::S('itop-oauth-client:TestSMTP'); - $sTestURL = utils::GetAbsoluteUrlAppRoot().'setup/email.test.php'; - $oPage->p("$sLabel $sTestLabel"); - } - } - } + public function DisplayBareHeader(WebPage $oPage, $bEditMode = false) + { + $aHeaderBlocks = parent::DisplayBareHeader($oPage, $bEditMode); + $aTags = []; + if (!$bEditMode) { + $oConfig = utils::GetConfig(); + if ($this->Get('status') == 'inactive') { + $sLabel = Dict::S('itop-oauth-client:Message:MissingToken'); + $sTitle = ''; + $aTags['oauth-message'] = ['title' => $sTitle, 'css_classes' => 'ibo-object-details--tag--oauth-message', 'decoration_classes' => 'fas fa-exclamation-triangle', 'label' => $sLabel]; + } elseif ($this->Get('used_for_smtp') == 'yes' && $oConfig->Get('email_transport_smtp.username') == $this->Get('name')) { + $sLabel = Dict::S('itop-oauth-client:UsedForSMTP'); + $sTestLabel = Dict::S('itop-oauth-client:TestSMTP'); + $sTestURL = utils::GetAbsoluteUrlAppRoot().'setup/email.test.php'; + $sLabel = Dict::S('itop-oauth-client:UsedForSMTP')." $sTestLabel"; + $sTitle = ''; + $aTags['oauth-message'] = ['title' => $sTitle, 'css_classes' => 'ibo-object-details--tag--oauth-message', 'decoration_classes' => 'far fa-envelope', 'label' => $sLabel]; + } + } + foreach ($aTags as $sIconId => $aIconData) { + $sTagTooltipContent = utils::EscapeHtml($aIconData['title']); + $aHeaderBlocks['subtitle'][static::HEADER_BLOCKS_SUBTITLE_TAG_PREFIX.$sIconId] = new Combodo\iTop\Application\UI\Base\Component\Html\Html(<<{$aIconData['label']} +HTML + ); + } + + return $aHeaderBlocks; + } ]]> @@ -142,14 +156,14 @@ public Overload-DBObject @@ -157,68 +171,68 @@ public Overload-DBObject false public Get('provider').'.com'; - } + public function GetDefaultMailServer() + { + return 'imap.'.$this->Get('provider').'.com'; + } ]]> false public false public Get('status') == 'active') { - return new \League\OAuth2\Client\Token\AccessToken([ - 'access_token' => $this->Get('token'), - 'expires_in' => date_format(new DateTime($this->Get('token_expiration')), 'U') - time(), - 'refresh_token' => $this->Get('refresh_token'), - 'token_type' => 'Bearer', - ]); - } - return null; - } + public function GetAccessToken() + { + if ($this->Get('status') == 'active') { + return new \League\OAuth2\Client\Token\AccessToken([ + 'access_token' => $this->Get('token'), + 'expires_in' => date_format(new DateTime($this->Get('token_expiration')), 'U') - time(), + 'refresh_token' => $this->Get('refresh_token'), + 'token_type' => 'Bearer', + ]); + } + return null; + } ]]> false public Set('token', $oAccessToken->getToken()); - $this->Set('token_expiration', date(AttributeDateTime::GetSQLFormat(), $oAccessToken->getExpires())); - if (!empty($oAccessToken->getRefreshToken())) { - $this->Set('refresh_token', $oAccessToken->getRefreshToken()); - } - $this->Set('status', 'active'); - $this->DBUpdate(); - } + public function SetAccessToken(\League\OAuth2\Client\Token\AccessTokenInterface $oAccessToken) + { + $this->Set('token', $oAccessToken->getToken()); + $this->Set('token_expiration', date(AttributeDateTime::GetSQLFormat(), $oAccessToken->getExpires())); + if (!empty($oAccessToken->getRefreshToken())) { + $this->Set('refresh_token', $oAccessToken->getRefreshToken()); + } + $this->Set('status', 'active'); + $this->DBUpdate(); + } ]]> @@ -280,6 +294,632 @@ + + OAuthClient + + grant_by_profile,application + false + autoincrement + priv_oauth_client_azure + id + + + + + + + + + + + + + + + + + + + + + true + + + + + + + true + + + SMTP + + + IMAP + + + scope + SMTP,IMAP + true + + + advanced_scope + + true + + + true + + + simple + + + advanced + + + used_scope + simple + false + + + + + + + true + + + yes + + + no + + + used_for_smtp + no + true + + + +
+ + + 10 + + + 10 + + + 10 + + + 20 + + + 30 + + + 40 + + + 50 + + + 60 + + + 70 + + + 80 + + + + + + + 20 + + + 10 + + + 10 + + + 20 + + + 30 + + + 40 + + + + + + +
+ + + + 10 + + + 10 + + + + + + + 10 + + + 10 + + + 10 + + + +
+ + + false + public + Overload-DBObject + Set('provider', 'Azure'); + $this->Set('redirect_url', Combodo\iTop\Core\Authentication\Client\OAuth\OAuthClientProviderFactory::GetRedirectUri()); + $this->Set('scope', 'SMTP, IMAP'); + + parent::PrefillCreationForm($aContextParam); + } + ]]> + + + false + public + Overload-DBObject + ListChanges(); + if (array_key_exists('name', $aChanges) || array_key_exists('used_for_smtp', $aChanges)) + { + $sNewName = $this->Get('name'); + $sNewUseForSMTP = $this->Get('used_for_smtp'); + if ($sNewUseForSMTP == 'yes') { + $oSearch = DBObjectSearch::FromOQL_AllData("SELECT OAuthClientGoogle WHERE name = :newname AND used_for_smtp = :newuseforsmtp AND id != :id UNION SELECT OAuthClientAzure WHERE name = :newname AND used_for_smtp = :newuseforsmtp AND id != :id"); + $oSet = new DBObjectSet($oSearch, array(), ['id' => $this->GetKey(), 'newname' => $sNewName, 'newuseforsmtp' => $sNewUseForSMTP]); + if ($oSet->Count() > 0) + { + $this->m_aCheckIssues[] = Dict::Format('OAuthClient:Name/UseForSMTPMustBeUnique', $sNewName, $sNewUseForSMTP); + } + } + } + } ]]> + + + false + public + Overload-DBObject + Get('provider'))) { + $this->Set('provider', 'Azure'); + } + if (empty($this->Get('redirect_url'))) { + $this->Set('redirect_url', Combodo\iTop\Core\Authentication\Client\OAuth\OAuthClientProviderFactory::GetRedirectUri()); + } + if (empty($this->Get('advanced_scope'))) { + $this->Set('used_scope', 'simple'); + if (count($this->Get('scope')->GetValues()) == 0) { + $this->Set('scope', 'SMTP, IMAP'); + } + } else { + $this->Set('used_scope', 'advanced'); + $this->Set('scope', ''); + } + } + ]]> + + + false + public + Overload-DBObject + + + + false + public + Overload-DBObject + + + + false + public + + + + false + public + Get('advanced_scope'))) { + return $this->Get('advanced_scope'); + } + $aScopes = $this->Get('scope')->GetValues(); + $aRawScopes = ['offline_access']; + foreach ($aScopes as $sScope) { + switch ($sScope) { + case 'SMTP': + $aRawScopes[] = 'https://outlook.office.com/SMTP.Send'; + break; + + case 'IMAP': + $aRawScopes[] = 'https://outlook.office.com/IMAP.AccessAsUser.All'; + break; + } + } + return implode(' ', $aRawScopes); + } + ]]> + + +
+ + OAuthClient + + grant_by_profile,application + false + autoincrement + priv_oauth_client_google + id + + + + + + + + + + + + + + + + + + + + + true + + + + + + + true + + + SMTP + + + IMAP + + + scope + SMTP,IMAP + true + + + advanced_scope + + true + + + true + + + simple + + + advanced + + + used_scope + simple + false + + + + + + + true + + + yes + + + no + + + used_for_smtp + no + true + + + +
+ + + 10 + + + 10 + + + 10 + + + 20 + + + 30 + + + 40 + + + 50 + + + 60 + + + 70 + + + 80 + + + + + + + 20 + + + 10 + + + 10 + + + 20 + + + 30 + + + 40 + + + + + + +
+ + + + 10 + + + 10 + + + + + + + 10 + + + 10 + + + 10 + + + +
+ + + false + public + Overload-DBObject + Set('provider', 'Google'); + $this->Set('redirect_url', Combodo\iTop\Core\Authentication\Client\OAuth\OAuthClientProviderFactory::GetRedirectUri()); + $this->Set('scope', 'SMTP, IMAP'); + + parent::PrefillCreationForm($aContextParam); + } + ]]> + + + false + public + Overload-DBObject + ListChanges(); + if (array_key_exists('name', $aChanges) || array_key_exists('used_for_smtp', $aChanges)) + { + $sNewName = $this->Get('name'); + $sNewUseForSMTP = $this->Get('used_for_smtp'); + if ($sNewUseForSMTP == 'yes') { + $oSearch = DBObjectSearch::FromOQL_AllData("SELECT OAuthClientGoogle WHERE name = :newname AND used_for_smtp = :newuseforsmtp AND id != :id UNION SELECT OAuthClientAzure WHERE name = :newname AND used_for_smtp = :newuseforsmtp AND id != :id"); + $oSet = new DBObjectSet($oSearch, array(), ['id' => $this->GetKey(), 'newname' => $sNewName, 'newuseforsmtp' => $sNewUseForSMTP]); + if ($oSet->Count() > 0) + { + $this->m_aCheckIssues[] = Dict::Format('OAuthClient:Name/UseForSMTPMustBeUnique', $sNewName, $sNewUseForSMTP); + } + } + } + } ]]> + + + false + public + Overload-DBObject + Get('provider'))) { + $this->Set('provider', 'Google'); + } + if (empty($this->Get('redirect_url'))) { + $this->Set('redirect_url', Combodo\iTop\Core\Authentication\Client\OAuth\OAuthClientProviderFactory::GetRedirectUri()); + } + if (empty($this->Get('advanced_scope'))) { + $this->Set('used_scope', 'simple'); + if (count($this->Get('scope')->GetValues()) == 0) { + $this->Set('scope', 'SMTP, IMAP'); + } + } else { + $this->Set('used_scope', 'advanced'); + $this->Set('scope', ''); + } + } + ]]> + + + false + public + Overload-DBObject + + + + false + public + Overload-DBObject + + + + false + public + + + + false + public + Get('advanced_scope'))) { + return $this->Get('advanced_scope'); + } + $aScopes = $this->Get('scope')->GetValues(); + $aRawScopes = []; + foreach ($aScopes as $sScope) { + switch ($sScope) { + case 'SMTP': + $aRawScopes['https://mail.google.com/'] = 'https://mail.google.com/'; + break; + + case 'IMAP': + $aRawScopes['https://mail.google.com/'] = 'https://mail.google.com/'; + break; + } + } + return implode(' ', $aRawScopes); + } + ]]> + + +
@@ -289,13 +929,16 @@ 1 0 OAuthClient - UR_ACTION_READ + UR_ACTION_MODIFY + + + + + - - diff --git a/datamodels/2.x/itop-oauth-client/en.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/en.dict.itop-oauth-client.php index 1a91fb173..a8a0f4d9d 100644 --- a/datamodels/2.x/itop-oauth-client/en.dict.itop-oauth-client.php +++ b/datamodels/2.x/itop-oauth-client/en.dict.itop-oauth-client.php @@ -21,6 +21,11 @@ Dict::Add('EN US', 'English', 'English', [ 'itop-oauth-client:Message:MissingToken' => 'Generate access token before using this OAuth client', 'itop-oauth-client:Message:TokenCreated' => 'Access token created', 'itop-oauth-client:Message:TokenRecreated' => 'Access token regenerated', + + 'OAuthClient:Name/UseForSMTPMustBeUnique' => 'The combination Login (%1$s) and Use for SMTP (%2$s) has already be used for OAuth Client', + + 'OAuthClient:baseinfo' => 'Base Information', + 'OAuthClient:scope' => 'Scope', ]); // @@ -32,19 +37,17 @@ Dict::Add('EN US', 'English', 'English', [ 'Class:OAuthClient/Attribute:provider' => 'Provider', 'Class:OAuthClient/Attribute:provider+' => '', 'Class:OAuthClient/Attribute:name' => 'Login', - 'Class:OAuthClient/Attribute:name+' => '', - 'Class:OAuthClient/Attribute:scope' => 'Scope', - 'Class:OAuthClient/Attribute:scope+' => '', + 'Class:OAuthClient/Attribute:name+' => 'In general, this is your email address', 'Class:OAuthClient/Attribute:status' => 'Status', - 'Class:OAuthClient/Attribute:status+' => '', + 'Class:OAuthClient/Attribute:status+' => 'After creation, use the action ā€œGenerate access tokenā€ to be able to use this OAuth client', 'Class:OAuthClient/Attribute:status/Value:active' => 'Access token generated', 'Class:OAuthClient/Attribute:status/Value:inactive' => 'No Access token', 'Class:OAuthClient/Attribute:description' => 'Description', 'Class:OAuthClient/Attribute:description+' => '', 'Class:OAuthClient/Attribute:client_id' => 'Client id', - 'Class:OAuthClient/Attribute:client_id+' => '', + 'Class:OAuthClient/Attribute:client_id+' => 'A long string of characters provided by your OAuth2 provider', 'Class:OAuthClient/Attribute:client_secret' => 'Client secret', - 'Class:OAuthClient/Attribute:client_secret+' => '', + 'Class:OAuthClient/Attribute:client_secret+' => 'Another long string of characters provided by your OAuth2 provider', 'Class:OAuthClient/Attribute:refresh_token' => 'Refresh token', 'Class:OAuthClient/Attribute:refresh_token+' => '', 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Refresh token expiration', @@ -54,7 +57,7 @@ Dict::Add('EN US', 'English', 'English', [ 'Class:OAuthClient/Attribute:token_expiration' => 'Access token expiration', 'Class:OAuthClient/Attribute:token_expiration+' => '', 'Class:OAuthClient/Attribute:redirect_url' => 'Redirect url', - 'Class:OAuthClient/Attribute:redirect_url+' => '', + 'Class:OAuthClient/Attribute:redirect_url+' => 'This url must be copied in the OAuth2 configuration of the provider', 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list', 'Class:OAuthClient/Attribute:mailbox_list+' => '', ]); @@ -62,17 +65,53 @@ Dict::Add('EN US', 'English', 'English', [ // // Class: OAuthClientAzure // -Dict::Add('EN US', 'English', 'English', [ + +Dict::Add('EN US', 'English', 'English', array( 'Class:OAuthClientAzure' => 'OAuth client for Microsoft Azure', 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)', - -]); + 'Class:OAuthClientAzure/Attribute:scope' => 'Scope', + 'Class:OAuthClientAzure/Attribute:scope+' => 'Usually default selection is appropriate', + 'Class:OAuthClientAzure/Attribute:scope/Value:SMTP' => 'SMTP', + 'Class:OAuthClientAzure/Attribute:scope/Value:SMTP+' => '', + 'Class:OAuthClientAzure/Attribute:scope/Value:IMAP' => 'IMAP', + 'Class:OAuthClientAzure/Attribute:scope/Value:IMAP+' => '', + 'Class:OAuthClientAzure/Attribute:advanced_scope' => 'Advanced scope', + 'Class:OAuthClientAzure/Attribute:advanced_scope+' => 'As soon as you enter something here it takes precedence on the ā€œScopeā€ selection which is then ignored', + 'Class:OAuthClientAzure/Attribute:used_scope' => 'Used scope', + 'Class:OAuthClientAzure/Attribute:used_scope+' => '', + 'Class:OAuthClientAzure/Attribute:used_scope/Value:simple' => 'Simple', + 'Class:OAuthClientAzure/Attribute:used_scope/Value:simple+' => '', + 'Class:OAuthClientAzure/Attribute:used_scope/Value:advanced' => 'Advanced', + 'Class:OAuthClientAzure/Attribute:used_scope/Value:advanced+' => '', + 'Class:OAuthClientAzure/Attribute:used_for_smtp' => 'Used for SMTP', + 'Class:OAuthClientAzure/Attribute:used_for_smtp+' => 'At least one OAuth client must have this flag to ā€œYesā€, if you want iTop to use it for sending mails', + 'Class:OAuthClientAzure/Attribute:used_for_smtp/Value:yes' => 'Yes', + 'Class:OAuthClientAzure/Attribute:used_for_smtp/Value:no' => 'No', +)); // // Class: OAuthClientGoogle // -Dict::Add('EN US', 'English', 'English', [ + +Dict::Add('EN US', 'English', 'English', array( 'Class:OAuthClientGoogle' => 'OAuth client for Google', 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)', -]); - + 'Class:OAuthClientGoogle/Attribute:scope' => 'Scope', + 'Class:OAuthClientGoogle/Attribute:scope+' => 'Usually default selection is appropriate', + 'Class:OAuthClientGoogle/Attribute:scope/Value:SMTP' => 'SMTP', + 'Class:OAuthClientGoogle/Attribute:scope/Value:SMTP+' => '', + 'Class:OAuthClientGoogle/Attribute:scope/Value:IMAP' => 'IMAP', + 'Class:OAuthClientGoogle/Attribute:scope/Value:IMAP+' => '', + 'Class:OAuthClientGoogle/Attribute:advanced_scope' => 'Advanced scope', + 'Class:OAuthClientGoogle/Attribute:advanced_scope+' => 'As soon as you enter something here it takes precedence on the ā€œScopeā€ selection which is then ignored', + 'Class:OAuthClientGoogle/Attribute:used_scope' => 'Used scope', + 'Class:OAuthClientGoogle/Attribute:used_scope+' => '', + 'Class:OAuthClientGoogle/Attribute:used_scope/Value:simple' => 'Simple', + 'Class:OAuthClientGoogle/Attribute:used_scope/Value:simple+' => '', + 'Class:OAuthClientGoogle/Attribute:used_scope/Value:advanced' => 'Advanced', + 'Class:OAuthClientGoogle/Attribute:used_scope/Value:advanced+' => '', + 'Class:OAuthClientGoogle/Attribute:used_for_smtp' => 'Used for SMTP', + 'Class:OAuthClientGoogle/Attribute:used_for_smtp+' => 'At least one OAuth client must have this flag to ā€œYesā€, if you want iTop to use it for sending mails', + 'Class:OAuthClientGoogle/Attribute:used_for_smtp/Value:yes' => 'Yes', + 'Class:OAuthClientGoogle/Attribute:used_for_smtp/Value:no' => 'No', +)); diff --git a/datamodels/2.x/itop-oauth-client/fr.dict.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/fr.dict.itop-oauth-client.php index e8461b535..3d5f84836 100644 --- a/datamodels/2.x/itop-oauth-client/fr.dict.itop-oauth-client.php +++ b/datamodels/2.x/itop-oauth-client/fr.dict.itop-oauth-client.php @@ -5,6 +5,7 @@ * @copyright Copyright (C) 2013 XXXXX * @license http://opensource.org/licenses/AGPL-3.0 */ + Dict::Add('FR FR', 'French', 'FranƧais', [ 'Menu:CreateMailbox' => 'CrĆ©er une boite mail...', 'Menu:OAuthClient' => 'Client OAuth', @@ -20,6 +21,11 @@ Dict::Add('FR FR', 'French', 'FranƧais', [ 'itop-oauth-client:Message:MissingToken' => 'GĆ©nĆ©rez le jeton d\'accĆØs avant d\'utiliser ce client OAuth', 'itop-oauth-client:Message:TokenCreated' => 'Le jeton d\'accĆØs Ć  Ć©tĆ© crƩƩ', 'itop-oauth-client:Message:TokenRecreated' => 'Le jeton d\'accĆØs Ć  Ć©tĆ© renouvelĆ©', + + 'OAuthClient:Name/UseForSMTPMustBeUnique' => 'La combinaison Login (%1$s) and UtilisĆ© pour SMTP (%2$s) a dĆ©jĆ  Ć©tĆ© utilisĆ©e pour OAuth Client', + + 'OAuthClient:baseinfo' => 'Information', + 'OAuthClient:scope' => 'Scope', ]); // @@ -31,15 +37,17 @@ Dict::Add('FR FR', 'French', 'FranƧais', [ 'Class:OAuthClient/Attribute:provider' => 'Fournisseur', 'Class:OAuthClient/Attribute:provider+' => '', 'Class:OAuthClient/Attribute:name' => 'Login', - 'Class:OAuthClient/Attribute:name+' => '', - 'Class:OAuthClient/Attribute:scope' => 'Niveaux d\'accĆØs', - 'Class:OAuthClient/Attribute:scope+' => '', + 'Class:OAuthClient/Attribute:name+' => 'L\'adresse email Ć  utiliser chez ce fournisseur', + 'Class:OAuthClient/Attribute:status' => 'Statut', + 'Class:OAuthClient/Attribute:status+' => 'AprĆØs la crĆ©ation, effectuer l\'action \'CrĆ©er un jeton d\'accĆØs...\' pour activer ce client OAuth', + 'Class:OAuthClient/Attribute:status/Value:active' => 'Jeton d\'accĆØs crƩƩ', + 'Class:OAuthClient/Attribute:status/Value:inactive' => 'Pas de jeton d\'accĆØs', 'Class:OAuthClient/Attribute:description' => 'Description', 'Class:OAuthClient/Attribute:description+' => '', 'Class:OAuthClient/Attribute:client_id' => 'ID Client', - 'Class:OAuthClient/Attribute:client_id+' => '', + 'Class:OAuthClient/Attribute:client_id+' => 'Recopier la chaine fournie par votre fournisseur OAuth2', 'Class:OAuthClient/Attribute:client_secret' => 'Code secret du client', - 'Class:OAuthClient/Attribute:client_secret+' => '', + 'Class:OAuthClient/Attribute:client_secret+' => 'Recopier l\'information fournie par votre fournisseur OAuth2', 'Class:OAuthClient/Attribute:refresh_token' => 'Jeton de renouvellement', 'Class:OAuthClient/Attribute:refresh_token+' => '', 'Class:OAuthClient/Attribute:refresh_token_expiration' => 'Date d\'expiration du jeton de renouvellement', @@ -49,7 +57,7 @@ Dict::Add('FR FR', 'French', 'FranƧais', [ 'Class:OAuthClient/Attribute:token_expiration' => 'Date d\'expiration du jeton d\'accĆØs', 'Class:OAuthClient/Attribute:token_expiration+' => '', 'Class:OAuthClient/Attribute:redirect_url' => 'URL de redirection', - 'Class:OAuthClient/Attribute:redirect_url+' => '', + 'Class:OAuthClient/Attribute:redirect_url+' => 'Cet URL doit ĆŖtre recopiĆ© dans la configuration OAuth2 de votre fournisseur', 'Class:OAuthClient/Attribute:mailbox_list' => 'Mailbox list', 'Class:OAuthClient/Attribute:mailbox_list+' => '', ]); @@ -57,22 +65,52 @@ Dict::Add('FR FR', 'French', 'FranƧais', [ // // Class: OAuthClientAzure // -Dict::Add('FR FR', 'French', 'FranƧais', [ + +Dict::Add('FR FR', 'French', 'FranƧais', array( 'Class:OAuthClientAzure' => 'Client OAuth pour Microsoft Azure', 'Class:OAuthClientAzure/Name' => '%1$s (%2$s)', - -]); + 'Class:OAuthClientAzure/Attribute:scope' => 'Niveaux d\'accĆØs', + 'Class:OAuthClientAzure/Attribute:scope+' => 'Les niveaux par dĆ©faut sont les plus souvent suffisants', + 'Class:OAuthClientAzure/Attribute:scope/Value:SMTP' => 'SMTP', + 'Class:OAuthClientAzure/Attribute:scope/Value:SMTP+' => '', + 'Class:OAuthClientAzure/Attribute:scope/Value:IMAP' => 'IMAP', + 'Class:OAuthClientAzure/Attribute:scope/Value:IMAP+' => '', + 'Class:OAuthClientAzure/Attribute:advanced_scope' => 'Niveaux d\'accĆØs avancĆ©', + 'Class:OAuthClientAzure/Attribute:advanced_scope+' => 'A saisir, lorsque les niveaux prĆ©dĆ©finis ne suffisent pas', + 'Class:OAuthClientAzure/Attribute:used_scope' => 'Niveaux d\'accĆØs utilisĆ©s', + 'Class:OAuthClientAzure/Attribute:used_scope+' => '', + 'Class:OAuthClientAzure/Attribute:used_scope/Value:simple' => 'Simple', + 'Class:OAuthClientAzure/Attribute:used_scope/Value:simple+' => '', + 'Class:OAuthClientAzure/Attribute:used_scope/Value:advanced' => 'AvancĆ©', + 'Class:OAuthClientAzure/Attribute:used_scope/Value:advanced+' => '', + 'Class:OAuthClientAzure/Attribute:used_for_smtp' => 'UtilisĆ© pour SMTP', + 'Class:OAuthClientAzure/Attribute:used_for_smtp+' => 'Le Client OAuth utilisĆ© pour l\'envoi d\'emails doit ĆŖtre Ć  \'Oui\'', + 'Class:OAuthClientAzure/Attribute:used_for_smtp/Value:yes' => 'Oui', + 'Class:OAuthClientAzure/Attribute:used_for_smtp/Value:no' => 'Non', +)); // // Class: OAuthClientGoogle // -Dict::Add('FR FR', 'French', 'FranƧais', [ + +Dict::Add('FR FR', 'French', 'FranƧais', array( 'Class:OAuthClientGoogle' => 'Client OAuth pour Google', 'Class:OAuthClientGoogle/Name' => '%1$s (%2$s)', -]); - - -// Additional language entries not present in English dict -Dict::Add('FR FR', 'French', 'FranƧais', array( - 'Class:OAuthClient/Name' => '%1$s-%%2$~', + 'Class:OAuthClientGoogle/Attribute:scope' => 'Niveaux d\'accĆØs', + 'Class:OAuthClientGoogle/Attribute:scope+' => 'Les niveaux par dĆ©faut sont les plus souvent suffisants', + 'Class:OAuthClientGoogle/Attribute:scope/Value:SMTP' => 'SMTP', + 'Class:OAuthClientGoogle/Attribute:scope/Value:SMTP+' => '', + 'Class:OAuthClientGoogle/Attribute:scope/Value:IMAP' => 'IMAP', + 'Class:OAuthClientGoogle/Attribute:scope/Value:IMAP+' => '', + 'Class:OAuthClientGoogle/Attribute:advanced_scope' => 'Niveaux d\'accĆØs avancĆ©', + 'Class:OAuthClientGoogle/Attribute:advanced_scope+' => 'A saisir, lorsque les niveaux prĆ©dĆ©finis ne suffisent pas', + 'Class:OAuthClientGoogle/Attribute:used_scope' => 'Niveaux d\'accĆØs utilisĆ©s', + 'Class:OAuthClientGoogle/Attribute:used_scope+' => '', + 'Class:OAuthClientGoogle/Attribute:used_scope/Value:simple' => 'Simple', + 'Class:OAuthClientGoogle/Attribute:used_scope/Value:advanced' => 'AvancĆ©', + 'Class:OAuthClientGoogle/Attribute:used_scope/Value:advanced+' => '', + 'Class:OAuthClientGoogle/Attribute:used_for_smtp' => 'UtilisĆ© pour SMTP', + 'Class:OAuthClientGoogle/Attribute:used_for_smtp+' => 'Le Client OAuth utilisĆ© pour l\'envoi d\'emails doit ĆŖtre Ć  \'Oui\'', + 'Class:OAuthClientGoogle/Attribute:used_for_smtp/Value:yes' => 'Oui', + 'Class:OAuthClientGoogle/Attribute:used_for_smtp/Value:no' => 'Non', )); diff --git a/datamodels/2.x/itop-oauth-client/module.itop-oauth-client.php b/datamodels/2.x/itop-oauth-client/module.itop-oauth-client.php index 3e80fcaf3..131628248 100644 --- a/datamodels/2.x/itop-oauth-client/module.itop-oauth-client.php +++ b/datamodels/2.x/itop-oauth-client/module.itop-oauth-client.php @@ -25,9 +25,8 @@ SetupWebPage::AddModule( 'datamodel' => array( 'vendor/autoload.php', 'model.itop-oauth-client.php', // Contains the PHP code generated by the "compilation" of datamodel.remote-authent-oauth.xml - 'src/Model/OAuthClientGoogle.php', - 'src/Model/OAuthClientAzure.php', 'src/Service/PopupMenuExtension.php', + 'src/Service/ApplicationUIExtension.php', ), 'webservice' => array( diff --git a/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientAzure.php b/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientAzure.php deleted file mode 100644 index eb798e64d..000000000 --- a/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientAzure.php +++ /dev/null @@ -1,128 +0,0 @@ - 'cloud', - 'key_type' => 'autoincrement', - 'name_attcode' => ['name', 'scope'], - 'state_attcode' => '', - 'reconc_keys' => ['provider', 'name'], - 'db_table' => 'priv_oauth_client_azure', - 'db_key_field' => 'id', - 'icon' => utils::GetAbsoluteUrlModulesRoot().'itop-oauth-client/assets/img/icons8-azure.svg', - 'db_finalclass_field' => '', - 'uniqueness_rules' => [ - 'Username for scope' => - [ - 'attributes' => ['name', 'scope'], - 'filter' => null, - 'disabled' => false, - 'is_blocking' => true, - ], - 'OAuth Server' => - [ - 'attributes' => ['provider', 'scope', 'client_id', 'client_secret'], - 'filter' => null, - 'disabled' => false, - 'is_blocking' => true, - ], - ], - ]; - MetaModel::Init_Params($aParams); - MetaModel::Init_InheritAttributes(); - MetaModel::Init_AddAttribute(new AttributeEnum('scope', [ - 'allowed_values' => new ValueSetEnum('EMail'), - 'display_style' => 'list', - 'sql' => 'scope', - 'default_value' => 'EMail', - 'is_null_allowed' => false, - 'depends_on' => [], - 'always_load_in_tables' => true, - ])); - - MetaModel::Init_SetZListItems('details', [ - 'name', - 'status', - 'description', - 'provider', - 'scope', - 'redirect_url', - 'client_id', - 'client_secret', - 'mailbox_list', - ]); - MetaModel::Init_SetZListItems('standard_search', [ - 'name', - 'provider', - 'status', - ]); - MetaModel::Init_SetZListItems('list', [ - 'status', - 'provider', - ]); - } - - public function PrefillCreationForm(&$aContextParam) - { - $this->Set('provider', 'Azure'); - $this->Set('redirect_url', OAuthClientProviderFactory::GetRedirectUri()); - - parent::PrefillCreationForm($aContextParam); - } - - /** - * Compute read-only values - * - * @return void - * @throws \ArchivedObjectException - * @throws \CoreException - * @throws \CoreUnexpectedValue - */ - public function ComputeValues() - { - parent::ComputeValues(); - if (empty($this->Get('provider'))) { - $this->Set('provider', 'Azure'); - } - if (empty($this->Get('redirect_url'))) { - $this->Set('redirect_url', OAuthClientProviderFactory::GetRedirectUri()); - } - } - - public function GetAttributeFlags($sAttCode, &$aReasons = array(), $sTargetState = '') - { - if ($sAttCode == 'provider' || $sAttCode == 'redirect_url') { - return OPT_ATT_READONLY; - } - - return parent::GetAttributeFlags($sAttCode, $aReasons, $sTargetState); - } - - public function GetInitialStateAttributeFlags($sAttCode, &$aReasons = array()) - { - if ($sAttCode == 'provider' || $sAttCode == 'redirect_url') { - return OPT_ATT_READONLY; - } - - return parent::GetInitialStateAttributeFlags($sAttCode, $aReasons); - } - - public function GetDefaultMailServer() - { - return 'outlook.office365.com'; - } - - public function GetScope() - { - return 'https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send offline_access'; - } -} \ No newline at end of file diff --git a/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientGoogle.php b/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientGoogle.php deleted file mode 100644 index 83c111852..000000000 --- a/datamodels/2.x/itop-oauth-client/src/Model/OAuthClientGoogle.php +++ /dev/null @@ -1,134 +0,0 @@ - 'cloud', - 'key_type' => 'autoincrement', - 'name_attcode' => ['name', 'scope'], - 'state_attcode' => '', - 'reconc_keys' => ['provider', 'name'], - 'db_table' => 'priv_oauth_client_google', - 'db_key_field' => 'id', - 'icon' => utils::GetAbsoluteUrlModulesRoot().'itop-oauth-client/assets/img/icons8-google.svg', - 'db_finalclass_field' => '', - 'uniqueness_rules' => [ - 'Username for scope' => - [ - 'attributes' => ['name', 'scope'], - 'filter' => null, - 'disabled' => false, - 'is_blocking' => true, - ], - 'OAuth Server' => - [ - 'attributes' => ['provider', 'scope', 'client_id', 'client_secret'], - 'filter' => null, - 'disabled' => false, - 'is_blocking' => true, - ], - ], - ); - MetaModel::Init_Params($aParams); - MetaModel::Init_InheritAttributes(); - MetaModel::Init_AddAttribute(new AttributeEnum('scope', [ - 'allowed_values' => new ValueSetEnum('EMail'), - 'display_style' => 'list', - 'sql' => 'scope', - 'default_value' => 'EMail', - 'is_null_allowed' => false, - 'depends_on' => [], - 'always_load_in_tables' => true, - ])); - - MetaModel::Init_SetZListItems('details', [ - 'name', - 'status', - 'description', - 'provider', - 'scope', - 'redirect_url', - 'client_id', - 'client_secret', - 'mailbox_list', - ]); - MetaModel::Init_SetZListItems('standard_search', [ - 'name', - 'provider', - 'status', - ]); - MetaModel::Init_SetZListItems('list', [ - 'status', - 'provider', - ]); - } - - public function PrefillCreationForm(&$aContextParam) - { - $this->Set('provider', 'Google'); - $this->Set('scope', 'EMail'); - $this->Set('redirect_url', OAuthClientProviderFactory::GetRedirectUri()); - - parent::PrefillCreationForm($aContextParam); - } - - public function GetAttributeFlags($sAttCode, &$aReasons = array(), $sTargetState = '') - { - if ($sAttCode == 'provider' || $sAttCode == 'scope' || $sAttCode == 'redirect_url') { - return OPT_ATT_READONLY; - } - - return parent::GetAttributeFlags($sAttCode, $aReasons, $sTargetState); - } - - public function GetInitialStateAttributeFlags($sAttCode, &$aReasons = array()) - { - if ($sAttCode == 'provider' || $sAttCode == 'scope' || $sAttCode == 'redirect_url') { - return OPT_ATT_READONLY; - } - - return parent::GetInitialStateAttributeFlags($sAttCode, $aReasons); - } - - /** - * Compute read-only values - * - * @return void - * @throws \ArchivedObjectException - * @throws \CoreException - * @throws \CoreUnexpectedValue - */ - public function ComputeValues() - { - parent::ComputeValues(); - if (empty($this->Get('provider'))) { - $this->Set('provider', 'Google'); - } - if (empty($this->Get('redirect_url'))) { - $this->Set('redirect_url', OAuthClientProviderFactory::GetRedirectUri()); - } - if (empty($this->Get('scope'))) { - $this->Set('scope', 'EMail'); - } - } - - - public function GetDefaultMailServer() - { - return 'imap.gmail.com'; - } - - public function GetScope() - { - return 'https://mail.google.com/'; - } -} \ No newline at end of file diff --git a/datamodels/2.x/itop-oauth-client/src/Service/ApplicationUIExtension.php b/datamodels/2.x/itop-oauth-client/src/Service/ApplicationUIExtension.php new file mode 100644 index 000000000..7fb0b8a53 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/src/Service/ApplicationUIExtension.php @@ -0,0 +1,31 @@ +Get('status') == 'inactive') { + return HILIGHT_CLASS_WARNING; + } elseif ($oObject->Get('used_for_smtp') == 'yes' && $oConfig->Get('email_transport_smtp.username') == $oObject->Get('name')) { + return HILIGHT_CLASS_OK; + } + } + + return HILIGHT_CLASS_NONE; + } +} \ No newline at end of file diff --git a/datamodels/2.x/itop-oauth-client/src/Service/PopupMenuExtension.php b/datamodels/2.x/itop-oauth-client/src/Service/PopupMenuExtension.php index 6ca4783b4..106b0ea83 100644 --- a/datamodels/2.x/itop-oauth-client/src/Service/PopupMenuExtension.php +++ b/datamodels/2.x/itop-oauth-client/src/Service/PopupMenuExtension.php @@ -41,7 +41,7 @@ class PopupMenuExtension implements \iPopupMenuExtension $sId = $oObj->GetKey(); $sAjaxUri = utils::GetAbsoluteUrlModulePage(static::MODULE_CODE, 'ajax.php'); // Add a new menu item that triggers a custom JS function defined in our own javascript file: js/sample.js - $sJSFileUrl = utils::GetAbsoluteUrlModulesRoot().static::MODULE_CODE.'/assets/js/oauth_connect.js'; + $sJSFileUrl = 'env-'.utils::GetCurrentEnvironment().'/'.static::MODULE_CODE.'/assets/js/oauth_connect.js'; $sRedirectUri = OAuthClientProviderFactory::GetRedirectUri(); $aResult[] = new JSPopupMenuItem( $sMenu.' from '.$sObjClass, @@ -51,8 +51,8 @@ class PopupMenuExtension implements \iPopupMenuExtension ); if ($bHasToken) { - $sScope = $oObj->Get('scope'); - if ($sScope == 'EMail') { + $aScopes = $oObj->Get('scope')->GetValues(); + if (in_array('IMAP', $aScopes)) { $aParams = $oAppContext->GetAsHash(); $sMenu = 'Menu:CreateMailbox'; $sObjClass = get_class($oObj); diff --git a/datamodels/2.x/itop-oauth-client/templates/CreateMailbox.html.twig b/datamodels/2.x/itop-oauth-client/templates/CreateMailbox.html.twig new file mode 100644 index 000000000..578bce7b0 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/templates/CreateMailbox.html.twig @@ -0,0 +1,3 @@ +{# @copyright Copyright (C) 2010-2022 Combodo SARL #} +{# @license http://opensource.org/licenses/AGPL-3.0 #} + diff --git a/datamodels/2.x/itop-oauth-client/templates/CreateMailbox.ready.js.twig b/datamodels/2.x/itop-oauth-client/templates/CreateMailbox.ready.js.twig new file mode 100644 index 000000000..8b3d10330 --- /dev/null +++ b/datamodels/2.x/itop-oauth-client/templates/CreateMailbox.ready.js.twig @@ -0,0 +1,4 @@ +{# @copyright Copyright (C) 2010-2022 Combodo SARL #} +{# @license http://opensource.org/licenses/AGPL-3.0 #} + +window.location.href = '{{ sURL|raw }}' \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/config/services.php b/datamodels/2.x/itop-portal-base/portal/config/services.php new file mode 100644 index 000000000..cd8bab085 --- /dev/null +++ b/datamodels/2.x/itop-portal-base/portal/config/services.php @@ -0,0 +1,48 @@ +services()->set($sController, $sController) + ->public() + ->tag('controller.service_arguments') + ->tag('container.service_suscriber') + ->autowire() + ->autoconfigure(); + } + +}; \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/src/Controller/ObjectController.php b/datamodels/2.x/itop-portal-base/portal/src/Controller/ObjectController.php index dca04b01e..9f7e84a4d 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Controller/ObjectController.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Controller/ObjectController.php @@ -589,6 +589,8 @@ class ObjectController extends BrickController $oSecurityHelper = $this->get('security_helper'); /** @var \Combodo\iTop\Portal\Helper\ScopeValidatorHelper $oScopeValidator */ $oScopeValidator = $this->get('scope_validator'); + /** @var \Combodo\iTop\Portal\Helper\ObjectFormHandlerHelper $oFormHandlerHelper */ + $oFormHandlerHelper = $this->get('object_form_handler'); $aData = array( 'results' => array( @@ -640,16 +642,14 @@ class ObjectController extends BrickController // Updating host object with form data / values $sFormManagerClass = $aRequestContent['formmanager_class']; $sFormManagerData = $aRequestContent['formmanager_data']; - if (!empty($sFormManagerClass) && !empty($sFormManagerData)) - { + if (!empty($sFormManagerClass) && !empty($sFormManagerData)) { /** @var \Combodo\iTop\Portal\Form\ObjectFormManager $oFormManager */ $oFormManager = $sFormManagerClass::FromJSON($sFormManagerData); - $oFormManager->SetContainer($this->container); + $oFormManager->SetObjectFormHandlerHelper($oFormHandlerHelper); $oFormManager->SetObject($oHostObject); // Applying action rules if present - if (($oFormManager->GetActionRulesToken() !== null) && ($oFormManager->GetActionRulesToken() !== '')) - { + if (($oFormManager->GetActionRulesToken() !== null) && ($oFormManager->GetActionRulesToken() !== '')) { $aActionRules = ContextManipulatorHelper::DecodeRulesToken($oFormManager->GetActionRulesToken()); $oObj = $oFormManager->GetObject(); $oContextManipulator->PrepareObject($aActionRules, $oObj); @@ -769,13 +769,14 @@ class ObjectController extends BrickController $oSecurityHelper = $this->get('security_helper'); /** @var \Combodo\iTop\Portal\Helper\ScopeValidatorHelper $oScopeValidator */ $oScopeValidator = $this->get('scope_validator'); - + /** @var \Combodo\iTop\Portal\Helper\ObjectFormHandlerHelper $oFormHandlerHelper */ + $oFormHandlerHelper = $this->get('object_form_handler'); $aData = array( - 'sMode' => 'search_regular', - 'sTargetAttCode' => $sTargetAttCode, - 'sHostObjectClass' => $sHostObjectClass, - 'sHostObjectId' => $sHostObjectId, + 'sMode' => 'search_regular', + 'sTargetAttCode' => $sTargetAttCode, + 'sHostObjectClass' => $sHostObjectClass, + 'sHostObjectId' => $sHostObjectId, 'sActionRulesToken' => $oRequestManipulator->ReadParam('ar_token', ''), ); @@ -807,16 +808,14 @@ class ObjectController extends BrickController // Updating host object with form data / values $sFormManagerClass = $oRequestManipulator->ReadParam('formmanager_class', '', FILTER_UNSAFE_RAW); $sFormManagerData = $oRequestManipulator->ReadParam('formmanager_data', '', FILTER_UNSAFE_RAW); - if (!empty($sFormManagerClass) && !empty($sFormManagerData)) - { + if (!empty($sFormManagerClass) && !empty($sFormManagerData)) { /** @var \Combodo\iTop\Portal\Form\ObjectFormManager $oFormManager */ $oFormManager = $sFormManagerClass::FromJSON($sFormManagerData); - $oFormManager->SetContainer($this->container); + $oFormManager->SetObjectFormHandlerHelper($oFormHandlerHelper); $oFormManager->SetObject($oHostObject); // Applying action rules if present - if (($oFormManager->GetActionRulesToken() !== null) && ($oFormManager->GetActionRulesToken() !== '')) - { + if (($oFormManager->GetActionRulesToken() !== null) && ($oFormManager->GetActionRulesToken() !== '')) { $aActionRules = ContextManipulatorHelper::DecodeRulesToken($oFormManager->GetActionRulesToken()); $oObj = $oFormManager->GetObject(); $oContextManipulator->PrepareObject($aActionRules, $oObj); diff --git a/datamodels/2.x/itop-portal-base/portal/src/EventListener/ExceptionListener.php b/datamodels/2.x/itop-portal-base/portal/src/EventListener/ExceptionListener.php index bde7d0f60..57f1b3c1a 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/EventListener/ExceptionListener.php +++ b/datamodels/2.x/itop-portal-base/portal/src/EventListener/ExceptionListener.php @@ -117,11 +117,15 @@ class ExceptionListener implements ContainerAwareInterface $oResponse->setStatusCode($iStatusCode); // HttpExceptionInterface is a special type of exception that holds status code and header details - if ($oException instanceof HttpExceptionInterface) - { + if ($oException instanceof HttpExceptionInterface) { $oResponse->headers->replace($oException->getHeaders()); } + // display original error page when app debug is on + if (($_SERVER['APP_DEBUG'] == 1)) { + return; + } + // Send the modified response object to the event $oEvent->setResponse($oResponse); } diff --git a/datamodels/2.x/itop-portal-base/portal/src/Form/ObjectFormManager.php b/datamodels/2.x/itop-portal-base/portal/src/Form/ObjectFormManager.php index 48e5cd1be..3f811a29e 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Form/ObjectFormManager.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Form/ObjectFormManager.php @@ -31,6 +31,7 @@ use Combodo\iTop\Form\Field\LabelField; use Combodo\iTop\Form\Form; use Combodo\iTop\Form\FormManager; use Combodo\iTop\Portal\Helper\ApplicationHelper; +use Combodo\iTop\Portal\Helper\ObjectFormHandlerHelper; use DBObject; use DBObjectSearch; use DBObjectSet; @@ -42,7 +43,6 @@ use Exception; use InlineImage; use IssueLog; use MetaModel; -use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\HttpException; use UserRights; @@ -65,8 +65,6 @@ class ObjectFormManager extends FormManager /** @var string ENUM_MODE_APPLY_STIMULUS */ const ENUM_MODE_APPLY_STIMULUS = 'apply_stimulus'; - /** @var \Symfony\Component\DependencyInjection\ContainerInterface $oContainer */ - protected $oContainer; /** @var \cmdbAbstractObject $oObject */ protected $oObject; /** @var string $sMode */ @@ -85,6 +83,13 @@ class ObjectFormManager extends FormManager */ protected $aHiddenFieldsId = array(); + /** + * @var ObjectFormHandlerHelper $oFormHandlerHelper + * @since 3.1.0 Replace container. Allow access to others applications services. + */ + private $oFormHandlerHelper; + + /** * @param string|array $formManagerData value of the formmanager_data portal parameter, either JSON or object * @@ -93,7 +98,7 @@ class ObjectFormManager extends FormManager * @since 2.7.6 3.0.0 N°4384 method creation : factorize as this is used twice now * @since 2.7.7 3.0.1 N°4867 now only used once, but we decided to keep this method anyway */ - protected static function DecodeFormManagerData($formManagerData) + public static function DecodeFormManagerData($formManagerData) { if (is_array($formManagerData)) { return $formManagerData; @@ -172,23 +177,15 @@ class ObjectFormManager extends FormManager } /** - * - * @return \Symfony\Component\DependencyInjection\ContainerInterface - */ - public function GetContainer() - { - return $this->oContainer; - } - - /** - * - * @param \Symfony\Component\DependencyInjection\ContainerInterface $oContainer + * @param \Combodo\iTop\Portal\Helper\ObjectFormHandlerHelper $oFormHandlerHelper * * @return $this + * @since 3.1.0 + * */ - public function SetContainer(ContainerInterface $oContainer) + public function SetObjectFormHandlerHelper(ObjectFormHandlerHelper $oFormHandlerHelper) { - $this->oContainer = $oContainer; + $this->oFormHandlerHelper = $oFormHandlerHelper; return $this; } @@ -429,28 +426,21 @@ class ObjectFormManager extends FormManager break; } // - The layout - if ($this->aFormProperties['layout'] !== null) - { + if ($this->aFormProperties['layout'] !== null) { // Checking if we need to render the template from twig to html in order to parse the fields - if ($this->aFormProperties['layout']['type'] === 'twig') - { - if ($this->oContainer !== null) - { + if ($this->aFormProperties['layout']['type'] === 'twig') { + + if ($this->oFormHandlerHelper !== null) { /** @var \Combodo\iTop\Portal\Helper\ObjectFormHandlerHelper $oObjectFormHandler */ - $oObjectFormHandler = $this->oContainer->get('object_form_handler'); - $sRendered = $oObjectFormHandler->RenderFormFromTwig( + $sRendered = $this->oFormHandlerHelper->RenderFormFromTwig( $oForm->GetId(), $this->aFormProperties['layout']['content'], array('oRenderer' => $this->oRenderer, 'oObject' => $this->oObject) ); - } - else - { + } else { $sRendered = 'Form not rendered because of missing container'; } - } - else - { + } else { $sRendered = $this->aFormProperties['layout']['content']; } @@ -742,42 +732,36 @@ class ObjectFormManager extends FormManager } // - Field that require a search endpoint if (in_array(get_class($oField), - array('Combodo\\iTop\\Form\\Field\\SelectObjectField', 'Combodo\\iTop\\Form\\Field\\LinkedSetField'))) - { + array('Combodo\\iTop\\Form\\Field\\SelectObjectField', 'Combodo\\iTop\\Form\\Field\\LinkedSetField'))) { /** @var \Combodo\iTop\Form\Field\SelectObjectField|\Combodo\iTop\Form\Field\LinkedSetField $oField */ - if ($this->oContainer !== null) - { - $sSearchEndpoint = $this->oContainer->get('url_generator')->generate('p_object_search_generic', array( - 'sTargetAttCode' => $oAttDef->GetCode(), + if ($this->oFormHandlerHelper !== null) { + $sSearchEndpoint = $this->oFormHandlerHelper->GetUrlGenerator()->generate('p_object_search_generic', array( + 'sTargetAttCode' => $oAttDef->GetCode(), 'sHostObjectClass' => get_class($this->oObject), - 'sHostObjectId' => ($this->oObject->IsNew()) ? null : $this->oObject->GetKey(), - 'ar_token' => $this->GetActionRulesToken(), + 'sHostObjectId' => ($this->oObject->IsNew()) ? null : $this->oObject->GetKey(), + 'ar_token' => $this->GetActionRulesToken(), )); $oField->SetSearchEndpoint($sSearchEndpoint); } } // - Field that require an information endpoint - if (in_array(get_class($oField), array('Combodo\\iTop\\Form\\Field\\LinkedSetField'))) - { + if (in_array(get_class($oField), array('Combodo\\iTop\\Form\\Field\\LinkedSetField'))) { /** @var \Combodo\iTop\Form\Field\LinkedSetField $oField */ - if ($this->oContainer !== null) - { - $oField->SetInformationEndpoint($this->oContainer->get('url_generator')->generate('p_object_get_information_json')); + if ($this->oFormHandlerHelper !== null) { + $oField->SetInformationEndpoint($this->oFormHandlerHelper->GetUrlGenerator()->generate('p_object_get_information_json')); } } // - Field that require to apply scope on its DM OQL if (in_array(get_class($oField), array('Combodo\\iTop\\Form\\Field\\SelectObjectField'))) { /** @var \Combodo\iTop\Form\Field\SelectObjectField $oField */ - if ($this->oContainer !== null) - { + if ($this->oFormHandlerHelper !== null) { $oScopeOriginal = ($oField->GetSearch() !== null) ? $oField->GetSearch() : DBSearch::FromOQL($oAttDef->GetValuesDef()->GetFilterExpression()); /** @var \DBSearch $oScopeSearch */ - $oScopeSearch = $this->oContainer->get('scope_validator')->GetScopeFilterForProfiles(UserRights::ListProfiles(), + $oScopeSearch = $this->oFormHandlerHelper->GetScopeValidator()->GetScopeFilterForProfiles(UserRights::ListProfiles(), $oScopeOriginal->GetClass(), UR_ACTION_READ); - if ($oScopeSearch === null) - { + if ($oScopeSearch === null) { IssueLog::Info(__METHOD__.' at line '.__LINE__.' : User #'.UserRights::GetUserId().' has no scope query for '.$oScopeOriginal->GetClass().' class.'); throw new HttpException(Response::HTTP_NOT_FOUND, Dict::S('UI:ObjectDoesNotExist')); } @@ -817,15 +801,14 @@ class ObjectFormManager extends FormManager if (in_array(get_class($oCustomField), array('Combodo\\iTop\\Form\\Field\\SelectObjectField'))) { /** @var \Combodo\iTop\Form\Field\SelectObjectField $oCustomField */ - if ($this->oContainer !== null) - { + if ($this->oFormHandlerHelper->getUrlGenerator() !== null) { - $sSearchEndpoint = $this->oContainer->get('url_generator')->generate('p_object_search_generic', + $sSearchEndpoint = $this->oFormHandlerHelper->GetUrlGenerator()->generate('p_object_search_generic', array( - 'sTargetAttCode' => $oAttDef->GetCode(), + 'sTargetAttCode' => $oAttDef->GetCode(), 'sHostObjectClass' => get_class($this->oObject), - 'sHostObjectId' => ($this->oObject->IsNew()) ? null : $this->oObject->GetKey(), - 'ar_token' => $this->GetActionRulesToken(), + 'sHostObjectId' => ($this->oObject->IsNew()) ? null : $this->oObject->GetKey(), + 'ar_token' => $this->GetActionRulesToken(), )); $oCustomField->SetSearchEndpoint($sSearchEndpoint); } @@ -860,15 +843,13 @@ class ObjectFormManager extends FormManager /** @var \Combodo\iTop\Form\Field\LinkedSetField $oField */ /** @var \AttributeLinkedSetIndirect $oAttDef */ // - Overriding attributes to display - if ($this->oContainer !== null) - { + if ($this->oFormHandlerHelper !== null) { // Note : This snippet is inspired from AttributeLinkedSet::MakeFormField() - $aAttCodesToDisplay = ApplicationHelper::GetLoadedListFromClass($this->oContainer->getParameter('combodo.portal.instance.conf')['lists'], + $aAttCodesToDisplay = ApplicationHelper::GetLoadedListFromClass($this->oFormHandlerHelper->getCombodoPortalConf()['lists'], $oField->GetTargetClass(), 'list'); // - Adding friendlyname attribute to the list is not already in it $sTitleAttCode = 'friendlyname'; - if (($sTitleAttCode !== null) && !in_array($sTitleAttCode, $aAttCodesToDisplay)) - { + if (($sTitleAttCode !== null) && !in_array($sTitleAttCode, $aAttCodesToDisplay)) { $aAttCodesToDisplay = array_merge(array($sTitleAttCode), $aAttCodesToDisplay); } // - Adding attribute labels @@ -881,25 +862,19 @@ class ObjectFormManager extends FormManager $oField->SetAttributesToDisplay($aAttributesToDisplay); } // - Filtering links regarding scopes - if ($this->oContainer !== null) - { + if ($this->oFormHandlerHelper !== null) { $aLimitedAccessItemIDs = array(); /** @var \ormLinkSet $oFieldOriginalSet */ $oFieldOriginalSet = $oField->GetCurrentValue(); - while ($oLink = $oFieldOriginalSet->Fetch()) - { - if ($oField->IsIndirect()) - { + while ($oLink = $oFieldOriginalSet->Fetch()) { + if ($oField->IsIndirect()) { $iRemoteKey = $oLink->Get($oAttDef->GetExtKeyToRemote()); - } - else - { + } else { $iRemoteKey = $oLink->GetKey(); } - if (!$this->oContainer->get('security_helper')->IsActionAllowed(UR_ACTION_READ, $oField->GetTargetClass(), $iRemoteKey)) - { + if (!$this->oFormHandlerHelper->getSecurityHelper()->IsActionAllowed(UR_ACTION_READ, $oField->GetTargetClass(), $iRemoteKey)) { $aLimitedAccessItemIDs[] = $iRemoteKey; } } @@ -921,23 +896,22 @@ class ObjectFormManager extends FormManager if (in_array(get_class($oField), array('Combodo\\iTop\\Form\\Field\\BlobField', 'Combodo\\iTop\\Form\\Field\\ImageField'))) { // - Overriding attributes to display - if ($this->oContainer !== null) - { + if ($this->oFormHandlerHelper !== null) { // Override hardcoded URLs in ormDocument pointing to back office console $oOrmDoc = $this->oObject->Get($sAttCode); - $sDisplayUrl = $this->oContainer->get('url_generator')->generate('p_object_document_display', [ + $sDisplayUrl = $this->oFormHandlerHelper->getUrlGenerator()->generate('p_object_document_display', [ 'sObjectClass' => get_class($this->oObject), - 'sObjectId' => $this->oObject->GetKey(), + 'sObjectId' => $this->oObject->GetKey(), 'sObjectField' => $sAttCode, - 'cache' => 86400, - 's' => $oOrmDoc->GetSignature(), - ]); - $sDownloadUrl = $this->oContainer->get('url_generator')->generate('p_object_document_download', [ + 'cache' => 86400, + 's' => $oOrmDoc->GetSignature(), + ]); + $sDownloadUrl = $this->oFormHandlerHelper->getUrlGenerator()->generate('p_object_document_download', [ 'sObjectClass' => get_class($this->oObject), - 'sObjectId' => $this->oObject->GetKey(), + 'sObjectId' => $this->oObject->GetKey(), 'sObjectField' => $sAttCode, - 'cache' => 86400, - 's' => $oOrmDoc->GetSignature(), + 'cache' => 86400, + 's' => $oOrmDoc->GetSignature(), ]); /** @var \Combodo\iTop\Form\Field\BlobField $oField */ $oField->SetDisplayUrl($sDisplayUrl) @@ -1024,11 +998,11 @@ class ObjectFormManager extends FormManager // set id to a unique key - avoid collisions with another attribute that could exist with the name 'attachments' $oField = new FileUploadField('attachments_plugin'); $oField->SetLabel(Dict::S('Portal:Attachments')) - ->SetUploadEndpoint($this->oContainer->get('url_generator')->generate('p_object_attachment_add')) - ->SetDownloadEndpoint($this->oContainer->get('url_generator')->generate('p_object_attachment_download', + ->SetUploadEndpoint($this->oFormHandlerHelper->getUrlGenerator()->generate('p_object_attachment_add')) + ->SetDownloadEndpoint($this->oFormHandlerHelper->getUrlGenerator()->generate('p_object_attachment_download', array('sAttachmentId' => '-sAttachmentId-'))) ->SetTransactionId($oForm->GetTransactionId()) - ->SetAllowDelete($this->oContainer->getParameter('combodo.portal.instance.conf')['properties']['attachments']['allow_delete']) + ->SetAllowDelete($this->oFormHandlerHelper->getCombodoPortalConf()['properties']['attachments']['allow_delete']) ->SetObject($this->oObject); // Checking if we can edit attachments in the current state @@ -1148,7 +1122,7 @@ class ObjectFormManager extends FormManager $bActivateTriggers = (!$bIsNew && $bWasModified); // Forcing allowed writing on the object if necessary. This is used in some particular cases. - $bAllowWrite = $this->oContainer->get('security_helper')->IsActionAllowed($bIsNew ? UR_ACTION_CREATE : UR_ACTION_MODIFY, $sObjectClass, $this->oObject->GetKey()); + $bAllowWrite = $this->oFormHandlerHelper->getSecurityHelper()->IsActionAllowed($bIsNew ? UR_ACTION_CREATE : UR_ACTION_MODIFY, $sObjectClass, $this->oObject->GetKey()); if ($bAllowWrite) { $this->oObject->AllowWrite(true); } @@ -1181,7 +1155,7 @@ class ObjectFormManager extends FormManager // Activating triggers only on update if ($bActivateTriggers) { - $sTriggersQuery = $this->oContainer->getParameter('combodo.portal.instance.conf')['properties']['triggers_query']; + $sTriggersQuery = $this->oFormHandlerHelper->getCombodoPortalConf()['properties']['triggers_query']; if ($sTriggersQuery !== null) { $aParentClasses = MetaModel::EnumParentClasses($sObjectClass, ENUM_PARENT_CLASSES_ALL); diff --git a/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php b/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php index e77312602..094e83c7b 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Helper/ObjectFormHandlerHelper.php @@ -81,8 +81,6 @@ class ObjectFormHandlerHelper private $sPortalId; /** @var \Combodo\iTop\Portal\Twig\AppExtension $oAppExtension */ private $oAppExtension; - /** @var \Symfony\Component\DependencyInjection\ContainerInterface $oContainer */ - private $oContainer; /** * ObjectFormHandlerHelper constructor. @@ -96,9 +94,11 @@ class ObjectFormHandlerHelper * @param array $aCombodoPortalInstanceConf * @param string $sPortalId * @param \Combodo\iTop\Portal\Twig\AppExtension $oAppExtension - * @param \Symfony\Component\DependencyInjection\ContainerInterface $oContainer */ - public function __construct(RequestManipulatorHelper $oRequestManipulator, ContextManipulatorHelper $oContextManipulator, NavigationRuleHelper $oNavigationRuleHelper, ScopeValidatorHelper $oScopeValidator, SecurityHelper $oSecurityHelper, UrlGeneratorInterface $oUrlGenerator, $aCombodoPortalInstanceConf, $sPortalId, AppExtension $oAppExtension, ContainerInterface $oContainer) + public function __construct( + RequestManipulatorHelper $oRequestManipulator, ContextManipulatorHelper $oContextManipulator, NavigationRuleHelper $oNavigationRuleHelper, ScopeValidatorHelper $oScopeValidator, SecurityHelper $oSecurityHelper, UrlGeneratorInterface $oUrlGenerator, $aCombodoPortalInstanceConf, $sPortalId, + AppExtension $oAppExtension + ) { $this->oRequestManipulator = $oRequestManipulator; $this->oContextManipulator = $oContextManipulator; @@ -109,7 +109,6 @@ class ObjectFormHandlerHelper $this->aCombodoPortalInstanceConf = $aCombodoPortalInstanceConf; $this->sPortalId = $sPortalId; $this->oAppExtension = $oAppExtension; - $this->oContainer = $oContainer; } /** @@ -271,13 +270,13 @@ class ObjectFormHandlerHelper } $oFormRenderer = new BsFormRenderer(); - if($sFormEndpoint !== null) - { + if ($sFormEndpoint !== null) { $oFormRenderer->SetEndpoint($sFormEndpoint); } $oFormManager = new ObjectFormManager(); - $oFormManager->SetContainer($this->oContainer) + $oFormManager + ->SetObjectFormHandlerHelper($this) ->SetObject($oObject) ->SetMode($sMode) ->SetActionRulesToken($sActionRulesToken) @@ -301,7 +300,7 @@ class ObjectFormHandlerHelper $this->CheckReadFormDataAllowed($sFormManagerData); $oFormManager = $sFormManagerClass::FromJSON($sFormManagerData); - $oFormManager->SetContainer($this->oContainer); + $oFormManager->SetObjectFormHandlerHelper($this); // Applying action rules if present if (($oFormManager->GetActionRulesToken() !== null) && ($oFormManager->GetActionRulesToken() !== '')) { @@ -441,9 +440,9 @@ class ObjectFormHandlerHelper /** * Check if read object include in form data is allowed, throw an exception otherwise. * - * @since 2.7.7 + * @since 2.7.7 3.0.2 3.1.0 * - * @param $sFormManagerData form data to check + * @param string $sFormManagerData form data to check * * @return void * @throws \CoreException @@ -452,8 +451,9 @@ class ObjectFormHandlerHelper * @throws \MySQLHasGoneAwayException * @throws \OQLException */ - public function CheckReadFormDataAllowed($sFormManagerData){ - $aJsonFromData = json_decode($sFormManagerData, true); + public function CheckReadFormDataAllowed($sFormManagerData) + { + $aJsonFromData = ObjectFormManager::DecodeFormManagerData($sFormManagerData); if(isset($aJsonFromData['formobject_class']) && isset($aJsonFromData['formobject_id']) && !$this->oSecurityHelper->IsActionAllowed(UR_ACTION_READ, $aJsonFromData['formobject_class'], $aJsonFromData['formobject_id'])){ @@ -475,4 +475,44 @@ class ObjectFormHandlerHelper static::ENUM_MODE_CREATE, ); } + + /** + * @return \Combodo\iTop\Portal\Routing\UrlGenerator|\Symfony\Component\Routing\Generator\UrlGeneratorInterface + * @since 3.1 + * + */ + public function getUrlGenerator() + { + return $this->oUrlGenerator; + } + + /** + * @return \Combodo\iTop\Portal\Helper\SecurityHelper + * @since 3.1 + * + */ + public function getSecurityHelper(): SecurityHelper + { + return $this->oSecurityHelper; + } + + /** + * @return \Combodo\iTop\Portal\Helper\ScopeValidatorHelper + * @since 3.1.0 + * + */ + public function GetScopeValidator(): ScopeValidatorHelper + { + return $this->oScopeValidator; + } + + /** + * @return array + * @since 3.1.0 + * + */ + public function GetCombodoPortalConf(): array + { + return $this->aCombodoPortalInstanceConf; + } } \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/src/Routing/ItopExtensionsExtraRoutes.php b/datamodels/2.x/itop-portal-base/portal/src/Routing/ItopExtensionsExtraRoutes.php index 88070e3a6..35c759ac3 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Routing/ItopExtensionsExtraRoutes.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Routing/ItopExtensionsExtraRoutes.php @@ -34,6 +34,12 @@ class ItopExtensionsExtraRoutes /** @var array $aRoutes */ static private $aRoutes = array(); + /** + * @var array $aControllersClasses + * @since 3.1.0 + */ + static private $aControllersClasses = array(); + /** * @param array $extraRoutes * @@ -41,8 +47,7 @@ class ItopExtensionsExtraRoutes */ public static function AddRoutes($extraRoutes) { - if (!is_array($extraRoutes)) - { + if (!is_array($extraRoutes)) { throw new Exception('Only array are allowed as parameter to '.__METHOD__); } @@ -56,4 +61,28 @@ class ItopExtensionsExtraRoutes { return self::$aRoutes; } + + /** + * @param array $extraControllersClasses + * + * @throws Exception + * @since 3.1.0 + */ + public static function AddControllersClasses($extraControllersClasses) + { + if (!is_array($extraControllersClasses)) { + throw new Exception('Only array are allowed as parameter to '.__METHOD__); + } + + self::$aControllersClasses = array_merge(self::$aControllersClasses, $extraControllersClasses); + } + + /** + * @return array + * @since 3.1.0 + */ + public static function GetControllersClasses() + { + return self::$aControllersClasses; + } } \ No newline at end of file diff --git a/datamodels/2.x/itop-portal/datamodel.itop-portal.xml b/datamodels/2.x/itop-portal/datamodel.itop-portal.xml index 4fd5b33bc..54449d82e 100644 --- a/datamodels/2.x/itop-portal/datamodel.itop-portal.xml +++ b/datamodels/2.x/itop-portal/datamodel.itop-portal.xml @@ -151,8 +151,7 @@ - 500 - true + 500 diff --git a/datamodels/2.x/itop-problem-mgmt/dictionaries/pl.dict.itop-problem-mgmt.php b/datamodels/2.x/itop-problem-mgmt/dictionaries/pl.dict.itop-problem-mgmt.php index d0f0b23c7..0f2cc487d 100644 --- a/datamodels/2.x/itop-problem-mgmt/dictionaries/pl.dict.itop-problem-mgmt.php +++ b/datamodels/2.x/itop-problem-mgmt/dictionaries/pl.dict.itop-problem-mgmt.php @@ -1,151 +1,151 @@ - - */ - -// Dictionnay conventions -// Class: -// Class:+ -// Class:/Attribute: -// Class:/Attribute:+ -// Class:/Attribute:/Value: -// Class:/Attribute:/Value:+ -// Class:/Stimulus: -// Class:/Stimulus:+ - -////////////////////////////////////////////////////////////////////// -// Classes in 'bizmodel' -////////////////////////////////////////////////////////////////////// -// - -// Dictionnay conventions -// Class: -// Class:+ -// Class:/Attribute: -// Class:/Attribute:+ -// Class:/Attribute:/Value: -// Class:/Attribute:/Value:+ -// Class:/Stimulus: -// Class:/Stimulus:+ - - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Menu:ProblemManagement' => 'Zarządzanie problemami', - 'Menu:ProblemManagement+' => 'Zarządzanie problemami', - 'Menu:Problem:Overview' => 'Przegląd', - 'Menu:Problem:Overview+' => 'Przegląd', - 'Menu:NewProblem' => 'Nowy problem', - 'Menu:NewProblem+' => 'Nowy problem', - 'Menu:SearchProblems' => 'Wyszukaj problemy', - 'Menu:SearchProblems+' => 'Wyszukaj problemy', - 'Menu:Problem:Shortcuts' => 'Skróty', - 'Menu:Problem:MyProblems' => 'Moje problemy', - 'Menu:Problem:MyProblems+' => 'Moje problemy', - 'Menu:Problem:OpenProblems' => 'Wszystkie otwarte problemy', - 'Menu:Problem:OpenProblems+' => 'Wszystkie otwarte problemy', - 'UI-ProblemManagementOverview-ProblemByService' => 'Problemy według usług', - 'UI-ProblemManagementOverview-ProblemByService+' => 'Problemy według usług', - 'UI-ProblemManagementOverview-ProblemByPriority' => 'Problemy według priorytetu', - 'UI-ProblemManagementOverview-ProblemByPriority+' => 'Problemy według priorytetu', - 'UI-ProblemManagementOverview-ProblemUnassigned' => 'Nieprzypisane problemy', - 'UI-ProblemManagementOverview-ProblemUnassigned+' => 'Nieprzypisane problemy', - 'UI:ProblemMgmtMenuOverview:Title' => 'Pulpit do zarządzania problemami', - 'UI:ProblemMgmtMenuOverview:Title+' => 'Pulpit do zarządzania problemami', - -)); -// -// Class: Problem -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:Problem' => 'Problem', - 'Class:Problem+' => '', - 'Class:Problem/Attribute:status' => 'Status', - 'Class:Problem/Attribute:status+' => '', - 'Class:Problem/Attribute:status/Value:new' => 'Nowy', - 'Class:Problem/Attribute:status/Value:new+' => '', - 'Class:Problem/Attribute:status/Value:assigned' => 'Przydzielony', - 'Class:Problem/Attribute:status/Value:assigned+' => '', - 'Class:Problem/Attribute:status/Value:resolved' => 'Rozwiązany', - 'Class:Problem/Attribute:status/Value:resolved+' => '', - 'Class:Problem/Attribute:status/Value:closed' => 'Zamknięty', - 'Class:Problem/Attribute:status/Value:closed+' => '', - 'Class:Problem/Attribute:service_id' => 'Usługa', - 'Class:Problem/Attribute:service_id+' => '', - 'Class:Problem/Attribute:service_name' => 'Nazwa usługi', - 'Class:Problem/Attribute:service_name+' => '', - 'Class:Problem/Attribute:servicesubcategory_id' => 'Podkategoria usług', - 'Class:Problem/Attribute:servicesubcategory_id+' => '', - 'Class:Problem/Attribute:servicesubcategory_name' => 'Podkategoria usług', - 'Class:Problem/Attribute:servicesubcategory_name+' => '', - 'Class:Problem/Attribute:product' => 'Produkt', - 'Class:Problem/Attribute:product+' => '', - 'Class:Problem/Attribute:impact' => 'Wpływ', - 'Class:Problem/Attribute:impact+' => '', - 'Class:Problem/Attribute:impact/Value:1' => 'Wydział', - 'Class:Problem/Attribute:impact/Value:1+' => '', - 'Class:Problem/Attribute:impact/Value:2' => 'Usługa', - 'Class:Problem/Attribute:impact/Value:2+' => '', - 'Class:Problem/Attribute:impact/Value:3' => 'Osoba', - 'Class:Problem/Attribute:impact/Value:3+' => '', - 'Class:Problem/Attribute:urgency' => 'Pilność', - 'Class:Problem/Attribute:urgency+' => '', - 'Class:Problem/Attribute:urgency/Value:1' => 'krytyczna', - 'Class:Problem/Attribute:urgency/Value:1+' => 'krytyczna', - 'Class:Problem/Attribute:urgency/Value:2' => 'wysoka', - 'Class:Problem/Attribute:urgency/Value:2+' => 'wysoka', - 'Class:Problem/Attribute:urgency/Value:3' => 'średnia', - 'Class:Problem/Attribute:urgency/Value:3+' => 'średnia', - 'Class:Problem/Attribute:urgency/Value:4' => 'niska', - 'Class:Problem/Attribute:urgency/Value:4+' => 'niska', - 'Class:Problem/Attribute:priority' => 'Priorytet', - 'Class:Problem/Attribute:priority+' => '', - 'Class:Problem/Attribute:priority/Value:1' => 'krytyczny', - 'Class:Problem/Attribute:priority/Value:1+' => 'krytyczny', - 'Class:Problem/Attribute:priority/Value:2' => 'wysoki', - 'Class:Problem/Attribute:priority/Value:2+' => 'wysoki', - 'Class:Problem/Attribute:priority/Value:3' => 'średni', - 'Class:Problem/Attribute:priority/Value:3+' => 'średni', - 'Class:Problem/Attribute:priority/Value:4' => 'niski', - 'Class:Problem/Attribute:priority/Value:4+' => 'niski', - 'Class:Problem/Attribute:related_change_id' => 'Powiązana zmiana', - 'Class:Problem/Attribute:related_change_id+' => '', - 'Class:Problem/Attribute:related_change_ref' => 'Odniesienie do powiązanej zmiany', - 'Class:Problem/Attribute:related_change_ref+' => '', - 'Class:Problem/Attribute:assignment_date' => 'Data przydziału', - 'Class:Problem/Attribute:assignment_date+' => '', - 'Class:Problem/Attribute:resolution_date' => 'Data rozwiązania', - 'Class:Problem/Attribute:resolution_date+' => '', - 'Class:Problem/Attribute:knownerrors_list' => 'Znane błędy', - 'Class:Problem/Attribute:knownerrors_list+' => 'Wszystkie znane błędy związane z tym problemem', - 'Class:Problem/Attribute:related_request_list' => 'Powiązane zgłoszenia', - 'Class:Problem/Attribute:related_request_list+' => 'Wszystkie zgłoszenia, które są związane z tym problemem', - 'Class:Problem/Attribute:related_incident_list' => 'Powiązane incydenty', - 'Class:Problem/Attribute:related_incident_list+' => 'Wszystkie incydenty związane z tym problemem', - 'Class:Problem/Stimulus:ev_assign' => 'Przydziel', - 'Class:Problem/Stimulus:ev_assign+' => '', - 'Class:Problem/Stimulus:ev_reassign' => 'Przydziel ponownie', - 'Class:Problem/Stimulus:ev_reassign+' => '', - 'Class:Problem/Stimulus:ev_resolve' => 'Rozwiąż', - 'Class:Problem/Stimulus:ev_resolve+' => '', - 'Class:Problem/Stimulus:ev_close' => 'Zamknij', - 'Class:Problem/Stimulus:ev_close+' => '', -)); + + */ + +// Dictionnay conventions +// Class: +// Class:+ +// Class:/Attribute: +// Class:/Attribute:+ +// Class:/Attribute:/Value: +// Class:/Attribute:/Value:+ +// Class:/Stimulus: +// Class:/Stimulus:+ + +////////////////////////////////////////////////////////////////////// +// Classes in 'bizmodel' +////////////////////////////////////////////////////////////////////// +// + +// Dictionnay conventions +// Class: +// Class:+ +// Class:/Attribute: +// Class:/Attribute:+ +// Class:/Attribute:/Value: +// Class:/Attribute:/Value:+ +// Class:/Stimulus: +// Class:/Stimulus:+ + + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Menu:ProblemManagement' => 'Zarządzanie problemami', + 'Menu:ProblemManagement+' => 'Zarządzanie problemami', + 'Menu:Problem:Overview' => 'Przegląd', + 'Menu:Problem:Overview+' => 'Przegląd', + 'Menu:NewProblem' => 'Nowy problem', + 'Menu:NewProblem+' => 'Nowy problem', + 'Menu:SearchProblems' => 'Wyszukaj problemy', + 'Menu:SearchProblems+' => 'Wyszukaj problemy', + 'Menu:Problem:Shortcuts' => 'Skróty', + 'Menu:Problem:MyProblems' => 'Moje problemy', + 'Menu:Problem:MyProblems+' => 'Moje problemy', + 'Menu:Problem:OpenProblems' => 'Wszystkie otwarte problemy', + 'Menu:Problem:OpenProblems+' => 'Wszystkie otwarte problemy', + 'UI-ProblemManagementOverview-ProblemByService' => 'Problemy według usług', + 'UI-ProblemManagementOverview-ProblemByService+' => 'Problemy według usług', + 'UI-ProblemManagementOverview-ProblemByPriority' => 'Problemy według priorytetu', + 'UI-ProblemManagementOverview-ProblemByPriority+' => 'Problemy według priorytetu', + 'UI-ProblemManagementOverview-ProblemUnassigned' => 'Nieprzypisane problemy', + 'UI-ProblemManagementOverview-ProblemUnassigned+' => 'Nieprzypisane problemy', + 'UI:ProblemMgmtMenuOverview:Title' => 'Pulpit do zarządzania problemami', + 'UI:ProblemMgmtMenuOverview:Title+' => 'Pulpit do zarządzania problemami', + +)); +// +// Class: Problem +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:Problem' => 'Problem', + 'Class:Problem+' => '', + 'Class:Problem/Attribute:status' => 'Status', + 'Class:Problem/Attribute:status+' => '', + 'Class:Problem/Attribute:status/Value:new' => 'Nowy', + 'Class:Problem/Attribute:status/Value:new+' => '', + 'Class:Problem/Attribute:status/Value:assigned' => 'Przydzielony', + 'Class:Problem/Attribute:status/Value:assigned+' => '', + 'Class:Problem/Attribute:status/Value:resolved' => 'Rozwiązany', + 'Class:Problem/Attribute:status/Value:resolved+' => '', + 'Class:Problem/Attribute:status/Value:closed' => 'Zamknięty', + 'Class:Problem/Attribute:status/Value:closed+' => '', + 'Class:Problem/Attribute:service_id' => 'Usługa', + 'Class:Problem/Attribute:service_id+' => '', + 'Class:Problem/Attribute:service_name' => 'Nazwa usługi', + 'Class:Problem/Attribute:service_name+' => '', + 'Class:Problem/Attribute:servicesubcategory_id' => 'Podkategoria usług', + 'Class:Problem/Attribute:servicesubcategory_id+' => '', + 'Class:Problem/Attribute:servicesubcategory_name' => 'Podkategoria usług', + 'Class:Problem/Attribute:servicesubcategory_name+' => '', + 'Class:Problem/Attribute:product' => 'Produkt', + 'Class:Problem/Attribute:product+' => '', + 'Class:Problem/Attribute:impact' => 'Wpływ', + 'Class:Problem/Attribute:impact+' => '', + 'Class:Problem/Attribute:impact/Value:1' => 'Wydział', + 'Class:Problem/Attribute:impact/Value:1+' => '', + 'Class:Problem/Attribute:impact/Value:2' => 'Usługa', + 'Class:Problem/Attribute:impact/Value:2+' => '', + 'Class:Problem/Attribute:impact/Value:3' => 'Osoba', + 'Class:Problem/Attribute:impact/Value:3+' => '', + 'Class:Problem/Attribute:urgency' => 'Pilność', + 'Class:Problem/Attribute:urgency+' => '', + 'Class:Problem/Attribute:urgency/Value:1' => 'krytyczna', + 'Class:Problem/Attribute:urgency/Value:1+' => 'krytyczna', + 'Class:Problem/Attribute:urgency/Value:2' => 'wysoka', + 'Class:Problem/Attribute:urgency/Value:2+' => 'wysoka', + 'Class:Problem/Attribute:urgency/Value:3' => 'średnia', + 'Class:Problem/Attribute:urgency/Value:3+' => 'średnia', + 'Class:Problem/Attribute:urgency/Value:4' => 'niska', + 'Class:Problem/Attribute:urgency/Value:4+' => 'niska', + 'Class:Problem/Attribute:priority' => 'Priorytet', + 'Class:Problem/Attribute:priority+' => '', + 'Class:Problem/Attribute:priority/Value:1' => 'krytyczny', + 'Class:Problem/Attribute:priority/Value:1+' => 'krytyczny', + 'Class:Problem/Attribute:priority/Value:2' => 'wysoki', + 'Class:Problem/Attribute:priority/Value:2+' => 'wysoki', + 'Class:Problem/Attribute:priority/Value:3' => 'średni', + 'Class:Problem/Attribute:priority/Value:3+' => 'średni', + 'Class:Problem/Attribute:priority/Value:4' => 'niski', + 'Class:Problem/Attribute:priority/Value:4+' => 'niski', + 'Class:Problem/Attribute:related_change_id' => 'Powiązana zmiana', + 'Class:Problem/Attribute:related_change_id+' => '', + 'Class:Problem/Attribute:related_change_ref' => 'Odniesienie do powiązanej zmiany', + 'Class:Problem/Attribute:related_change_ref+' => '', + 'Class:Problem/Attribute:assignment_date' => 'Data przydziału', + 'Class:Problem/Attribute:assignment_date+' => '', + 'Class:Problem/Attribute:resolution_date' => 'Data rozwiązania', + 'Class:Problem/Attribute:resolution_date+' => '', + 'Class:Problem/Attribute:knownerrors_list' => 'Znane błędy', + 'Class:Problem/Attribute:knownerrors_list+' => 'Wszystkie znane błędy związane z tym problemem', + 'Class:Problem/Attribute:related_request_list' => 'Powiązane zgłoszenia', + 'Class:Problem/Attribute:related_request_list+' => 'Wszystkie zgłoszenia, które są związane z tym problemem', + 'Class:Problem/Attribute:related_incident_list' => 'Powiązane incydenty', + 'Class:Problem/Attribute:related_incident_list+' => 'Wszystkie incydenty związane z tym problemem', + 'Class:Problem/Stimulus:ev_assign' => 'Przydziel', + 'Class:Problem/Stimulus:ev_assign+' => '', + 'Class:Problem/Stimulus:ev_reassign' => 'Przydziel ponownie', + 'Class:Problem/Stimulus:ev_reassign+' => '', + 'Class:Problem/Stimulus:ev_resolve' => 'Rozwiąż', + 'Class:Problem/Stimulus:ev_resolve+' => '', + 'Class:Problem/Stimulus:ev_close' => 'Zamknij', + 'Class:Problem/Stimulus:ev_close+' => '', +)); diff --git a/datamodels/2.x/itop-service-mgmt-provider/dictionaries/pl.dict.itop-service-mgmt-provider.php b/datamodels/2.x/itop-service-mgmt-provider/dictionaries/pl.dict.itop-service-mgmt-provider.php index 0e4ec2a67..e2b21b900 100644 --- a/datamodels/2.x/itop-service-mgmt-provider/dictionaries/pl.dict.itop-service-mgmt-provider.php +++ b/datamodels/2.x/itop-service-mgmt-provider/dictionaries/pl.dict.itop-service-mgmt-provider.php @@ -1,539 +1,539 @@ - - */ - -// Dictionnay conventions -// Class: -// Class:+ -// Class:/Attribute: -// Class:/Attribute:+ -// Class:/Attribute:/Value: -// Class:/Attribute:/Value:+ -// Class:/Stimulus: -// Class:/Stimulus:+ - - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Menu:ServiceManagement' => 'Zarządzanie usługami', - 'Menu:ServiceManagement+' => 'Omówienie zarządzania usługami', - 'Menu:Service:Overview' => 'Przegląd', - 'Menu:Service:Overview+' => '', - 'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Umowy według poziomu usług', - 'UI-ServiceManagementMenu-ContractsByStatus' => 'Umowy według statusu', - 'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Umowy kończące się za mniej niż 30 dni', - - 'Menu:ProviderContract' => 'Umowy z dostawcami', - 'Menu:ProviderContract+' => 'Umowy z dostawcami', - 'Menu:CustomerContract' => 'Umowy z klientami', - 'Menu:CustomerContract+' => 'Umowy z klientami', - 'Menu:ServiceSubcategory' => 'Podkategorie usług', - 'Menu:ServiceSubcategory+' => 'Podkategorie usług', - 'Menu:Service' => 'Usługi', - 'Menu:Service+' => 'Usługi', - 'Menu:ServiceElement' => 'Elementy usługi', - 'Menu:ServiceElement+' => 'Elementy usługi', - 'Menu:SLA' => 'Umowy SLA', - 'Menu:SLA+' => 'Umowy gwarantowanych poziomów usług', - 'Menu:SLT' => 'Poziomy usług SLT', - 'Menu:SLT+' => 'Docelowe poziomy usług', - 'Menu:DeliveryModel' => 'Modele obsługi', - 'Menu:DeliveryModel+' => 'Modele obsługi', - 'Menu:ServiceFamily' => 'Rodziny usług', - 'Menu:ServiceFamily+' => 'Rodziny usług', -)); - - -/* - 'UI:ServiceManagementMenu' => 'Gestion des Services', - 'UI:ServiceManagementMenu+' => 'Gestion des Services', - 'UI:ServiceManagementMenu:Title' => 'RĆ©sumĆ© des services & contrats', - 'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Contrats par niveau de service', - 'UI-ServiceManagementMenu-ContractsByStatus' => 'Contrats par Ć©tat', - 'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Contrats se terminant dans moins de 30 jours', -*/ - -// -// Class: Organization -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:Organization/Attribute:deliverymodel_id' => 'Model obsługi', - 'Class:Organization/Attribute:deliverymodel_id+' => '', - 'Class:Organization/Attribute:deliverymodel_name' => 'Nazwa modelu obsługi', - 'Class:Organization/Attribute:deliverymodel_name+' => '', -)); - - - -// -// Class: ContractType -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:ContractType' => 'Typ umowy', - 'Class:ContractType+' => '', -)); - - -// -// Class: Contract -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:Contract' => 'Umowa', - 'Class:Contract+' => '', - 'Class:Contract/Attribute:name' => 'Nazwa', - 'Class:Contract/Attribute:name+' => '', - 'Class:Contract/Attribute:org_id' => 'Organizacja', - 'Class:Contract/Attribute:org_id+' => '', - 'Class:Contract/Attribute:organization_name' => 'Nazwa klienta', - 'Class:Contract/Attribute:organization_name+' => 'Nazwa zwyczajowa', - 'Class:Contract/Attribute:contacts_list' => 'Kontakty', - 'Class:Contract/Attribute:contacts_list+' => 'Wszystkie kontakty do tej umowy z klientem', - 'Class:Contract/Attribute:documents_list' => 'Dokumenty', - 'Class:Contract/Attribute:documents_list+' => 'Wszystkie dokumenty dotyczące tej umowy z klientem', - 'Class:Contract/Attribute:description' => 'Opis', - 'Class:Contract/Attribute:description+' => '', - 'Class:Contract/Attribute:start_date' => 'Data rozpoczęcia', - 'Class:Contract/Attribute:start_date+' => '', - 'Class:Contract/Attribute:end_date' => 'Data zakończenia', - 'Class:Contract/Attribute:end_date+' => '', - 'Class:Contract/Attribute:cost' => 'Koszt', - 'Class:Contract/Attribute:cost+' => '', - 'Class:Contract/Attribute:cost_currency' => 'Waluta kosztu', - 'Class:Contract/Attribute:cost_currency+' => '', - 'Class:Contract/Attribute:cost_currency/Value:dollars' => 'Dolar', - 'Class:Contract/Attribute:cost_currency/Value:dollars+' => '', - 'Class:Contract/Attribute:cost_currency/Value:euros' => 'Euro', - 'Class:Contract/Attribute:cost_currency/Value:euros+' => '', - 'Class:Contract/Attribute:contracttype_id' => 'Typ umowy', - 'Class:Contract/Attribute:contracttype_id+' => '', - 'Class:Contract/Attribute:contracttype_name' => 'Nazwa typu umowy', - 'Class:Contract/Attribute:contracttype_name+' => '', - 'Class:Contract/Attribute:billing_frequency' => 'Częstotliwość rozliczeń', - 'Class:Contract/Attribute:billing_frequency+' => '', - 'Class:Contract/Attribute:cost_unit' => 'Jednostka kosztu', - 'Class:Contract/Attribute:cost_unit+' => '', - 'Class:Contract/Attribute:provider_id' => 'Dostawca', - 'Class:Contract/Attribute:provider_id+' => '', - 'Class:Contract/Attribute:provider_name' => 'Nazwa dostawcy', - 'Class:Contract/Attribute:provider_name+' => '', - 'Class:Contract/Attribute:status' => 'Status', - 'Class:Contract/Attribute:status+' => '', - 'Class:Contract/Attribute:status/Value:implementation' => 'wdrażane', - 'Class:Contract/Attribute:status/Value:implementation+' => 'wdrażane', - 'Class:Contract/Attribute:status/Value:obsolete' => 'wycofane', - 'Class:Contract/Attribute:status/Value:obsolete+' => 'wycofane', - 'Class:Contract/Attribute:status/Value:production' => 'użytkowane', - 'Class:Contract/Attribute:status/Value:production+' => 'użytkowane', - 'Class:Contract/Attribute:finalclass' => 'Podklasa umowy', - 'Class:Contract/Attribute:finalclass+' => 'Nazwa ostatniej klasy', -)); - -// -// Class: CustomerContract -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:CustomerContract' => 'Umowa z klientem', - 'Class:CustomerContract+' => '', - 'Class:CustomerContract/Attribute:services_list' => 'Usługi', - 'Class:CustomerContract/Attribute:services_list+' => 'Wszystkie usługi zakupione w ramach tej umowy', - 'Class:CustomerContract/Attribute:functionalcis_list' => 'Konfiguracje', - 'Class:CustomerContract/Attribute:functionalcis_list+' => 'Wszystkie elementy konfiguracji objęte niniejszą umową', - 'Class:CustomerContract/Attribute:providercontracts_list' => 'Umowy z dostawcami', - 'Class:CustomerContract/Attribute:providercontracts_list+' => 'Wszystkie umowy z dostawcami na świadczenie usług w ramach tej umowy (umowa stanowiąca podstawę)', -)); - -// -// Class: ProviderContract -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:ProviderContract' => 'Umowa z dostawcą', - 'Class:ProviderContract+' => '', - 'Class:ProviderContract/Attribute:functionalcis_list' => 'Konfiguracje', - 'Class:ProviderContract/Attribute:functionalcis_list+' => 'Wszystkie elementy konfiguracji objęte niniejszą umową', - 'Class:ProviderContract/Attribute:sla' => 'Umowa SLA', - 'Class:ProviderContract/Attribute:sla+' => 'Umowa dotycząca poziomu usług', - 'Class:ProviderContract/Attribute:coverage' => 'Godziny usługi', - 'Class:ProviderContract/Attribute:coverage+' => '', -)); - -// -// Class: lnkContactToContract -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkContactToContract' => 'Połączenie Kontakt / Umowa', - 'Class:lnkContactToContract+' => '', - 'Class:lnkContactToContract/Attribute:contract_id' => 'Umowa', - 'Class:lnkContactToContract/Attribute:contract_id+' => '', - 'Class:lnkContactToContract/Attribute:contract_name' => 'Nazwa umowy', - 'Class:lnkContactToContract/Attribute:contract_name+' => '', - 'Class:lnkContactToContract/Attribute:contact_id' => 'Kontakt', - 'Class:lnkContactToContract/Attribute:contact_id+' => '', - 'Class:lnkContactToContract/Attribute:contact_name' => 'Nazwa kontaktu', - 'Class:lnkContactToContract/Attribute:contact_name+' => '', -)); - -// -// Class: lnkContractToDocument -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkContractToDocument' => 'Połączenie Umowa / Dokument', - 'Class:lnkContractToDocument+' => '', - 'Class:lnkContractToDocument/Attribute:contract_id' => 'Umowa', - 'Class:lnkContractToDocument/Attribute:contract_id+' => '', - 'Class:lnkContractToDocument/Attribute:contract_name' => 'Nazwa umowy', - 'Class:lnkContractToDocument/Attribute:contract_name+' => '', - 'Class:lnkContractToDocument/Attribute:document_id' => 'Dokument', - 'Class:lnkContractToDocument/Attribute:document_id+' => '', - 'Class:lnkContractToDocument/Attribute:document_name' => 'Nazwa dokumentu', - 'Class:lnkContractToDocument/Attribute:document_name+' => '', -)); - -// -// Class: lnkFunctionalCIToProviderContract -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkFunctionalCIToProviderContract' => 'Połączenie Konfiguracja / Umowa z dostawcą', - 'Class:lnkFunctionalCIToProviderContract+' => '', - 'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id' => 'Umowa z dostawcą', - 'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id+' => '', - 'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name' => 'Nazwa umowy z dostawcą', - 'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name+' => '', - 'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id' => 'Konfiguracja', - 'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id+' => '', - 'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name' => 'Nazwa konfiguracji', - 'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name+' => '', -)); - -// -// Class: ServiceFamily -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:ServiceFamily' => 'Rodzina usług', - 'Class:ServiceFamily+' => '', - 'Class:ServiceFamily/Attribute:name' => 'Nazwa', - 'Class:ServiceFamily/Attribute:name+' => '', - 'Class:ServiceFamily/Attribute:icon' => 'Ikona', - 'Class:ServiceFamily/Attribute:icon+' => '', - 'Class:ServiceFamily/Attribute:services_list' => 'Usługi', - 'Class:ServiceFamily/Attribute:services_list+' => 'Wszystkie usługi w tej kategorii', -)); - -// -// Class: Service -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:Service' => 'Usługa', - 'Class:Service+' => '', - 'Class:Service/Attribute:name' => 'Nazwa', - 'Class:Service/Attribute:name+' => '', - 'Class:Service/Attribute:org_id' => 'Dostawca', - 'Class:Service/Attribute:org_id+' => '', - 'Class:Service/Attribute:organization_name' => 'Nazwa dostawcy', - 'Class:Service/Attribute:organization_name+' => '', - 'Class:Service/Attribute:description' => 'Opis', - 'Class:Service/Attribute:description+' => '', - 'Class:Service/Attribute:servicefamily_id' => 'Rodzina usług', - 'Class:Service/Attribute:servicefamily_id+' => '', - 'Class:Service/Attribute:servicefamily_name' => 'Nazwa rodziny usług', - 'Class:Service/Attribute:servicefamily_name+' => '', - 'Class:Service/Attribute:documents_list' => 'Dokumenty', - 'Class:Service/Attribute:documents_list+' => 'Wszystkie dokumenty związane z usługą', - 'Class:Service/Attribute:contacts_list' => 'Kontakty', - 'Class:Service/Attribute:contacts_list+' => 'Wszystkie kontakty do tej usługi', - 'Class:Service/Attribute:status' => 'Status', - 'Class:Service/Attribute:status+' => '', - 'Class:Service/Attribute:status/Value:implementation' => 'wdrażane', - 'Class:Service/Attribute:status/Value:implementation+' => 'wdrażane', - 'Class:Service/Attribute:status/Value:obsolete' => 'wycofane', - 'Class:Service/Attribute:status/Value:obsolete+' => '', - 'Class:Service/Attribute:status/Value:production' => 'użytkowane', - 'Class:Service/Attribute:status/Value:production+' => '', - 'Class:Service/Attribute:icon' => 'Ikona', - 'Class:Service/Attribute:icon+' => '', - 'Class:Service/Attribute:customercontracts_list' => 'Umowy z klientami', - 'Class:Service/Attribute:customercontracts_list+' => 'Wszystkie umowy z klientami, którzy kupili tę usługę', - 'Class:Service/Attribute:servicesubcategories_list' => 'Podkategorie usług', - 'Class:Service/Attribute:servicesubcategories_list+' => 'Wszystkie podkategorie tej usługi', -)); - -// -// Class: lnkDocumentToService -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkDocumentToService' => 'Połączenie Dokument / Usługa', - 'Class:lnkDocumentToService+' => '', - 'Class:lnkDocumentToService/Attribute:service_id' => 'Usługa', - 'Class:lnkDocumentToService/Attribute:service_id+' => '', - 'Class:lnkDocumentToService/Attribute:service_name' => 'Nazwa usługi', - 'Class:lnkDocumentToService/Attribute:service_name+' => '', - 'Class:lnkDocumentToService/Attribute:document_id' => 'Dokument', - 'Class:lnkDocumentToService/Attribute:document_id+' => '', - 'Class:lnkDocumentToService/Attribute:document_name' => 'Nazwa dokumentu', - 'Class:lnkDocumentToService/Attribute:document_name+' => '', -)); - -// -// Class: lnkContactToService -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkContactToService' => 'Połączenie Kontakt / Usługa', - 'Class:lnkContactToService+' => '', - 'Class:lnkContactToService/Attribute:service_id' => 'Usługa', - 'Class:lnkContactToService/Attribute:service_id+' => '', - 'Class:lnkContactToService/Attribute:service_name' => 'Nazwa usługi', - 'Class:lnkContactToService/Attribute:service_name+' => '', - 'Class:lnkContactToService/Attribute:contact_id' => 'Kontakt', - 'Class:lnkContactToService/Attribute:contact_id+' => '', - 'Class:lnkContactToService/Attribute:contact_name' => 'Nazwa kontaktu', - 'Class:lnkContactToService/Attribute:contact_name+' => '', -)); - -// -// Class: ServiceSubcategory -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:ServiceSubcategory' => 'Podkategoria usługi', - 'Class:ServiceSubcategory+' => '', - 'Class:ServiceSubcategory/Attribute:name' => 'Nazwa', - 'Class:ServiceSubcategory/Attribute:name+' => '', - 'Class:ServiceSubcategory/Attribute:description' => 'Opis', - 'Class:ServiceSubcategory/Attribute:description+' => '', - 'Class:ServiceSubcategory/Attribute:service_id' => 'Usługa', - 'Class:ServiceSubcategory/Attribute:service_id+' => '', - 'Class:ServiceSubcategory/Attribute:service_name' => 'Nazwa usługi', - 'Class:ServiceSubcategory/Attribute:service_name+' => '', - 'Class:ServiceSubcategory/Attribute:status' => 'Status', - 'Class:ServiceSubcategory/Attribute:status+' => '', - 'Class:ServiceSubcategory/Attribute:status/Value:implementation' => 'wdrażane', - 'Class:ServiceSubcategory/Attribute:status/Value:implementation+' => 'wdrażane', - 'Class:ServiceSubcategory/Attribute:status/Value:obsolete' => 'wycofane', - 'Class:ServiceSubcategory/Attribute:status/Value:obsolete+' => 'wycofane', - 'Class:ServiceSubcategory/Attribute:status/Value:production' => 'użytkowane', - 'Class:ServiceSubcategory/Attribute:status/Value:production+' => 'użytkowane', - 'Class:ServiceSubcategory/Attribute:request_type' => 'Typ zgłoszenia', - 'Class:ServiceSubcategory/Attribute:request_type+' => '', - 'Class:ServiceSubcategory/Attribute:request_type/Value:incident' => 'incydent', - 'Class:ServiceSubcategory/Attribute:request_type/Value:incident+' => 'incydent', - 'Class:ServiceSubcategory/Attribute:request_type/Value:service_request' => 'zgłoszenie serwisowe', - 'Class:ServiceSubcategory/Attribute:request_type/Value:service_request+' => 'zgłoszenie serwisowe', - 'Class:ServiceSubcategory/Attribute:service_provider' => 'Nazwa dostawcy', - 'Class:ServiceSubcategory/Attribute:service_org_id' => 'Dostawca', -)); - -// -// Class: SLA -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:SLA' => 'Umowa SLA', - 'Class:SLA+' => '', - 'Class:SLA/Attribute:name' => 'Nazwa', - 'Class:SLA/Attribute:name+' => '', - 'Class:SLA/Attribute:description' => 'Opis', - 'Class:SLA/Attribute:description+' => '', - 'Class:SLA/Attribute:org_id' => 'Organizacja', - 'Class:SLA/Attribute:org_id+' => '', - 'Class:SLA/Attribute:organization_name' => 'Nazwa organizacji', - 'Class:SLA/Attribute:organization_name+' => '', - 'Class:SLA/Attribute:slts_list' => 'Poziomy usług (SLT)', - 'Class:SLA/Attribute:slts_list+' => 'Wszystkie docelowe poziomy usług dla tej umowy SLA', - 'Class:SLA/Attribute:customercontracts_list' => 'Umowy z klientami', - 'Class:SLA/Attribute:customercontracts_list+' => 'Wszystkie umowy z klientami korzystające z tej umowy SLA', - 'Class:SLA/Error:UniqueLnkCustomerContractToService' => 'Nie udało się zapisać połączenia z umową klienta %1$s i usługą %2$s : Umowa SLA już istnieje', -)); - -// -// Class: SLT -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:SLT' => 'Poziom usług SLT', - 'Class:SLT+' => '', - 'Class:SLT/Attribute:name' => 'Nazwa', - 'Class:SLT/Attribute:name+' => '', - 'Class:SLT/Attribute:priority' => 'Priorytet', - 'Class:SLT/Attribute:priority+' => '', - 'Class:SLT/Attribute:priority/Value:1' => 'krytyczny', - 'Class:SLT/Attribute:priority/Value:1+' => 'krytyczny', - 'Class:SLT/Attribute:priority/Value:2' => 'wysoki', - 'Class:SLT/Attribute:priority/Value:2+' => 'wysoki', - 'Class:SLT/Attribute:priority/Value:3' => 'średni', - 'Class:SLT/Attribute:priority/Value:3+' => 'średni', - 'Class:SLT/Attribute:priority/Value:4' => 'niski', - 'Class:SLT/Attribute:priority/Value:4+' => 'niski', - 'Class:SLT/Attribute:request_type' => 'Typ zgłoszenia', - 'Class:SLT/Attribute:request_type+' => '', - 'Class:SLT/Attribute:request_type/Value:incident' => 'incydent', - 'Class:SLT/Attribute:request_type/Value:incident+' => 'incydent', - 'Class:SLT/Attribute:request_type/Value:service_request' => 'zgłoszenie serwisowe', - 'Class:SLT/Attribute:request_type/Value:service_request+' => 'zgłoszenie serwisowe', - 'Class:SLT/Attribute:metric' => 'Miara', - 'Class:SLT/Attribute:metric+' => '', - 'Class:SLT/Attribute:metric/Value:tto' => 'Termin podjęcia TTO', - 'Class:SLT/Attribute:metric/Value:tto+' => 'Termin podjęcia TTO', - 'Class:SLT/Attribute:metric/Value:ttr' => 'Termin rozwiązania TTR', - 'Class:SLT/Attribute:metric/Value:ttr+' => 'Termin rozwiązania TTR', - 'Class:SLT/Attribute:value' => 'Wartość', - 'Class:SLT/Attribute:value+' => '', - 'Class:SLT/Attribute:unit' => 'Jednostka', - 'Class:SLT/Attribute:unit+' => '', - 'Class:SLT/Attribute:unit/Value:hours' => 'godzin', - 'Class:SLT/Attribute:unit/Value:hours+' => 'godzin', - 'Class:SLT/Attribute:unit/Value:minutes' => 'minut', - 'Class:SLT/Attribute:unit/Value:minutes+' => 'minut', -)); - -// -// Class: lnkSLAToSLT -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkSLAToSLT' => 'Połączenie SLA / SLT', - 'Class:lnkSLAToSLT+' => '', - 'Class:lnkSLAToSLT/Attribute:sla_id' => 'Umowa SLA', - 'Class:lnkSLAToSLT/Attribute:sla_id+' => '', - 'Class:lnkSLAToSLT/Attribute:sla_name' => 'Nazwa umowy SLA', - 'Class:lnkSLAToSLT/Attribute:sla_name+' => '', - 'Class:lnkSLAToSLT/Attribute:slt_id' => 'Poziom usług SLT', - 'Class:lnkSLAToSLT/Attribute:slt_id+' => '', - 'Class:lnkSLAToSLT/Attribute:slt_name' => 'Nazwa poziomu usług SLT', - 'Class:lnkSLAToSLT/Attribute:slt_name+' => '', - 'Class:lnkSLAToSLT/Attribute:slt_metric' => 'Miara poziomu usług SLT', - 'Class:lnkSLAToSLT/Attribute:slt_metric+' => '', - 'Class:lnkSLAToSLT/Attribute:slt_request_type' => 'Typ zgłoszenia SLT', - 'Class:lnkSLAToSLT/Attribute:slt_request_type+' => '', - 'Class:lnkSLAToSLT/Attribute:slt_ticket_priority' => 'Priorytet zgłoszeń SLT', - 'Class:lnkSLAToSLT/Attribute:slt_ticket_priority+' => '', - 'Class:lnkSLAToSLT/Attribute:slt_value' => 'Wartość SLT', - 'Class:lnkSLAToSLT/Attribute:slt_value+' => '', - 'Class:lnkSLAToSLT/Attribute:slt_value_unit' => 'Jednostka wartości SLT', - 'Class:lnkSLAToSLT/Attribute:slt_value_unit+' => '', -)); - -// -// Class: lnkCustomerContractToService -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkCustomerContractToService' => 'Połączenie Umowa z klientem / Usługa', - 'Class:lnkCustomerContractToService+' => '', - 'Class:lnkCustomerContractToService/Attribute:customercontract_id' => 'Umowa z klientem', - 'Class:lnkCustomerContractToService/Attribute:customercontract_id+' => '', - 'Class:lnkCustomerContractToService/Attribute:customercontract_name' => 'Nazwa umowy z klientem', - 'Class:lnkCustomerContractToService/Attribute:customercontract_name+' => '', - 'Class:lnkCustomerContractToService/Attribute:service_id' => 'Usługa', - 'Class:lnkCustomerContractToService/Attribute:service_id+' => '', - 'Class:lnkCustomerContractToService/Attribute:service_name' => 'Nazwa usługi', - 'Class:lnkCustomerContractToService/Attribute:service_name+' => '', - 'Class:lnkCustomerContractToService/Attribute:sla_id' => 'Umowa SLA', - 'Class:lnkCustomerContractToService/Attribute:sla_id+' => '', - 'Class:lnkCustomerContractToService/Attribute:sla_name' => 'Nazwa umowy SLA', - 'Class:lnkCustomerContractToService/Attribute:sla_name+' => '', -)); - -// -// Class: lnkCustomerContractToProviderContract -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkCustomerContractToProviderContract' => 'Połączenie Umowa z klientem / Umowa z dostawcą', - 'Class:lnkCustomerContractToProviderContract+' => '', - 'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_id' => 'Umowa z klientem', - 'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_id+' => '', - 'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_name' => 'Nazwa umowy z klientem', - 'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_name+' => '', - 'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_id' => 'Umowa z dostawcą', - 'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_id+' => '', - 'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_name' => 'Nazwa umowy z dostawcą', - 'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_name+' => '', -)); - -// -// Class: lnkCustomerContractToFunctionalCI -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkCustomerContractToFunctionalCI' => 'Połączenie Umowa z klientem / Konfiguracja', - 'Class:lnkCustomerContractToFunctionalCI+' => '', - 'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_id' => 'Umowa z klientem', - 'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_id+' => '', - 'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_name' => 'Nazwa umowy z klientem', - 'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_name+' => '', - 'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_id' => 'Konfiguracja', - 'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_id+' => '', - 'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_name' => 'Nazwa konfiguracji', - 'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_name+' => '', -)); - -// -// Class: DeliveryModel -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:DeliveryModel' => 'Model obsługi', - 'Class:DeliveryModel+' => '', - 'Class:DeliveryModel/Attribute:name' => 'Nazwa', - 'Class:DeliveryModel/Attribute:name+' => '', - 'Class:DeliveryModel/Attribute:org_id' => 'Organizacja', - 'Class:DeliveryModel/Attribute:org_id+' => '', - 'Class:DeliveryModel/Attribute:organization_name' => 'Nazwa organizacji', - 'Class:DeliveryModel/Attribute:organization_name+' => '', - 'Class:DeliveryModel/Attribute:description' => 'Opis', - 'Class:DeliveryModel/Attribute:description+' => '', - 'Class:DeliveryModel/Attribute:contacts_list' => 'Kontakty', - 'Class:DeliveryModel/Attribute:contacts_list+' => 'Wszystkie kontakty (zespoły i osoby) dla tego modelu obsługi', - 'Class:DeliveryModel/Attribute:customers_list' => 'Klienci', - 'Class:DeliveryModel/Attribute:customers_list+' => 'Wszyscy klienci posiadający ten model obsługi', -)); - -// -// Class: lnkDeliveryModelToContact -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkDeliveryModelToContact' => 'Połączenie Model obsługi / Kontakt', - 'Class:lnkDeliveryModelToContact+' => '', - 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id' => 'Model obsługi', - 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id+' => '', - 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name' => 'Nazwa modelu obsługi', - 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name+' => '', - 'Class:lnkDeliveryModelToContact/Attribute:contact_id' => 'Kontakt', - 'Class:lnkDeliveryModelToContact/Attribute:contact_id+' => '', - 'Class:lnkDeliveryModelToContact/Attribute:contact_name' => 'Nazwa kontaktu', - 'Class:lnkDeliveryModelToContact/Attribute:contact_name+' => '', - 'Class:lnkDeliveryModelToContact/Attribute:role_id' => 'Rola', - 'Class:lnkDeliveryModelToContact/Attribute:role_id+' => '', - 'Class:lnkDeliveryModelToContact/Attribute:role_name' => 'Nazwa roli', - 'Class:lnkDeliveryModelToContact/Attribute:role_name+' => '', -)); + + */ + +// Dictionnay conventions +// Class: +// Class:+ +// Class:/Attribute: +// Class:/Attribute:+ +// Class:/Attribute:/Value: +// Class:/Attribute:/Value:+ +// Class:/Stimulus: +// Class:/Stimulus:+ + + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Menu:ServiceManagement' => 'Zarządzanie usługami', + 'Menu:ServiceManagement+' => 'Omówienie zarządzania usługami', + 'Menu:Service:Overview' => 'Przegląd', + 'Menu:Service:Overview+' => '', + 'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Umowy według poziomu usług', + 'UI-ServiceManagementMenu-ContractsByStatus' => 'Umowy według statusu', + 'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Umowy kończące się za mniej niż 30 dni', + + 'Menu:ProviderContract' => 'Umowy z dostawcami', + 'Menu:ProviderContract+' => 'Umowy z dostawcami', + 'Menu:CustomerContract' => 'Umowy z klientami', + 'Menu:CustomerContract+' => 'Umowy z klientami', + 'Menu:ServiceSubcategory' => 'Podkategorie usług', + 'Menu:ServiceSubcategory+' => 'Podkategorie usług', + 'Menu:Service' => 'Usługi', + 'Menu:Service+' => 'Usługi', + 'Menu:ServiceElement' => 'Elementy usługi', + 'Menu:ServiceElement+' => 'Elementy usługi', + 'Menu:SLA' => 'Umowy SLA', + 'Menu:SLA+' => 'Umowy gwarantowanych poziomów usług', + 'Menu:SLT' => 'Poziomy usług SLT', + 'Menu:SLT+' => 'Docelowe poziomy usług', + 'Menu:DeliveryModel' => 'Modele obsługi', + 'Menu:DeliveryModel+' => 'Modele obsługi', + 'Menu:ServiceFamily' => 'Rodziny usług', + 'Menu:ServiceFamily+' => 'Rodziny usług', +)); + + +/* + 'UI:ServiceManagementMenu' => 'Gestion des Services', + 'UI:ServiceManagementMenu+' => 'Gestion des Services', + 'UI:ServiceManagementMenu:Title' => 'RĆ©sumĆ© des services & contrats', + 'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Contrats par niveau de service', + 'UI-ServiceManagementMenu-ContractsByStatus' => 'Contrats par Ć©tat', + 'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Contrats se terminant dans moins de 30 jours', +*/ + +// +// Class: Organization +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:Organization/Attribute:deliverymodel_id' => 'Model obsługi', + 'Class:Organization/Attribute:deliverymodel_id+' => '', + 'Class:Organization/Attribute:deliverymodel_name' => 'Nazwa modelu obsługi', + 'Class:Organization/Attribute:deliverymodel_name+' => '', +)); + + + +// +// Class: ContractType +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:ContractType' => 'Typ umowy', + 'Class:ContractType+' => '', +)); + + +// +// Class: Contract +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:Contract' => 'Umowa', + 'Class:Contract+' => '', + 'Class:Contract/Attribute:name' => 'Nazwa', + 'Class:Contract/Attribute:name+' => '', + 'Class:Contract/Attribute:org_id' => 'Organizacja', + 'Class:Contract/Attribute:org_id+' => '', + 'Class:Contract/Attribute:organization_name' => 'Nazwa klienta', + 'Class:Contract/Attribute:organization_name+' => 'Nazwa zwyczajowa', + 'Class:Contract/Attribute:contacts_list' => 'Kontakty', + 'Class:Contract/Attribute:contacts_list+' => 'Wszystkie kontakty do tej umowy z klientem', + 'Class:Contract/Attribute:documents_list' => 'Dokumenty', + 'Class:Contract/Attribute:documents_list+' => 'Wszystkie dokumenty dotyczące tej umowy z klientem', + 'Class:Contract/Attribute:description' => 'Opis', + 'Class:Contract/Attribute:description+' => '', + 'Class:Contract/Attribute:start_date' => 'Data rozpoczęcia', + 'Class:Contract/Attribute:start_date+' => '', + 'Class:Contract/Attribute:end_date' => 'Data zakończenia', + 'Class:Contract/Attribute:end_date+' => '', + 'Class:Contract/Attribute:cost' => 'Koszt', + 'Class:Contract/Attribute:cost+' => '', + 'Class:Contract/Attribute:cost_currency' => 'Waluta kosztu', + 'Class:Contract/Attribute:cost_currency+' => '', + 'Class:Contract/Attribute:cost_currency/Value:dollars' => 'Dolar', + 'Class:Contract/Attribute:cost_currency/Value:dollars+' => '', + 'Class:Contract/Attribute:cost_currency/Value:euros' => 'Euro', + 'Class:Contract/Attribute:cost_currency/Value:euros+' => '', + 'Class:Contract/Attribute:contracttype_id' => 'Typ umowy', + 'Class:Contract/Attribute:contracttype_id+' => '', + 'Class:Contract/Attribute:contracttype_name' => 'Nazwa typu umowy', + 'Class:Contract/Attribute:contracttype_name+' => '', + 'Class:Contract/Attribute:billing_frequency' => 'Częstotliwość rozliczeń', + 'Class:Contract/Attribute:billing_frequency+' => '', + 'Class:Contract/Attribute:cost_unit' => 'Jednostka kosztu', + 'Class:Contract/Attribute:cost_unit+' => '', + 'Class:Contract/Attribute:provider_id' => 'Dostawca', + 'Class:Contract/Attribute:provider_id+' => '', + 'Class:Contract/Attribute:provider_name' => 'Nazwa dostawcy', + 'Class:Contract/Attribute:provider_name+' => '', + 'Class:Contract/Attribute:status' => 'Status', + 'Class:Contract/Attribute:status+' => '', + 'Class:Contract/Attribute:status/Value:implementation' => 'wdrażane', + 'Class:Contract/Attribute:status/Value:implementation+' => 'wdrażane', + 'Class:Contract/Attribute:status/Value:obsolete' => 'wycofane', + 'Class:Contract/Attribute:status/Value:obsolete+' => 'wycofane', + 'Class:Contract/Attribute:status/Value:production' => 'użytkowane', + 'Class:Contract/Attribute:status/Value:production+' => 'użytkowane', + 'Class:Contract/Attribute:finalclass' => 'Podklasa umowy', + 'Class:Contract/Attribute:finalclass+' => 'Nazwa ostatniej klasy', +)); + +// +// Class: CustomerContract +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:CustomerContract' => 'Umowa z klientem', + 'Class:CustomerContract+' => '', + 'Class:CustomerContract/Attribute:services_list' => 'Usługi', + 'Class:CustomerContract/Attribute:services_list+' => 'Wszystkie usługi zakupione w ramach tej umowy', + 'Class:CustomerContract/Attribute:functionalcis_list' => 'Konfiguracje', + 'Class:CustomerContract/Attribute:functionalcis_list+' => 'Wszystkie elementy konfiguracji objęte niniejszą umową', + 'Class:CustomerContract/Attribute:providercontracts_list' => 'Umowy z dostawcami', + 'Class:CustomerContract/Attribute:providercontracts_list+' => 'Wszystkie umowy z dostawcami na świadczenie usług w ramach tej umowy (umowa stanowiąca podstawę)', +)); + +// +// Class: ProviderContract +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:ProviderContract' => 'Umowa z dostawcą', + 'Class:ProviderContract+' => '', + 'Class:ProviderContract/Attribute:functionalcis_list' => 'Konfiguracje', + 'Class:ProviderContract/Attribute:functionalcis_list+' => 'Wszystkie elementy konfiguracji objęte niniejszą umową', + 'Class:ProviderContract/Attribute:sla' => 'Umowa SLA', + 'Class:ProviderContract/Attribute:sla+' => 'Umowa dotycząca poziomu usług', + 'Class:ProviderContract/Attribute:coverage' => 'Godziny usługi', + 'Class:ProviderContract/Attribute:coverage+' => '', +)); + +// +// Class: lnkContactToContract +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkContactToContract' => 'Połączenie Kontakt / Umowa', + 'Class:lnkContactToContract+' => '', + 'Class:lnkContactToContract/Attribute:contract_id' => 'Umowa', + 'Class:lnkContactToContract/Attribute:contract_id+' => '', + 'Class:lnkContactToContract/Attribute:contract_name' => 'Nazwa umowy', + 'Class:lnkContactToContract/Attribute:contract_name+' => '', + 'Class:lnkContactToContract/Attribute:contact_id' => 'Kontakt', + 'Class:lnkContactToContract/Attribute:contact_id+' => '', + 'Class:lnkContactToContract/Attribute:contact_name' => 'Nazwa kontaktu', + 'Class:lnkContactToContract/Attribute:contact_name+' => '', +)); + +// +// Class: lnkContractToDocument +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkContractToDocument' => 'Połączenie Umowa / Dokument', + 'Class:lnkContractToDocument+' => '', + 'Class:lnkContractToDocument/Attribute:contract_id' => 'Umowa', + 'Class:lnkContractToDocument/Attribute:contract_id+' => '', + 'Class:lnkContractToDocument/Attribute:contract_name' => 'Nazwa umowy', + 'Class:lnkContractToDocument/Attribute:contract_name+' => '', + 'Class:lnkContractToDocument/Attribute:document_id' => 'Dokument', + 'Class:lnkContractToDocument/Attribute:document_id+' => '', + 'Class:lnkContractToDocument/Attribute:document_name' => 'Nazwa dokumentu', + 'Class:lnkContractToDocument/Attribute:document_name+' => '', +)); + +// +// Class: lnkFunctionalCIToProviderContract +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkFunctionalCIToProviderContract' => 'Połączenie Konfiguracja / Umowa z dostawcą', + 'Class:lnkFunctionalCIToProviderContract+' => '', + 'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id' => 'Umowa z dostawcą', + 'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_id+' => '', + 'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name' => 'Nazwa umowy z dostawcą', + 'Class:lnkFunctionalCIToProviderContract/Attribute:providercontract_name+' => '', + 'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id' => 'Konfiguracja', + 'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_id+' => '', + 'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name' => 'Nazwa konfiguracji', + 'Class:lnkFunctionalCIToProviderContract/Attribute:functionalci_name+' => '', +)); + +// +// Class: ServiceFamily +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:ServiceFamily' => 'Rodzina usług', + 'Class:ServiceFamily+' => '', + 'Class:ServiceFamily/Attribute:name' => 'Nazwa', + 'Class:ServiceFamily/Attribute:name+' => '', + 'Class:ServiceFamily/Attribute:icon' => 'Ikona', + 'Class:ServiceFamily/Attribute:icon+' => '', + 'Class:ServiceFamily/Attribute:services_list' => 'Usługi', + 'Class:ServiceFamily/Attribute:services_list+' => 'Wszystkie usługi w tej kategorii', +)); + +// +// Class: Service +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:Service' => 'Usługa', + 'Class:Service+' => '', + 'Class:Service/Attribute:name' => 'Nazwa', + 'Class:Service/Attribute:name+' => '', + 'Class:Service/Attribute:org_id' => 'Dostawca', + 'Class:Service/Attribute:org_id+' => '', + 'Class:Service/Attribute:organization_name' => 'Nazwa dostawcy', + 'Class:Service/Attribute:organization_name+' => '', + 'Class:Service/Attribute:description' => 'Opis', + 'Class:Service/Attribute:description+' => '', + 'Class:Service/Attribute:servicefamily_id' => 'Rodzina usług', + 'Class:Service/Attribute:servicefamily_id+' => '', + 'Class:Service/Attribute:servicefamily_name' => 'Nazwa rodziny usług', + 'Class:Service/Attribute:servicefamily_name+' => '', + 'Class:Service/Attribute:documents_list' => 'Dokumenty', + 'Class:Service/Attribute:documents_list+' => 'Wszystkie dokumenty związane z usługą', + 'Class:Service/Attribute:contacts_list' => 'Kontakty', + 'Class:Service/Attribute:contacts_list+' => 'Wszystkie kontakty do tej usługi', + 'Class:Service/Attribute:status' => 'Status', + 'Class:Service/Attribute:status+' => '', + 'Class:Service/Attribute:status/Value:implementation' => 'wdrażane', + 'Class:Service/Attribute:status/Value:implementation+' => 'wdrażane', + 'Class:Service/Attribute:status/Value:obsolete' => 'wycofane', + 'Class:Service/Attribute:status/Value:obsolete+' => '', + 'Class:Service/Attribute:status/Value:production' => 'użytkowane', + 'Class:Service/Attribute:status/Value:production+' => '', + 'Class:Service/Attribute:icon' => 'Ikona', + 'Class:Service/Attribute:icon+' => '', + 'Class:Service/Attribute:customercontracts_list' => 'Umowy z klientami', + 'Class:Service/Attribute:customercontracts_list+' => 'Wszystkie umowy z klientami, którzy kupili tę usługę', + 'Class:Service/Attribute:servicesubcategories_list' => 'Podkategorie usług', + 'Class:Service/Attribute:servicesubcategories_list+' => 'Wszystkie podkategorie tej usługi', +)); + +// +// Class: lnkDocumentToService +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkDocumentToService' => 'Połączenie Dokument / Usługa', + 'Class:lnkDocumentToService+' => '', + 'Class:lnkDocumentToService/Attribute:service_id' => 'Usługa', + 'Class:lnkDocumentToService/Attribute:service_id+' => '', + 'Class:lnkDocumentToService/Attribute:service_name' => 'Nazwa usługi', + 'Class:lnkDocumentToService/Attribute:service_name+' => '', + 'Class:lnkDocumentToService/Attribute:document_id' => 'Dokument', + 'Class:lnkDocumentToService/Attribute:document_id+' => '', + 'Class:lnkDocumentToService/Attribute:document_name' => 'Nazwa dokumentu', + 'Class:lnkDocumentToService/Attribute:document_name+' => '', +)); + +// +// Class: lnkContactToService +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkContactToService' => 'Połączenie Kontakt / Usługa', + 'Class:lnkContactToService+' => '', + 'Class:lnkContactToService/Attribute:service_id' => 'Usługa', + 'Class:lnkContactToService/Attribute:service_id+' => '', + 'Class:lnkContactToService/Attribute:service_name' => 'Nazwa usługi', + 'Class:lnkContactToService/Attribute:service_name+' => '', + 'Class:lnkContactToService/Attribute:contact_id' => 'Kontakt', + 'Class:lnkContactToService/Attribute:contact_id+' => '', + 'Class:lnkContactToService/Attribute:contact_name' => 'Nazwa kontaktu', + 'Class:lnkContactToService/Attribute:contact_name+' => '', +)); + +// +// Class: ServiceSubcategory +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:ServiceSubcategory' => 'Podkategoria usługi', + 'Class:ServiceSubcategory+' => '', + 'Class:ServiceSubcategory/Attribute:name' => 'Nazwa', + 'Class:ServiceSubcategory/Attribute:name+' => '', + 'Class:ServiceSubcategory/Attribute:description' => 'Opis', + 'Class:ServiceSubcategory/Attribute:description+' => '', + 'Class:ServiceSubcategory/Attribute:service_id' => 'Usługa', + 'Class:ServiceSubcategory/Attribute:service_id+' => '', + 'Class:ServiceSubcategory/Attribute:service_name' => 'Nazwa usługi', + 'Class:ServiceSubcategory/Attribute:service_name+' => '', + 'Class:ServiceSubcategory/Attribute:status' => 'Status', + 'Class:ServiceSubcategory/Attribute:status+' => '', + 'Class:ServiceSubcategory/Attribute:status/Value:implementation' => 'wdrażane', + 'Class:ServiceSubcategory/Attribute:status/Value:implementation+' => 'wdrażane', + 'Class:ServiceSubcategory/Attribute:status/Value:obsolete' => 'wycofane', + 'Class:ServiceSubcategory/Attribute:status/Value:obsolete+' => 'wycofane', + 'Class:ServiceSubcategory/Attribute:status/Value:production' => 'użytkowane', + 'Class:ServiceSubcategory/Attribute:status/Value:production+' => 'użytkowane', + 'Class:ServiceSubcategory/Attribute:request_type' => 'Typ zgłoszenia', + 'Class:ServiceSubcategory/Attribute:request_type+' => '', + 'Class:ServiceSubcategory/Attribute:request_type/Value:incident' => 'incydent', + 'Class:ServiceSubcategory/Attribute:request_type/Value:incident+' => 'incydent', + 'Class:ServiceSubcategory/Attribute:request_type/Value:service_request' => 'zgłoszenie serwisowe', + 'Class:ServiceSubcategory/Attribute:request_type/Value:service_request+' => 'zgłoszenie serwisowe', + 'Class:ServiceSubcategory/Attribute:service_provider' => 'Nazwa dostawcy', + 'Class:ServiceSubcategory/Attribute:service_org_id' => 'Dostawca', +)); + +// +// Class: SLA +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:SLA' => 'Umowa SLA', + 'Class:SLA+' => '', + 'Class:SLA/Attribute:name' => 'Nazwa', + 'Class:SLA/Attribute:name+' => '', + 'Class:SLA/Attribute:description' => 'Opis', + 'Class:SLA/Attribute:description+' => '', + 'Class:SLA/Attribute:org_id' => 'Organizacja', + 'Class:SLA/Attribute:org_id+' => '', + 'Class:SLA/Attribute:organization_name' => 'Nazwa organizacji', + 'Class:SLA/Attribute:organization_name+' => '', + 'Class:SLA/Attribute:slts_list' => 'Poziomy usług (SLT)', + 'Class:SLA/Attribute:slts_list+' => 'Wszystkie docelowe poziomy usług dla tej umowy SLA', + 'Class:SLA/Attribute:customercontracts_list' => 'Umowy z klientami', + 'Class:SLA/Attribute:customercontracts_list+' => 'Wszystkie umowy z klientami korzystające z tej umowy SLA', + 'Class:SLA/Error:UniqueLnkCustomerContractToService' => 'Nie udało się zapisać połączenia z umową klienta %1$s i usługą %2$s : Umowa SLA już istnieje', +)); + +// +// Class: SLT +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:SLT' => 'Poziom usług SLT', + 'Class:SLT+' => '', + 'Class:SLT/Attribute:name' => 'Nazwa', + 'Class:SLT/Attribute:name+' => '', + 'Class:SLT/Attribute:priority' => 'Priorytet', + 'Class:SLT/Attribute:priority+' => '', + 'Class:SLT/Attribute:priority/Value:1' => 'krytyczny', + 'Class:SLT/Attribute:priority/Value:1+' => 'krytyczny', + 'Class:SLT/Attribute:priority/Value:2' => 'wysoki', + 'Class:SLT/Attribute:priority/Value:2+' => 'wysoki', + 'Class:SLT/Attribute:priority/Value:3' => 'średni', + 'Class:SLT/Attribute:priority/Value:3+' => 'średni', + 'Class:SLT/Attribute:priority/Value:4' => 'niski', + 'Class:SLT/Attribute:priority/Value:4+' => 'niski', + 'Class:SLT/Attribute:request_type' => 'Typ zgłoszenia', + 'Class:SLT/Attribute:request_type+' => '', + 'Class:SLT/Attribute:request_type/Value:incident' => 'incydent', + 'Class:SLT/Attribute:request_type/Value:incident+' => 'incydent', + 'Class:SLT/Attribute:request_type/Value:service_request' => 'zgłoszenie serwisowe', + 'Class:SLT/Attribute:request_type/Value:service_request+' => 'zgłoszenie serwisowe', + 'Class:SLT/Attribute:metric' => 'Miara', + 'Class:SLT/Attribute:metric+' => '', + 'Class:SLT/Attribute:metric/Value:tto' => 'Termin podjęcia TTO', + 'Class:SLT/Attribute:metric/Value:tto+' => 'Termin podjęcia TTO', + 'Class:SLT/Attribute:metric/Value:ttr' => 'Termin rozwiązania TTR', + 'Class:SLT/Attribute:metric/Value:ttr+' => 'Termin rozwiązania TTR', + 'Class:SLT/Attribute:value' => 'Wartość', + 'Class:SLT/Attribute:value+' => '', + 'Class:SLT/Attribute:unit' => 'Jednostka', + 'Class:SLT/Attribute:unit+' => '', + 'Class:SLT/Attribute:unit/Value:hours' => 'godzin', + 'Class:SLT/Attribute:unit/Value:hours+' => 'godzin', + 'Class:SLT/Attribute:unit/Value:minutes' => 'minut', + 'Class:SLT/Attribute:unit/Value:minutes+' => 'minut', +)); + +// +// Class: lnkSLAToSLT +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkSLAToSLT' => 'Połączenie SLA / SLT', + 'Class:lnkSLAToSLT+' => '', + 'Class:lnkSLAToSLT/Attribute:sla_id' => 'Umowa SLA', + 'Class:lnkSLAToSLT/Attribute:sla_id+' => '', + 'Class:lnkSLAToSLT/Attribute:sla_name' => 'Nazwa umowy SLA', + 'Class:lnkSLAToSLT/Attribute:sla_name+' => '', + 'Class:lnkSLAToSLT/Attribute:slt_id' => 'Poziom usług SLT', + 'Class:lnkSLAToSLT/Attribute:slt_id+' => '', + 'Class:lnkSLAToSLT/Attribute:slt_name' => 'Nazwa poziomu usług SLT', + 'Class:lnkSLAToSLT/Attribute:slt_name+' => '', + 'Class:lnkSLAToSLT/Attribute:slt_metric' => 'Miara poziomu usług SLT', + 'Class:lnkSLAToSLT/Attribute:slt_metric+' => '', + 'Class:lnkSLAToSLT/Attribute:slt_request_type' => 'Typ zgłoszenia SLT', + 'Class:lnkSLAToSLT/Attribute:slt_request_type+' => '', + 'Class:lnkSLAToSLT/Attribute:slt_ticket_priority' => 'Priorytet zgłoszeń SLT', + 'Class:lnkSLAToSLT/Attribute:slt_ticket_priority+' => '', + 'Class:lnkSLAToSLT/Attribute:slt_value' => 'Wartość SLT', + 'Class:lnkSLAToSLT/Attribute:slt_value+' => '', + 'Class:lnkSLAToSLT/Attribute:slt_value_unit' => 'Jednostka wartości SLT', + 'Class:lnkSLAToSLT/Attribute:slt_value_unit+' => '', +)); + +// +// Class: lnkCustomerContractToService +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkCustomerContractToService' => 'Połączenie Umowa z klientem / Usługa', + 'Class:lnkCustomerContractToService+' => '', + 'Class:lnkCustomerContractToService/Attribute:customercontract_id' => 'Umowa z klientem', + 'Class:lnkCustomerContractToService/Attribute:customercontract_id+' => '', + 'Class:lnkCustomerContractToService/Attribute:customercontract_name' => 'Nazwa umowy z klientem', + 'Class:lnkCustomerContractToService/Attribute:customercontract_name+' => '', + 'Class:lnkCustomerContractToService/Attribute:service_id' => 'Usługa', + 'Class:lnkCustomerContractToService/Attribute:service_id+' => '', + 'Class:lnkCustomerContractToService/Attribute:service_name' => 'Nazwa usługi', + 'Class:lnkCustomerContractToService/Attribute:service_name+' => '', + 'Class:lnkCustomerContractToService/Attribute:sla_id' => 'Umowa SLA', + 'Class:lnkCustomerContractToService/Attribute:sla_id+' => '', + 'Class:lnkCustomerContractToService/Attribute:sla_name' => 'Nazwa umowy SLA', + 'Class:lnkCustomerContractToService/Attribute:sla_name+' => '', +)); + +// +// Class: lnkCustomerContractToProviderContract +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkCustomerContractToProviderContract' => 'Połączenie Umowa z klientem / Umowa z dostawcą', + 'Class:lnkCustomerContractToProviderContract+' => '', + 'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_id' => 'Umowa z klientem', + 'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_id+' => '', + 'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_name' => 'Nazwa umowy z klientem', + 'Class:lnkCustomerContractToProviderContract/Attribute:customercontract_name+' => '', + 'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_id' => 'Umowa z dostawcą', + 'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_id+' => '', + 'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_name' => 'Nazwa umowy z dostawcą', + 'Class:lnkCustomerContractToProviderContract/Attribute:providercontract_name+' => '', +)); + +// +// Class: lnkCustomerContractToFunctionalCI +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkCustomerContractToFunctionalCI' => 'Połączenie Umowa z klientem / Konfiguracja', + 'Class:lnkCustomerContractToFunctionalCI+' => '', + 'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_id' => 'Umowa z klientem', + 'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_id+' => '', + 'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_name' => 'Nazwa umowy z klientem', + 'Class:lnkCustomerContractToFunctionalCI/Attribute:customercontract_name+' => '', + 'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_id' => 'Konfiguracja', + 'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_id+' => '', + 'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_name' => 'Nazwa konfiguracji', + 'Class:lnkCustomerContractToFunctionalCI/Attribute:functionalci_name+' => '', +)); + +// +// Class: DeliveryModel +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:DeliveryModel' => 'Model obsługi', + 'Class:DeliveryModel+' => '', + 'Class:DeliveryModel/Attribute:name' => 'Nazwa', + 'Class:DeliveryModel/Attribute:name+' => '', + 'Class:DeliveryModel/Attribute:org_id' => 'Organizacja', + 'Class:DeliveryModel/Attribute:org_id+' => '', + 'Class:DeliveryModel/Attribute:organization_name' => 'Nazwa organizacji', + 'Class:DeliveryModel/Attribute:organization_name+' => '', + 'Class:DeliveryModel/Attribute:description' => 'Opis', + 'Class:DeliveryModel/Attribute:description+' => '', + 'Class:DeliveryModel/Attribute:contacts_list' => 'Kontakty', + 'Class:DeliveryModel/Attribute:contacts_list+' => 'Wszystkie kontakty (zespoły i osoby) dla tego modelu obsługi', + 'Class:DeliveryModel/Attribute:customers_list' => 'Klienci', + 'Class:DeliveryModel/Attribute:customers_list+' => 'Wszyscy klienci posiadający ten model obsługi', +)); + +// +// Class: lnkDeliveryModelToContact +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkDeliveryModelToContact' => 'Połączenie Model obsługi / Kontakt', + 'Class:lnkDeliveryModelToContact+' => '', + 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id' => 'Model obsługi', + 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id+' => '', + 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name' => 'Nazwa modelu obsługi', + 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name+' => '', + 'Class:lnkDeliveryModelToContact/Attribute:contact_id' => 'Kontakt', + 'Class:lnkDeliveryModelToContact/Attribute:contact_id+' => '', + 'Class:lnkDeliveryModelToContact/Attribute:contact_name' => 'Nazwa kontaktu', + 'Class:lnkDeliveryModelToContact/Attribute:contact_name+' => '', + 'Class:lnkDeliveryModelToContact/Attribute:role_id' => 'Rola', + 'Class:lnkDeliveryModelToContact/Attribute:role_id+' => '', + 'Class:lnkDeliveryModelToContact/Attribute:role_name' => 'Nazwa roli', + 'Class:lnkDeliveryModelToContact/Attribute:role_name+' => '', +)); diff --git a/datamodels/2.x/itop-service-mgmt/dictionaries/pl.dict.itop-service-mgmt.php b/datamodels/2.x/itop-service-mgmt/dictionaries/pl.dict.itop-service-mgmt.php index 9e7be93dd..ba94e6166 100644 --- a/datamodels/2.x/itop-service-mgmt/dictionaries/pl.dict.itop-service-mgmt.php +++ b/datamodels/2.x/itop-service-mgmt/dictionaries/pl.dict.itop-service-mgmt.php @@ -1,494 +1,494 @@ - - */ - -// Dictionnay conventions -// Class: -// Class:+ -// Class:/Attribute: -// Class:/Attribute:+ -// Class:/Attribute:/Value: -// Class:/Attribute:/Value:+ -// Class:/Stimulus: -// Class:/Stimulus:+ - - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Menu:ServiceManagement' => 'Zarządzanie usługami', - 'Menu:ServiceManagement+' => 'Omówienie zarządzania usługami', - 'Menu:Service:Overview' => 'Przegląd', - 'Menu:Service:Overview+' => '', - 'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Umowy według poziomu usług', - 'UI-ServiceManagementMenu-ContractsByStatus' => 'Umowy według statusu', - 'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Umowy kończące się za mniej niż 30 dni', - 'Menu:ProviderContract' => 'Umowy z dostawcami', - 'Menu:ProviderContract+' => 'Umowy z dostawcami', - 'Menu:CustomerContract' => 'Umowy z klientami', - 'Menu:CustomerContract+' => 'Umowy z klientami', - 'Menu:ServiceSubcategory' => 'Podkategorie usług', - 'Menu:ServiceSubcategory+' => 'Podkategorie usług', - 'Menu:Service' => 'Usługi', - 'Menu:Service+' => 'Usługi', - 'Menu:ServiceElement' => 'Elementy usługi', - 'Menu:ServiceElement+' => 'Elementy usługi', - 'Menu:SLA' => 'Umowy SLA', - 'Menu:SLA+' => 'Umowy gwarantowanych poziomów usług', - 'Menu:SLT' => 'SLTs', - 'Menu:SLT+' => 'Docelowe poziomy usług', - 'Menu:DeliveryModel' => 'Modele obsługi', - 'Menu:DeliveryModel+' => 'Modele obsługi', - 'Menu:ServiceFamily' => 'Rodziny usług', - 'Menu:ServiceFamily+' => 'Rodziny usług', - 'Menu:Procedure' => 'Katalog procedur', - 'Menu:Procedure+' => 'Katalog wszystkich procedur', -)); - -// -// Class: Organization -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:Organization/Attribute:deliverymodel_id' => 'Model obsługi', - 'Class:Organization/Attribute:deliverymodel_id+' => '', - 'Class:Organization/Attribute:deliverymodel_name' => 'Nazwa modelu obsługi', -)); - - -// -// Class: ContractType -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:ContractType' => 'Typ umowy', - 'Class:ContractType+' => '', -)); - -// -// Class: Contract -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:Contract' => 'Umowa', - 'Class:Contract+' => '', - 'Class:Contract/Attribute:name' => 'Nazwa', - 'Class:Contract/Attribute:name+' => '', - 'Class:Contract/Attribute:org_id' => 'Klient', - 'Class:Contract/Attribute:org_id+' => '', - 'Class:Contract/Attribute:organization_name' => 'Nazwa klienta', - 'Class:Contract/Attribute:organization_name+' => 'Nazwa zwyczajowa', - 'Class:Contract/Attribute:contacts_list' => 'Kontakty', - 'Class:Contract/Attribute:contacts_list+' => 'Wszystkie kontakty do tej umowy z klientem', - 'Class:Contract/Attribute:documents_list' => 'Dokumenty', - 'Class:Contract/Attribute:documents_list+' => 'Wszystkie dokumenty dotyczące tej umowy z klientem', - 'Class:Contract/Attribute:description' => 'Opis', - 'Class:Contract/Attribute:description+' => '', - 'Class:Contract/Attribute:start_date' => 'Data rozpoczęcia', - 'Class:Contract/Attribute:start_date+' => '', - 'Class:Contract/Attribute:end_date' => 'Data zakończenia', - 'Class:Contract/Attribute:end_date+' => '', - 'Class:Contract/Attribute:cost' => 'Koszt', - 'Class:Contract/Attribute:cost+' => '', - 'Class:Contract/Attribute:cost_currency' => 'Waluta kosztu', - 'Class:Contract/Attribute:cost_currency+' => '', - 'Class:Contract/Attribute:cost_currency/Value:dollars' => 'Dolar', - 'Class:Contract/Attribute:cost_currency/Value:dollars+' => '', - 'Class:Contract/Attribute:cost_currency/Value:euros' => 'Euro', - 'Class:Contract/Attribute:cost_currency/Value:euros+' => '', - 'Class:Contract/Attribute:contracttype_id' => 'Typ umowy', - 'Class:Contract/Attribute:contracttype_id+' => '', - 'Class:Contract/Attribute:contracttype_name' => 'Nazwa typu umowy', - 'Class:Contract/Attribute:contracttype_name+' => '', - 'Class:Contract/Attribute:billing_frequency' => 'Częstotliwość rozliczeń', - 'Class:Contract/Attribute:billing_frequency+' => '', - 'Class:Contract/Attribute:cost_unit' => 'Jednostka kosztu', - 'Class:Contract/Attribute:cost_unit+' => '', - 'Class:Contract/Attribute:provider_id' => 'Dostawca', - 'Class:Contract/Attribute:provider_id+' => '', - 'Class:Contract/Attribute:provider_name' => 'Nazwa dostawcy', - 'Class:Contract/Attribute:provider_name+' => 'Nazwa zwyczajowa', - 'Class:Contract/Attribute:status' => 'Status', - 'Class:Contract/Attribute:status+' => '', - 'Class:Contract/Attribute:status/Value:implementation' => 'wdrażane', - 'Class:Contract/Attribute:status/Value:implementation+' => 'wdrażane', - 'Class:Contract/Attribute:status/Value:obsolete' => 'wycofane', - 'Class:Contract/Attribute:status/Value:obsolete+' => 'wycofane', - 'Class:Contract/Attribute:status/Value:production' => 'użytkowane', - 'Class:Contract/Attribute:status/Value:production+' => 'użytkowane', - 'Class:Contract/Attribute:finalclass' => 'Podklasa umowy', - 'Class:Contract/Attribute:finalclass+' => 'Nazwa ostatniej klasy', -)); -// -// Class: CustomerContract -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:CustomerContract' => 'Umowa z klientem', - 'Class:CustomerContract+' => '', - 'Class:CustomerContract/Attribute:services_list' => 'Usługi', - 'Class:CustomerContract/Attribute:services_list+' => 'Wszystkie usługi zakupione w ramach tej umowy', -)); - -// -// Class: ProviderContract -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:ProviderContract' => 'Umowa z dostawcą', - 'Class:ProviderContract+' => '', - 'Class:ProviderContract/Attribute:functionalcis_list' => 'Konfiguracje', - 'Class:ProviderContract/Attribute:functionalcis_list+' => 'Wszystkie elementy konfiguracji objęte niniejszą umową z dostawcą', - 'Class:ProviderContract/Attribute:sla' => 'Umowa SLA', - 'Class:ProviderContract/Attribute:sla+' => 'Umowa dotycząca poziomu usług', - 'Class:ProviderContract/Attribute:coverage' => 'Godziny usługi', - 'Class:ProviderContract/Attribute:coverage+' => '', - 'Class:ProviderContract/Attribute:contracttype_id' => 'Typ umowy', - 'Class:ProviderContract/Attribute:contracttype_id+' => '', - 'Class:ProviderContract/Attribute:contracttype_name' => 'Nazwa typu umowy', - 'Class:ProviderContract/Attribute:contracttype_name+' => '', -)); - -// -// Class: lnkContactToContract -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkContactToContract' => 'Połączenie Kontakt / Umowa', - 'Class:lnkContactToContract+' => '', - 'Class:lnkContactToContract/Attribute:contract_id' => 'Umowa', - 'Class:lnkContactToContract/Attribute:contract_id+' => '', - 'Class:lnkContactToContract/Attribute:contract_name' => 'Nazwa umowy', - 'Class:lnkContactToContract/Attribute:contract_name+' => '', - 'Class:lnkContactToContract/Attribute:contact_id' => 'Kontakt', - 'Class:lnkContactToContract/Attribute:contact_id+' => '', - 'Class:lnkContactToContract/Attribute:contact_name' => 'Nazwa kontaktu', - 'Class:lnkContactToContract/Attribute:contact_name+' => '', -)); - -// -// Class: lnkContractToDocument -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkContractToDocument' => 'Połączenie Umowa / Dokument', - 'Class:lnkContractToDocument+' => '', - 'Class:lnkContractToDocument/Attribute:contract_id' => 'Umowa', - 'Class:lnkContractToDocument/Attribute:contract_id+' => '', - 'Class:lnkContractToDocument/Attribute:contract_name' => 'Nazwa umowy', - 'Class:lnkContractToDocument/Attribute:contract_name+' => '', - 'Class:lnkContractToDocument/Attribute:document_id' => 'Dokument', - 'Class:lnkContractToDocument/Attribute:document_id+' => '', - 'Class:lnkContractToDocument/Attribute:document_name' => 'Nazwa dokumentu', - 'Class:lnkContractToDocument/Attribute:document_name+' => '', -)); - -// -// Class: ServiceFamily -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:ServiceFamily' => 'Rodzina usług', - 'Class:ServiceFamily+' => '', - 'Class:ServiceFamily/Attribute:name' => 'Nazwa', - 'Class:ServiceFamily/Attribute:name+' => '', - 'Class:ServiceFamily/Attribute:icon' => 'Ikona', - 'Class:ServiceFamily/Attribute:icon+' => '', - 'Class:ServiceFamily/Attribute:services_list' => 'Usługi', - 'Class:ServiceFamily/Attribute:services_list+' => 'Wszystkie usługi w tej kategorii', -)); - -// -// Class: Service -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:Service' => 'Usługa', - 'Class:Service+' => '', - 'Class:Service/Attribute:name' => 'Nazwa', - 'Class:Service/Attribute:name+' => '', - 'Class:Service/Attribute:org_id' => 'Dostawca', - 'Class:Service/Attribute:org_id+' => '', - 'Class:Service/Attribute:organization_name' => 'Nazwa dostawcy', - 'Class:Service/Attribute:organization_name+' => '', - 'Class:Service/Attribute:servicefamily_id' => 'Rodzina usług', - 'Class:Service/Attribute:servicefamily_id+' => '', - 'Class:Service/Attribute:servicefamily_name' => 'Nazwa rodziny usług', - 'Class:Service/Attribute:servicefamily_name+' => '', - 'Class:Service/Attribute:description' => 'Opis', - 'Class:Service/Attribute:description+' => '', - 'Class:Service/Attribute:documents_list' => 'Dokumenty', - 'Class:Service/Attribute:documents_list+' => 'Wszystkie dokumenty związane z usługą', - 'Class:Service/Attribute:contacts_list' => 'Kontakty', - 'Class:Service/Attribute:contacts_list+' => 'Wszystkie kontakty do tej usługi', - 'Class:Service/Attribute:status' => 'Status', - 'Class:Service/Attribute:status+' => '', - 'Class:Service/Attribute:status/Value:implementation' => 'wdrażane', - 'Class:Service/Attribute:status/Value:implementation+' => 'wdrażane', - 'Class:Service/Attribute:status/Value:obsolete' => 'wycofane', - 'Class:Service/Attribute:status/Value:obsolete+' => '', - 'Class:Service/Attribute:status/Value:production' => 'użytkowane', - 'Class:Service/Attribute:status/Value:production+' => '', - 'Class:Service/Attribute:icon' => 'Ikona', - 'Class:Service/Attribute:icon+' => '', - 'Class:Service/Attribute:customercontracts_list' => 'Umowy z klientami', - 'Class:Service/Attribute:customercontracts_list+' => 'Wszystkie umowy z klientami, którzy kupili tę usługę', - 'Class:Service/Attribute:providercontracts_list' => 'Umowy z dostawcami', - 'Class:Service/Attribute:providercontracts_list+' => 'Wszystkie umowy z dostawcami na obsługę tej usługi', - 'Class:Service/Attribute:functionalcis_list' => 'Zależy od konfiguracji', - 'Class:Service/Attribute:functionalcis_list+' => 'Wszystkie elementy konfiguracji, które są używane do świadczenia tej usługi', - 'Class:Service/Attribute:servicesubcategories_list' => 'Podkategorie usług', - 'Class:Service/Attribute:servicesubcategories_list+' => 'Wszystkie podkategorie tej usługi', -)); - -// -// Class: lnkDocumentToService -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkDocumentToService' => 'Połączenie Dokument / Usługa', - 'Class:lnkDocumentToService+' => '', - 'Class:lnkDocumentToService/Attribute:service_id' => 'Usługa', - 'Class:lnkDocumentToService/Attribute:service_id+' => '', - 'Class:lnkDocumentToService/Attribute:service_name' => 'Nazwa usługi', - 'Class:lnkDocumentToService/Attribute:service_name+' => '', - 'Class:lnkDocumentToService/Attribute:document_id' => 'Dokument', - 'Class:lnkDocumentToService/Attribute:document_id+' => '', - 'Class:lnkDocumentToService/Attribute:document_name' => 'Nazwa dokumentu', - 'Class:lnkDocumentToService/Attribute:document_name+' => '', -)); - -// -// Class: lnkContactToService -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkContactToService' => 'Połączenie Kontakt / Usługa', - 'Class:lnkContactToService+' => '', - 'Class:lnkContactToService/Attribute:service_id' => 'Usługa', - 'Class:lnkContactToService/Attribute:service_id+' => '', - 'Class:lnkContactToService/Attribute:service_name' => 'Nazwa usługi', - 'Class:lnkContactToService/Attribute:service_name+' => '', - 'Class:lnkContactToService/Attribute:contact_id' => 'Kontakt', - 'Class:lnkContactToService/Attribute:contact_id+' => '', - 'Class:lnkContactToService/Attribute:contact_name' => 'Nazwa kontaktu', - 'Class:lnkContactToService/Attribute:contact_name+' => '', -)); - -// -// Class: ServiceSubcategory -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:ServiceSubcategory' => 'Podkategoria usługi', - 'Class:ServiceSubcategory+' => '', - 'Class:ServiceSubcategory/Attribute:name' => 'Nazwa', - 'Class:ServiceSubcategory/Attribute:name+' => '', - 'Class:ServiceSubcategory/Attribute:description' => 'Opis', - 'Class:ServiceSubcategory/Attribute:description+' => '', - 'Class:ServiceSubcategory/Attribute:service_id' => 'Usługa', - 'Class:ServiceSubcategory/Attribute:service_id+' => '', - 'Class:ServiceSubcategory/Attribute:service_name' => 'Nazwa usługi', - 'Class:ServiceSubcategory/Attribute:service_name+' => '', - 'Class:ServiceSubcategory/Attribute:request_type' => 'Typ zgłoszenia', - 'Class:ServiceSubcategory/Attribute:request_type+' => '', - 'Class:ServiceSubcategory/Attribute:request_type/Value:incident' => 'incydent', - 'Class:ServiceSubcategory/Attribute:request_type/Value:incident+' => 'incydent', - 'Class:ServiceSubcategory/Attribute:request_type/Value:service_request' => 'zgłoszenie serwisowe', - 'Class:ServiceSubcategory/Attribute:request_type/Value:service_request+' => 'zgłoszenie serwisowe', - 'Class:ServiceSubcategory/Attribute:status' => 'Status', - 'Class:ServiceSubcategory/Attribute:status+' => '', - 'Class:ServiceSubcategory/Attribute:status/Value:implementation' => 'wdrażane', - 'Class:ServiceSubcategory/Attribute:status/Value:implementation+' => 'wdrażane', - 'Class:ServiceSubcategory/Attribute:status/Value:obsolete' => 'wycofane', - 'Class:ServiceSubcategory/Attribute:status/Value:obsolete+' => 'wycofane', - 'Class:ServiceSubcategory/Attribute:status/Value:production' => 'użytkowane', - 'Class:ServiceSubcategory/Attribute:status/Value:production+' => 'użytkowane', -)); - -// -// Class: SLA -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:SLA' => 'Umowa SLA', - 'Class:SLA+' => '', - 'Class:SLA/Attribute:name' => 'Nazwa', - 'Class:SLA/Attribute:name+' => '', - 'Class:SLA/Attribute:description' => 'Opis', - 'Class:SLA/Attribute:description+' => '', - 'Class:SLA/Attribute:org_id' => 'Dostawca', - 'Class:SLA/Attribute:org_id+' => '', - 'Class:SLA/Attribute:organization_name' => 'Nazwa dostawcy', - 'Class:SLA/Attribute:organization_name+' => 'Nazwa zwyczajowa', - 'Class:SLA/Attribute:slts_list' => 'Poziomy usług (SLT)', - 'Class:SLA/Attribute:slts_list+' => 'Wszystkie docelowe poziomy usług dla tej umowy SLA', - 'Class:SLA/Attribute:customercontracts_list' => 'Umowy z klientami', - 'Class:SLA/Attribute:customercontracts_list+' => 'Wszystkie umowy z klientami korzystające z tej umowy SLA', - 'Class:SLA/Error:UniqueLnkCustomerContractToService' => 'Nie udało się zapisać połączenia z umową klienta %1$s i usługą %2$s : Umowa SLA już istnieje', -)); - -// -// Class: SLT -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:SLT' => 'Poziom usług SLT', - 'Class:SLT+' => '', - 'Class:SLT/Attribute:name' => 'Nazwa', - 'Class:SLT/Attribute:name+' => '', - 'Class:SLT/Attribute:priority' => 'Priorytet', - 'Class:SLT/Attribute:priority+' => '', - 'Class:SLT/Attribute:priority/Value:1' => 'krytyczny', - 'Class:SLT/Attribute:priority/Value:1+' => 'krytyczny', - 'Class:SLT/Attribute:priority/Value:2' => 'wysoki', - 'Class:SLT/Attribute:priority/Value:2+' => 'wysoki', - 'Class:SLT/Attribute:priority/Value:3' => 'średni', - 'Class:SLT/Attribute:priority/Value:3+' => 'średni', - 'Class:SLT/Attribute:priority/Value:4' => 'niski', - 'Class:SLT/Attribute:priority/Value:4+' => 'niski', - 'Class:SLT/Attribute:request_type' => 'Typ zgłoszenia', - 'Class:SLT/Attribute:request_type+' => '', - 'Class:SLT/Attribute:request_type/Value:incident' => 'incydent', - 'Class:SLT/Attribute:request_type/Value:incident+' => 'incydent', - 'Class:SLT/Attribute:request_type/Value:service_request' => 'zgłoszenie serwisowe', - 'Class:SLT/Attribute:request_type/Value:service_request+' => 'zgłoszenie serwisowe', - 'Class:SLT/Attribute:metric' => 'Miara', - 'Class:SLT/Attribute:metric+' => '', - 'Class:SLT/Attribute:metric/Value:tto' => 'Termin podjęcia TTO', - 'Class:SLT/Attribute:metric/Value:tto+' => 'Termin podjęcia TTO', - 'Class:SLT/Attribute:metric/Value:ttr' => 'Termin rozwiązania TTR', - 'Class:SLT/Attribute:metric/Value:ttr+' => 'Termin rozwiązania TTR', - 'Class:SLT/Attribute:value' => 'Wartość', - 'Class:SLT/Attribute:value+' => '', - 'Class:SLT/Attribute:unit' => 'Jednostka', - 'Class:SLT/Attribute:unit+' => '', - 'Class:SLT/Attribute:unit/Value:hours' => 'godzin', - 'Class:SLT/Attribute:unit/Value:hours+' => 'godzin', - 'Class:SLT/Attribute:unit/Value:minutes' => 'minut', - 'Class:SLT/Attribute:unit/Value:minutes+' => 'minut', -)); - -// -// Class: lnkSLAToSLT -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkSLAToSLT' => 'Połączenie SLA / SLT', - 'Class:lnkSLAToSLT+' => '', - 'Class:lnkSLAToSLT/Attribute:sla_id' => 'Umowa SLA', - 'Class:lnkSLAToSLT/Attribute:sla_id+' => '', - 'Class:lnkSLAToSLT/Attribute:sla_name' => 'Nazwa umowy SLA', - 'Class:lnkSLAToSLT/Attribute:sla_name+' => '', - 'Class:lnkSLAToSLT/Attribute:slt_id' => 'Poziom usług SLT', - 'Class:lnkSLAToSLT/Attribute:slt_id+' => '', - 'Class:lnkSLAToSLT/Attribute:slt_name' => 'Nazwa poziomu usług SLT', - 'Class:lnkSLAToSLT/Attribute:slt_name+' => '', - 'Class:lnkSLAToSLT/Attribute:slt_metric' => 'Miara poziomu usług SLT', - 'Class:lnkSLAToSLT/Attribute:slt_metric+' => '', - 'Class:lnkSLAToSLT/Attribute:slt_request_type' => 'Typ zgłoszenia SLT', - 'Class:lnkSLAToSLT/Attribute:slt_request_type+' => '', - 'Class:lnkSLAToSLT/Attribute:slt_ticket_priority' => 'Priorytet zgłoszeń SLT', - 'Class:lnkSLAToSLT/Attribute:slt_ticket_priority+' => '', - 'Class:lnkSLAToSLT/Attribute:slt_value' => 'Wartość SLT', - 'Class:lnkSLAToSLT/Attribute:slt_value+' => '', - 'Class:lnkSLAToSLT/Attribute:slt_value_unit' => 'Jednostka wartości SLT', - 'Class:lnkSLAToSLT/Attribute:slt_value_unit+' => '', -)); - -// -// Class: lnkCustomerContractToService -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkCustomerContractToService' => 'Połączenie Umowa z klientem / Usługa', - 'Class:lnkCustomerContractToService+' => '', - 'Class:lnkCustomerContractToService/Attribute:customercontract_id' => 'Umowa z klientem', - 'Class:lnkCustomerContractToService/Attribute:customercontract_id+' => '', - 'Class:lnkCustomerContractToService/Attribute:customercontract_name' => 'Nazwa umowy z klientem', - 'Class:lnkCustomerContractToService/Attribute:customercontract_name+' => '', - 'Class:lnkCustomerContractToService/Attribute:service_id' => 'Usługa', - 'Class:lnkCustomerContractToService/Attribute:service_id+' => '', - 'Class:lnkCustomerContractToService/Attribute:service_name' => 'Nazwa usługi', - 'Class:lnkCustomerContractToService/Attribute:service_name+' => '', - 'Class:lnkCustomerContractToService/Attribute:sla_id' => 'Umowa SLA', - 'Class:lnkCustomerContractToService/Attribute:sla_id+' => '', - 'Class:lnkCustomerContractToService/Attribute:sla_name' => 'Nazwa umowy SLA', - 'Class:lnkCustomerContractToService/Attribute:sla_name+' => '', -)); - -// -// Class: lnkProviderContractToService -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkProviderContractToService' => 'Połączenie Umowa z dostawcą / Usługa', - 'Class:lnkProviderContractToService+' => '', - 'Class:lnkProviderContractToService/Attribute:service_id' => 'Usługa', - 'Class:lnkProviderContractToService/Attribute:service_id+' => '', - 'Class:lnkProviderContractToService/Attribute:service_name' => 'Nazwa usługi', - 'Class:lnkProviderContractToService/Attribute:service_name+' => '', - 'Class:lnkProviderContractToService/Attribute:providercontract_id' => 'Umowa z dostawcą', - 'Class:lnkProviderContractToService/Attribute:providercontract_id+' => '', - 'Class:lnkProviderContractToService/Attribute:providercontract_name' => 'Nazwa umowy z dostawcą', - 'Class:lnkProviderContractToService/Attribute:providercontract_name+' => '', -)); - -// -// Class: DeliveryModel -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:DeliveryModel' => 'Model obsługi', - 'Class:DeliveryModel+' => '', - 'Class:DeliveryModel/Attribute:name' => 'Nazwa', - 'Class:DeliveryModel/Attribute:name+' => '', - 'Class:DeliveryModel/Attribute:org_id' => 'Organizacja', - 'Class:DeliveryModel/Attribute:org_id+' => '', - 'Class:DeliveryModel/Attribute:organization_name' => 'Nazwa organizacji', - 'Class:DeliveryModel/Attribute:organization_name+' => 'Nazwa zwyczajowa', - 'Class:DeliveryModel/Attribute:description' => 'Opis', - 'Class:DeliveryModel/Attribute:description+' => '', - 'Class:DeliveryModel/Attribute:contacts_list' => 'Kontakty', - 'Class:DeliveryModel/Attribute:contacts_list+' => 'Wszystkie kontakty (zespoły i osoby) dla tego modelu obsługi', - 'Class:DeliveryModel/Attribute:customers_list' => 'Klienci', - 'Class:DeliveryModel/Attribute:customers_list+' => 'Wszyscy klienci posiadający ten model obsługi', -)); - -// -// Class: lnkDeliveryModelToContact -// - -Dict::Add('PL PL', 'Polish', 'Polski', array( - 'Class:lnkDeliveryModelToContact' => 'Połączenie Model obsługi / Kontakt', - 'Class:lnkDeliveryModelToContact+' => '', - 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id' => 'Model obsługi', - 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id+' => '', - 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name' => 'Nazwa modelu obsługi', - 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name+' => '', - 'Class:lnkDeliveryModelToContact/Attribute:contact_id' => 'Kontakt', - 'Class:lnkDeliveryModelToContact/Attribute:contact_id+' => '', - 'Class:lnkDeliveryModelToContact/Attribute:contact_name' => 'Nazwa kontaktu', - 'Class:lnkDeliveryModelToContact/Attribute:contact_name+' => '', - 'Class:lnkDeliveryModelToContact/Attribute:role_id' => 'Rola', - 'Class:lnkDeliveryModelToContact/Attribute:role_id+' => '', - 'Class:lnkDeliveryModelToContact/Attribute:role_name' => 'Nazwa roli', - 'Class:lnkDeliveryModelToContact/Attribute:role_name+' => '', -)); + + */ + +// Dictionnay conventions +// Class: +// Class:+ +// Class:/Attribute: +// Class:/Attribute:+ +// Class:/Attribute:/Value: +// Class:/Attribute:/Value:+ +// Class:/Stimulus: +// Class:/Stimulus:+ + + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Menu:ServiceManagement' => 'Zarządzanie usługami', + 'Menu:ServiceManagement+' => 'Omówienie zarządzania usługami', + 'Menu:Service:Overview' => 'Przegląd', + 'Menu:Service:Overview+' => '', + 'UI-ServiceManagementMenu-ContractsBySrvLevel' => 'Umowy według poziomu usług', + 'UI-ServiceManagementMenu-ContractsByStatus' => 'Umowy według statusu', + 'UI-ServiceManagementMenu-ContractsEndingIn30Days' => 'Umowy kończące się za mniej niż 30 dni', + 'Menu:ProviderContract' => 'Umowy z dostawcami', + 'Menu:ProviderContract+' => 'Umowy z dostawcami', + 'Menu:CustomerContract' => 'Umowy z klientami', + 'Menu:CustomerContract+' => 'Umowy z klientami', + 'Menu:ServiceSubcategory' => 'Podkategorie usług', + 'Menu:ServiceSubcategory+' => 'Podkategorie usług', + 'Menu:Service' => 'Usługi', + 'Menu:Service+' => 'Usługi', + 'Menu:ServiceElement' => 'Elementy usługi', + 'Menu:ServiceElement+' => 'Elementy usługi', + 'Menu:SLA' => 'Umowy SLA', + 'Menu:SLA+' => 'Umowy gwarantowanych poziomów usług', + 'Menu:SLT' => 'SLTs', + 'Menu:SLT+' => 'Docelowe poziomy usług', + 'Menu:DeliveryModel' => 'Modele obsługi', + 'Menu:DeliveryModel+' => 'Modele obsługi', + 'Menu:ServiceFamily' => 'Rodziny usług', + 'Menu:ServiceFamily+' => 'Rodziny usług', + 'Menu:Procedure' => 'Katalog procedur', + 'Menu:Procedure+' => 'Katalog wszystkich procedur', +)); + +// +// Class: Organization +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:Organization/Attribute:deliverymodel_id' => 'Model obsługi', + 'Class:Organization/Attribute:deliverymodel_id+' => '', + 'Class:Organization/Attribute:deliverymodel_name' => 'Nazwa modelu obsługi', +)); + + +// +// Class: ContractType +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:ContractType' => 'Typ umowy', + 'Class:ContractType+' => '', +)); + +// +// Class: Contract +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:Contract' => 'Umowa', + 'Class:Contract+' => '', + 'Class:Contract/Attribute:name' => 'Nazwa', + 'Class:Contract/Attribute:name+' => '', + 'Class:Contract/Attribute:org_id' => 'Klient', + 'Class:Contract/Attribute:org_id+' => '', + 'Class:Contract/Attribute:organization_name' => 'Nazwa klienta', + 'Class:Contract/Attribute:organization_name+' => 'Nazwa zwyczajowa', + 'Class:Contract/Attribute:contacts_list' => 'Kontakty', + 'Class:Contract/Attribute:contacts_list+' => 'Wszystkie kontakty do tej umowy z klientem', + 'Class:Contract/Attribute:documents_list' => 'Dokumenty', + 'Class:Contract/Attribute:documents_list+' => 'Wszystkie dokumenty dotyczące tej umowy z klientem', + 'Class:Contract/Attribute:description' => 'Opis', + 'Class:Contract/Attribute:description+' => '', + 'Class:Contract/Attribute:start_date' => 'Data rozpoczęcia', + 'Class:Contract/Attribute:start_date+' => '', + 'Class:Contract/Attribute:end_date' => 'Data zakończenia', + 'Class:Contract/Attribute:end_date+' => '', + 'Class:Contract/Attribute:cost' => 'Koszt', + 'Class:Contract/Attribute:cost+' => '', + 'Class:Contract/Attribute:cost_currency' => 'Waluta kosztu', + 'Class:Contract/Attribute:cost_currency+' => '', + 'Class:Contract/Attribute:cost_currency/Value:dollars' => 'Dolar', + 'Class:Contract/Attribute:cost_currency/Value:dollars+' => '', + 'Class:Contract/Attribute:cost_currency/Value:euros' => 'Euro', + 'Class:Contract/Attribute:cost_currency/Value:euros+' => '', + 'Class:Contract/Attribute:contracttype_id' => 'Typ umowy', + 'Class:Contract/Attribute:contracttype_id+' => '', + 'Class:Contract/Attribute:contracttype_name' => 'Nazwa typu umowy', + 'Class:Contract/Attribute:contracttype_name+' => '', + 'Class:Contract/Attribute:billing_frequency' => 'Częstotliwość rozliczeń', + 'Class:Contract/Attribute:billing_frequency+' => '', + 'Class:Contract/Attribute:cost_unit' => 'Jednostka kosztu', + 'Class:Contract/Attribute:cost_unit+' => '', + 'Class:Contract/Attribute:provider_id' => 'Dostawca', + 'Class:Contract/Attribute:provider_id+' => '', + 'Class:Contract/Attribute:provider_name' => 'Nazwa dostawcy', + 'Class:Contract/Attribute:provider_name+' => 'Nazwa zwyczajowa', + 'Class:Contract/Attribute:status' => 'Status', + 'Class:Contract/Attribute:status+' => '', + 'Class:Contract/Attribute:status/Value:implementation' => 'wdrażane', + 'Class:Contract/Attribute:status/Value:implementation+' => 'wdrażane', + 'Class:Contract/Attribute:status/Value:obsolete' => 'wycofane', + 'Class:Contract/Attribute:status/Value:obsolete+' => 'wycofane', + 'Class:Contract/Attribute:status/Value:production' => 'użytkowane', + 'Class:Contract/Attribute:status/Value:production+' => 'użytkowane', + 'Class:Contract/Attribute:finalclass' => 'Podklasa umowy', + 'Class:Contract/Attribute:finalclass+' => 'Nazwa ostatniej klasy', +)); +// +// Class: CustomerContract +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:CustomerContract' => 'Umowa z klientem', + 'Class:CustomerContract+' => '', + 'Class:CustomerContract/Attribute:services_list' => 'Usługi', + 'Class:CustomerContract/Attribute:services_list+' => 'Wszystkie usługi zakupione w ramach tej umowy', +)); + +// +// Class: ProviderContract +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:ProviderContract' => 'Umowa z dostawcą', + 'Class:ProviderContract+' => '', + 'Class:ProviderContract/Attribute:functionalcis_list' => 'Konfiguracje', + 'Class:ProviderContract/Attribute:functionalcis_list+' => 'Wszystkie elementy konfiguracji objęte niniejszą umową z dostawcą', + 'Class:ProviderContract/Attribute:sla' => 'Umowa SLA', + 'Class:ProviderContract/Attribute:sla+' => 'Umowa dotycząca poziomu usług', + 'Class:ProviderContract/Attribute:coverage' => 'Godziny usługi', + 'Class:ProviderContract/Attribute:coverage+' => '', + 'Class:ProviderContract/Attribute:contracttype_id' => 'Typ umowy', + 'Class:ProviderContract/Attribute:contracttype_id+' => '', + 'Class:ProviderContract/Attribute:contracttype_name' => 'Nazwa typu umowy', + 'Class:ProviderContract/Attribute:contracttype_name+' => '', +)); + +// +// Class: lnkContactToContract +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkContactToContract' => 'Połączenie Kontakt / Umowa', + 'Class:lnkContactToContract+' => '', + 'Class:lnkContactToContract/Attribute:contract_id' => 'Umowa', + 'Class:lnkContactToContract/Attribute:contract_id+' => '', + 'Class:lnkContactToContract/Attribute:contract_name' => 'Nazwa umowy', + 'Class:lnkContactToContract/Attribute:contract_name+' => '', + 'Class:lnkContactToContract/Attribute:contact_id' => 'Kontakt', + 'Class:lnkContactToContract/Attribute:contact_id+' => '', + 'Class:lnkContactToContract/Attribute:contact_name' => 'Nazwa kontaktu', + 'Class:lnkContactToContract/Attribute:contact_name+' => '', +)); + +// +// Class: lnkContractToDocument +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkContractToDocument' => 'Połączenie Umowa / Dokument', + 'Class:lnkContractToDocument+' => '', + 'Class:lnkContractToDocument/Attribute:contract_id' => 'Umowa', + 'Class:lnkContractToDocument/Attribute:contract_id+' => '', + 'Class:lnkContractToDocument/Attribute:contract_name' => 'Nazwa umowy', + 'Class:lnkContractToDocument/Attribute:contract_name+' => '', + 'Class:lnkContractToDocument/Attribute:document_id' => 'Dokument', + 'Class:lnkContractToDocument/Attribute:document_id+' => '', + 'Class:lnkContractToDocument/Attribute:document_name' => 'Nazwa dokumentu', + 'Class:lnkContractToDocument/Attribute:document_name+' => '', +)); + +// +// Class: ServiceFamily +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:ServiceFamily' => 'Rodzina usług', + 'Class:ServiceFamily+' => '', + 'Class:ServiceFamily/Attribute:name' => 'Nazwa', + 'Class:ServiceFamily/Attribute:name+' => '', + 'Class:ServiceFamily/Attribute:icon' => 'Ikona', + 'Class:ServiceFamily/Attribute:icon+' => '', + 'Class:ServiceFamily/Attribute:services_list' => 'Usługi', + 'Class:ServiceFamily/Attribute:services_list+' => 'Wszystkie usługi w tej kategorii', +)); + +// +// Class: Service +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:Service' => 'Usługa', + 'Class:Service+' => '', + 'Class:Service/Attribute:name' => 'Nazwa', + 'Class:Service/Attribute:name+' => '', + 'Class:Service/Attribute:org_id' => 'Dostawca', + 'Class:Service/Attribute:org_id+' => '', + 'Class:Service/Attribute:organization_name' => 'Nazwa dostawcy', + 'Class:Service/Attribute:organization_name+' => '', + 'Class:Service/Attribute:servicefamily_id' => 'Rodzina usług', + 'Class:Service/Attribute:servicefamily_id+' => '', + 'Class:Service/Attribute:servicefamily_name' => 'Nazwa rodziny usług', + 'Class:Service/Attribute:servicefamily_name+' => '', + 'Class:Service/Attribute:description' => 'Opis', + 'Class:Service/Attribute:description+' => '', + 'Class:Service/Attribute:documents_list' => 'Dokumenty', + 'Class:Service/Attribute:documents_list+' => 'Wszystkie dokumenty związane z usługą', + 'Class:Service/Attribute:contacts_list' => 'Kontakty', + 'Class:Service/Attribute:contacts_list+' => 'Wszystkie kontakty do tej usługi', + 'Class:Service/Attribute:status' => 'Status', + 'Class:Service/Attribute:status+' => '', + 'Class:Service/Attribute:status/Value:implementation' => 'wdrażane', + 'Class:Service/Attribute:status/Value:implementation+' => 'wdrażane', + 'Class:Service/Attribute:status/Value:obsolete' => 'wycofane', + 'Class:Service/Attribute:status/Value:obsolete+' => '', + 'Class:Service/Attribute:status/Value:production' => 'użytkowane', + 'Class:Service/Attribute:status/Value:production+' => '', + 'Class:Service/Attribute:icon' => 'Ikona', + 'Class:Service/Attribute:icon+' => '', + 'Class:Service/Attribute:customercontracts_list' => 'Umowy z klientami', + 'Class:Service/Attribute:customercontracts_list+' => 'Wszystkie umowy z klientami, którzy kupili tę usługę', + 'Class:Service/Attribute:providercontracts_list' => 'Umowy z dostawcami', + 'Class:Service/Attribute:providercontracts_list+' => 'Wszystkie umowy z dostawcami na obsługę tej usługi', + 'Class:Service/Attribute:functionalcis_list' => 'Zależy od konfiguracji', + 'Class:Service/Attribute:functionalcis_list+' => 'Wszystkie elementy konfiguracji, które są używane do świadczenia tej usługi', + 'Class:Service/Attribute:servicesubcategories_list' => 'Podkategorie usług', + 'Class:Service/Attribute:servicesubcategories_list+' => 'Wszystkie podkategorie tej usługi', +)); + +// +// Class: lnkDocumentToService +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkDocumentToService' => 'Połączenie Dokument / Usługa', + 'Class:lnkDocumentToService+' => '', + 'Class:lnkDocumentToService/Attribute:service_id' => 'Usługa', + 'Class:lnkDocumentToService/Attribute:service_id+' => '', + 'Class:lnkDocumentToService/Attribute:service_name' => 'Nazwa usługi', + 'Class:lnkDocumentToService/Attribute:service_name+' => '', + 'Class:lnkDocumentToService/Attribute:document_id' => 'Dokument', + 'Class:lnkDocumentToService/Attribute:document_id+' => '', + 'Class:lnkDocumentToService/Attribute:document_name' => 'Nazwa dokumentu', + 'Class:lnkDocumentToService/Attribute:document_name+' => '', +)); + +// +// Class: lnkContactToService +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkContactToService' => 'Połączenie Kontakt / Usługa', + 'Class:lnkContactToService+' => '', + 'Class:lnkContactToService/Attribute:service_id' => 'Usługa', + 'Class:lnkContactToService/Attribute:service_id+' => '', + 'Class:lnkContactToService/Attribute:service_name' => 'Nazwa usługi', + 'Class:lnkContactToService/Attribute:service_name+' => '', + 'Class:lnkContactToService/Attribute:contact_id' => 'Kontakt', + 'Class:lnkContactToService/Attribute:contact_id+' => '', + 'Class:lnkContactToService/Attribute:contact_name' => 'Nazwa kontaktu', + 'Class:lnkContactToService/Attribute:contact_name+' => '', +)); + +// +// Class: ServiceSubcategory +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:ServiceSubcategory' => 'Podkategoria usługi', + 'Class:ServiceSubcategory+' => '', + 'Class:ServiceSubcategory/Attribute:name' => 'Nazwa', + 'Class:ServiceSubcategory/Attribute:name+' => '', + 'Class:ServiceSubcategory/Attribute:description' => 'Opis', + 'Class:ServiceSubcategory/Attribute:description+' => '', + 'Class:ServiceSubcategory/Attribute:service_id' => 'Usługa', + 'Class:ServiceSubcategory/Attribute:service_id+' => '', + 'Class:ServiceSubcategory/Attribute:service_name' => 'Nazwa usługi', + 'Class:ServiceSubcategory/Attribute:service_name+' => '', + 'Class:ServiceSubcategory/Attribute:request_type' => 'Typ zgłoszenia', + 'Class:ServiceSubcategory/Attribute:request_type+' => '', + 'Class:ServiceSubcategory/Attribute:request_type/Value:incident' => 'incydent', + 'Class:ServiceSubcategory/Attribute:request_type/Value:incident+' => 'incydent', + 'Class:ServiceSubcategory/Attribute:request_type/Value:service_request' => 'zgłoszenie serwisowe', + 'Class:ServiceSubcategory/Attribute:request_type/Value:service_request+' => 'zgłoszenie serwisowe', + 'Class:ServiceSubcategory/Attribute:status' => 'Status', + 'Class:ServiceSubcategory/Attribute:status+' => '', + 'Class:ServiceSubcategory/Attribute:status/Value:implementation' => 'wdrażane', + 'Class:ServiceSubcategory/Attribute:status/Value:implementation+' => 'wdrażane', + 'Class:ServiceSubcategory/Attribute:status/Value:obsolete' => 'wycofane', + 'Class:ServiceSubcategory/Attribute:status/Value:obsolete+' => 'wycofane', + 'Class:ServiceSubcategory/Attribute:status/Value:production' => 'użytkowane', + 'Class:ServiceSubcategory/Attribute:status/Value:production+' => 'użytkowane', +)); + +// +// Class: SLA +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:SLA' => 'Umowa SLA', + 'Class:SLA+' => '', + 'Class:SLA/Attribute:name' => 'Nazwa', + 'Class:SLA/Attribute:name+' => '', + 'Class:SLA/Attribute:description' => 'Opis', + 'Class:SLA/Attribute:description+' => '', + 'Class:SLA/Attribute:org_id' => 'Dostawca', + 'Class:SLA/Attribute:org_id+' => '', + 'Class:SLA/Attribute:organization_name' => 'Nazwa dostawcy', + 'Class:SLA/Attribute:organization_name+' => 'Nazwa zwyczajowa', + 'Class:SLA/Attribute:slts_list' => 'Poziomy usług (SLT)', + 'Class:SLA/Attribute:slts_list+' => 'Wszystkie docelowe poziomy usług dla tej umowy SLA', + 'Class:SLA/Attribute:customercontracts_list' => 'Umowy z klientami', + 'Class:SLA/Attribute:customercontracts_list+' => 'Wszystkie umowy z klientami korzystające z tej umowy SLA', + 'Class:SLA/Error:UniqueLnkCustomerContractToService' => 'Nie udało się zapisać połączenia z umową klienta %1$s i usługą %2$s : Umowa SLA już istnieje', +)); + +// +// Class: SLT +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:SLT' => 'Poziom usług SLT', + 'Class:SLT+' => '', + 'Class:SLT/Attribute:name' => 'Nazwa', + 'Class:SLT/Attribute:name+' => '', + 'Class:SLT/Attribute:priority' => 'Priorytet', + 'Class:SLT/Attribute:priority+' => '', + 'Class:SLT/Attribute:priority/Value:1' => 'krytyczny', + 'Class:SLT/Attribute:priority/Value:1+' => 'krytyczny', + 'Class:SLT/Attribute:priority/Value:2' => 'wysoki', + 'Class:SLT/Attribute:priority/Value:2+' => 'wysoki', + 'Class:SLT/Attribute:priority/Value:3' => 'średni', + 'Class:SLT/Attribute:priority/Value:3+' => 'średni', + 'Class:SLT/Attribute:priority/Value:4' => 'niski', + 'Class:SLT/Attribute:priority/Value:4+' => 'niski', + 'Class:SLT/Attribute:request_type' => 'Typ zgłoszenia', + 'Class:SLT/Attribute:request_type+' => '', + 'Class:SLT/Attribute:request_type/Value:incident' => 'incydent', + 'Class:SLT/Attribute:request_type/Value:incident+' => 'incydent', + 'Class:SLT/Attribute:request_type/Value:service_request' => 'zgłoszenie serwisowe', + 'Class:SLT/Attribute:request_type/Value:service_request+' => 'zgłoszenie serwisowe', + 'Class:SLT/Attribute:metric' => 'Miara', + 'Class:SLT/Attribute:metric+' => '', + 'Class:SLT/Attribute:metric/Value:tto' => 'Termin podjęcia TTO', + 'Class:SLT/Attribute:metric/Value:tto+' => 'Termin podjęcia TTO', + 'Class:SLT/Attribute:metric/Value:ttr' => 'Termin rozwiązania TTR', + 'Class:SLT/Attribute:metric/Value:ttr+' => 'Termin rozwiązania TTR', + 'Class:SLT/Attribute:value' => 'Wartość', + 'Class:SLT/Attribute:value+' => '', + 'Class:SLT/Attribute:unit' => 'Jednostka', + 'Class:SLT/Attribute:unit+' => '', + 'Class:SLT/Attribute:unit/Value:hours' => 'godzin', + 'Class:SLT/Attribute:unit/Value:hours+' => 'godzin', + 'Class:SLT/Attribute:unit/Value:minutes' => 'minut', + 'Class:SLT/Attribute:unit/Value:minutes+' => 'minut', +)); + +// +// Class: lnkSLAToSLT +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkSLAToSLT' => 'Połączenie SLA / SLT', + 'Class:lnkSLAToSLT+' => '', + 'Class:lnkSLAToSLT/Attribute:sla_id' => 'Umowa SLA', + 'Class:lnkSLAToSLT/Attribute:sla_id+' => '', + 'Class:lnkSLAToSLT/Attribute:sla_name' => 'Nazwa umowy SLA', + 'Class:lnkSLAToSLT/Attribute:sla_name+' => '', + 'Class:lnkSLAToSLT/Attribute:slt_id' => 'Poziom usług SLT', + 'Class:lnkSLAToSLT/Attribute:slt_id+' => '', + 'Class:lnkSLAToSLT/Attribute:slt_name' => 'Nazwa poziomu usług SLT', + 'Class:lnkSLAToSLT/Attribute:slt_name+' => '', + 'Class:lnkSLAToSLT/Attribute:slt_metric' => 'Miara poziomu usług SLT', + 'Class:lnkSLAToSLT/Attribute:slt_metric+' => '', + 'Class:lnkSLAToSLT/Attribute:slt_request_type' => 'Typ zgłoszenia SLT', + 'Class:lnkSLAToSLT/Attribute:slt_request_type+' => '', + 'Class:lnkSLAToSLT/Attribute:slt_ticket_priority' => 'Priorytet zgłoszeń SLT', + 'Class:lnkSLAToSLT/Attribute:slt_ticket_priority+' => '', + 'Class:lnkSLAToSLT/Attribute:slt_value' => 'Wartość SLT', + 'Class:lnkSLAToSLT/Attribute:slt_value+' => '', + 'Class:lnkSLAToSLT/Attribute:slt_value_unit' => 'Jednostka wartości SLT', + 'Class:lnkSLAToSLT/Attribute:slt_value_unit+' => '', +)); + +// +// Class: lnkCustomerContractToService +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkCustomerContractToService' => 'Połączenie Umowa z klientem / Usługa', + 'Class:lnkCustomerContractToService+' => '', + 'Class:lnkCustomerContractToService/Attribute:customercontract_id' => 'Umowa z klientem', + 'Class:lnkCustomerContractToService/Attribute:customercontract_id+' => '', + 'Class:lnkCustomerContractToService/Attribute:customercontract_name' => 'Nazwa umowy z klientem', + 'Class:lnkCustomerContractToService/Attribute:customercontract_name+' => '', + 'Class:lnkCustomerContractToService/Attribute:service_id' => 'Usługa', + 'Class:lnkCustomerContractToService/Attribute:service_id+' => '', + 'Class:lnkCustomerContractToService/Attribute:service_name' => 'Nazwa usługi', + 'Class:lnkCustomerContractToService/Attribute:service_name+' => '', + 'Class:lnkCustomerContractToService/Attribute:sla_id' => 'Umowa SLA', + 'Class:lnkCustomerContractToService/Attribute:sla_id+' => '', + 'Class:lnkCustomerContractToService/Attribute:sla_name' => 'Nazwa umowy SLA', + 'Class:lnkCustomerContractToService/Attribute:sla_name+' => '', +)); + +// +// Class: lnkProviderContractToService +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkProviderContractToService' => 'Połączenie Umowa z dostawcą / Usługa', + 'Class:lnkProviderContractToService+' => '', + 'Class:lnkProviderContractToService/Attribute:service_id' => 'Usługa', + 'Class:lnkProviderContractToService/Attribute:service_id+' => '', + 'Class:lnkProviderContractToService/Attribute:service_name' => 'Nazwa usługi', + 'Class:lnkProviderContractToService/Attribute:service_name+' => '', + 'Class:lnkProviderContractToService/Attribute:providercontract_id' => 'Umowa z dostawcą', + 'Class:lnkProviderContractToService/Attribute:providercontract_id+' => '', + 'Class:lnkProviderContractToService/Attribute:providercontract_name' => 'Nazwa umowy z dostawcą', + 'Class:lnkProviderContractToService/Attribute:providercontract_name+' => '', +)); + +// +// Class: DeliveryModel +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:DeliveryModel' => 'Model obsługi', + 'Class:DeliveryModel+' => '', + 'Class:DeliveryModel/Attribute:name' => 'Nazwa', + 'Class:DeliveryModel/Attribute:name+' => '', + 'Class:DeliveryModel/Attribute:org_id' => 'Organizacja', + 'Class:DeliveryModel/Attribute:org_id+' => '', + 'Class:DeliveryModel/Attribute:organization_name' => 'Nazwa organizacji', + 'Class:DeliveryModel/Attribute:organization_name+' => 'Nazwa zwyczajowa', + 'Class:DeliveryModel/Attribute:description' => 'Opis', + 'Class:DeliveryModel/Attribute:description+' => '', + 'Class:DeliveryModel/Attribute:contacts_list' => 'Kontakty', + 'Class:DeliveryModel/Attribute:contacts_list+' => 'Wszystkie kontakty (zespoły i osoby) dla tego modelu obsługi', + 'Class:DeliveryModel/Attribute:customers_list' => 'Klienci', + 'Class:DeliveryModel/Attribute:customers_list+' => 'Wszyscy klienci posiadający ten model obsługi', +)); + +// +// Class: lnkDeliveryModelToContact +// + +Dict::Add('PL PL', 'Polish', 'Polski', array( + 'Class:lnkDeliveryModelToContact' => 'Połączenie Model obsługi / Kontakt', + 'Class:lnkDeliveryModelToContact+' => '', + 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id' => 'Model obsługi', + 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_id+' => '', + 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name' => 'Nazwa modelu obsługi', + 'Class:lnkDeliveryModelToContact/Attribute:deliverymodel_name+' => '', + 'Class:lnkDeliveryModelToContact/Attribute:contact_id' => 'Kontakt', + 'Class:lnkDeliveryModelToContact/Attribute:contact_id+' => '', + 'Class:lnkDeliveryModelToContact/Attribute:contact_name' => 'Nazwa kontaktu', + 'Class:lnkDeliveryModelToContact/Attribute:contact_name+' => '', + 'Class:lnkDeliveryModelToContact/Attribute:role_id' => 'Rola', + 'Class:lnkDeliveryModelToContact/Attribute:role_id+' => '', + 'Class:lnkDeliveryModelToContact/Attribute:role_name' => 'Nazwa roli', + 'Class:lnkDeliveryModelToContact/Attribute:role_name+' => '', +)); diff --git a/datamodels/2.x/itop-sla-computation/dictionaries/pl.dict.itop-sla-computation.php b/datamodels/2.x/itop-sla-computation/dictionaries/pl.dict.itop-sla-computation.php index 59947701f..0c350b28d 100644 --- a/datamodels/2.x/itop-sla-computation/dictionaries/pl.dict.itop-sla-computation.php +++ b/datamodels/2.x/itop-sla-computation/dictionaries/pl.dict.itop-sla-computation.php @@ -1,26 +1,26 @@ - - */ - -Dict::Add('PL PL', 'Polish', 'Polski', array( - // Dictionary entries go here -)); + + */ + +Dict::Add('PL PL', 'Polish', 'Polski', array( + // Dictionary entries go here +)); diff --git a/datamodels/2.x/itop-storage-mgmt/dictionaries/pl.dict.itop-storage-mgmt.php b/datamodels/2.x/itop-storage-mgmt/dictionaries/pl.dict.itop-storage-mgmt.php index 59947701f..0c350b28d 100644 --- a/datamodels/2.x/itop-storage-mgmt/dictionaries/pl.dict.itop-storage-mgmt.php +++ b/datamodels/2.x/itop-storage-mgmt/dictionaries/pl.dict.itop-storage-mgmt.php @@ -1,26 +1,26 @@ - - */ - -Dict::Add('PL PL', 'Polish', 'Polski', array( - // Dictionary entries go here -)); + + */ + +Dict::Add('PL PL', 'Polish', 'Polski', array( + // Dictionary entries go here +)); diff --git a/datamodels/2.x/itop-structure/data.sample.persons.xml b/datamodels/2.x/itop-structure/data.sample.persons.xml index 68f5e2e53..86f599f00 100644 --- a/datamodels/2.x/itop-structure/data.sample.persons.xml +++ b/datamodels/2.x/itop-structure/data.sample.persons.xml @@ -648,4 +648,25 @@ + + Bottero + active + 3 + pierre.bottero@it.com + + yes + + Pierre + + + 0 + 0 + + image/png + Timothee.png + + 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 + + + diff --git a/datamodels/2.x/itop-virtualization-mgmt/dictionaries/pl.dict.itop-virtualization-mgmt.php b/datamodels/2.x/itop-virtualization-mgmt/dictionaries/pl.dict.itop-virtualization-mgmt.php index 59947701f..0c350b28d 100644 --- a/datamodels/2.x/itop-virtualization-mgmt/dictionaries/pl.dict.itop-virtualization-mgmt.php +++ b/datamodels/2.x/itop-virtualization-mgmt/dictionaries/pl.dict.itop-virtualization-mgmt.php @@ -1,26 +1,26 @@ - - */ - -Dict::Add('PL PL', 'Polish', 'Polski', array( - // Dictionary entries go here -)); + + */ + +Dict::Add('PL PL', 'Polish', 'Polski', array( + // Dictionary entries go here +)); diff --git a/dictionaries/fr.dictionary.itop.ui.php b/dictionaries/fr.dictionary.itop.ui.php index 55a6a7192..e36507466 100644 --- a/dictionaries/fr.dictionary.itop.ui.php +++ b/dictionaries/fr.dictionary.itop.ui.php @@ -467,7 +467,7 @@ Nous espĆ©rons que vous aimerez cette version autant que nous avons eu du plaisi 'UI:Error:MaintenanceTitle' => 'Maintenance', 'UI:Error:InvalidToken' => 'Erreur: l\'opĆ©ration a dĆ©jĆ  Ć©tĆ© effectuĆ©e (CSRF token not found)', - 'UI:Error:SMTP:UnknownVendor' => 'Le provider SMTP Oauth 2.0 %1$s n\'existe pas', + 'UI:Error:SMTP:UnknownVendor' => 'Le provider SMTP OAuth 2.0 %1$s n\'existe pas', 'UI:GroupBy:Count' => 'Nombre', 'UI:GroupBy:Count+' => 'Nombre d\'Ć©lĆ©ments', diff --git a/js/layouts/tab-container/tab-container.js b/js/layouts/tab-container/tab-container.js index 24c5ae63e..45792e671 100644 --- a/js/layouts/tab-container/tab-container.js +++ b/js/layouts/tab-container/tab-container.js @@ -156,7 +156,7 @@ $(function() }); me._updateExtraTabsList(); }, { - root: $('.ibo-tab-container--tabs-list')[0], + root: this.element.find(this.js_selectors.tabs_list)[0], threshold: [0.9] // N°4783 Should be completely visible, but lowering the threshold prevents a bug in the JS Observer API when the window is zoomed in/out, in which case all items respond as being hidden even when they are not. }); this.element.find(this.js_selectors.tab_header).each(function(){ diff --git a/js/wizardhelper.js b/js/wizardhelper.js index 26933c3c0..e6e4b0c31 100644 --- a/js/wizardhelper.js +++ b/js/wizardhelper.js @@ -242,8 +242,8 @@ function WizardHelper(sClass, sFormPrefix, sState, sInitialState, sStimulus) { this.ResetQuery(); this.UpdateWizard(); - var fieldForm=null; - while (index < aFieldNames.length) + var fieldForm = null; + while (index < aFieldNames.length ) { sAttCode = aFieldNames[index]; sFieldId = this.GetFieldId(sAttCode); @@ -255,7 +255,7 @@ function WizardHelper(sClass, sFormPrefix, sState, sInitialState, sStimulus) { message: '', overlayCSS: {backgroundColor: '#f1f1f1', opacity: 0.3} }); - fieldForm=$('#field_' + sFieldId).closest('form'); + fieldForm = $('#field_' + sFieldId).closest('form'); this.RequestAllowedValues(sAttCode); } index++; diff --git a/lib/composer/autoload_classmap.php b/lib/composer/autoload_classmap.php index 274b4d7a8..8ad6c84b9 100644 --- a/lib/composer/autoload_classmap.php +++ b/lib/composer/autoload_classmap.php @@ -478,6 +478,7 @@ return array( 'FilterPrivateKey' => $baseDir . '/core/filterdef.class.inc.php', 'FindStylesheetObject' => $baseDir . '/application/findstylesheetobject.class.inc.php', 'Firebase\\JWT\\BeforeValidException' => $vendorDir . '/firebase/php-jwt/src/BeforeValidException.php', + 'Firebase\\JWT\\CachedKeySet' => $vendorDir . '/firebase/php-jwt/src/CachedKeySet.php', 'Firebase\\JWT\\ExpiredException' => $vendorDir . '/firebase/php-jwt/src/ExpiredException.php', 'Firebase\\JWT\\JWK' => $vendorDir . '/firebase/php-jwt/src/JWK.php', 'Firebase\\JWT\\JWT' => $vendorDir . '/firebase/php-jwt/src/JWT.php', @@ -488,8 +489,11 @@ return array( 'GraphEdge' => $baseDir . '/core/simplegraph.class.inc.php', 'GraphElement' => $baseDir . '/core/simplegraph.class.inc.php', 'GraphNode' => $baseDir . '/core/simplegraph.class.inc.php', + 'GuzzleHttp\\BodySummarizer' => $vendorDir . '/guzzlehttp/guzzle/src/BodySummarizer.php', + 'GuzzleHttp\\BodySummarizerInterface' => $vendorDir . '/guzzlehttp/guzzle/src/BodySummarizerInterface.php', 'GuzzleHttp\\Client' => $vendorDir . '/guzzlehttp/guzzle/src/Client.php', 'GuzzleHttp\\ClientInterface' => $vendorDir . '/guzzlehttp/guzzle/src/ClientInterface.php', + 'GuzzleHttp\\ClientTrait' => $vendorDir . '/guzzlehttp/guzzle/src/ClientTrait.php', 'GuzzleHttp\\Cookie\\CookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJar.php', 'GuzzleHttp\\Cookie\\CookieJarInterface' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php', 'GuzzleHttp\\Cookie\\FileCookieJar' => $vendorDir . '/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php', @@ -501,7 +505,6 @@ return array( 'GuzzleHttp\\Exception\\GuzzleException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/GuzzleException.php', 'GuzzleHttp\\Exception\\InvalidArgumentException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php', 'GuzzleHttp\\Exception\\RequestException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/RequestException.php', - 'GuzzleHttp\\Exception\\SeekException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/SeekException.php', 'GuzzleHttp\\Exception\\ServerException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/ServerException.php', 'GuzzleHttp\\Exception\\TooManyRedirectsException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php', 'GuzzleHttp\\Exception\\TransferException' => $vendorDir . '/guzzlehttp/guzzle/src/Exception/TransferException.php', @@ -511,10 +514,12 @@ return array( 'GuzzleHttp\\Handler\\CurlHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlHandler.php', 'GuzzleHttp\\Handler\\CurlMultiHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php', 'GuzzleHttp\\Handler\\EasyHandle' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/EasyHandle.php', + 'GuzzleHttp\\Handler\\HeaderProcessor' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php', 'GuzzleHttp\\Handler\\MockHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/MockHandler.php', 'GuzzleHttp\\Handler\\Proxy' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/Proxy.php', 'GuzzleHttp\\Handler\\StreamHandler' => $vendorDir . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php', 'GuzzleHttp\\MessageFormatter' => $vendorDir . '/guzzlehttp/guzzle/src/MessageFormatter.php', + 'GuzzleHttp\\MessageFormatterInterface' => $vendorDir . '/guzzlehttp/guzzle/src/MessageFormatterInterface.php', 'GuzzleHttp\\Middleware' => $vendorDir . '/guzzlehttp/guzzle/src/Middleware.php', 'GuzzleHttp\\Pool' => $vendorDir . '/guzzlehttp/guzzle/src/Pool.php', 'GuzzleHttp\\PrepareBodyMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php', @@ -567,7 +572,6 @@ return array( 'GuzzleHttp\\RequestOptions' => $vendorDir . '/guzzlehttp/guzzle/src/RequestOptions.php', 'GuzzleHttp\\RetryMiddleware' => $vendorDir . '/guzzlehttp/guzzle/src/RetryMiddleware.php', 'GuzzleHttp\\TransferStats' => $vendorDir . '/guzzlehttp/guzzle/src/TransferStats.php', - 'GuzzleHttp\\UriTemplate' => $vendorDir . '/guzzlehttp/guzzle/src/UriTemplate.php', 'GuzzleHttp\\Utils' => $vendorDir . '/guzzlehttp/guzzle/src/Utils.php', 'HTMLBulkExport' => $baseDir . '/core/htmlbulkexport.class.inc.php', 'HTMLDOMSanitizer' => $baseDir . '/core/htmlsanitizer.class.inc.php', @@ -1014,14 +1018,16 @@ return array( 'PEAR_ErrorStack' => $vendorDir . '/pear/pear-core-minimal/src/PEAR/ErrorStack.php', 'PEAR_Exception' => $vendorDir . '/pear/pear_exception/PEAR/Exception.php', 'Page' => $baseDir . '/sources/Application/WebPage/Page.php', - 'Pelago\\Emogrifier' => $vendorDir . '/pelago/emogrifier/src/Emogrifier.php', - 'Pelago\\Emogrifier\\CssInliner' => $vendorDir . '/pelago/emogrifier/src/Emogrifier/CssInliner.php', - 'Pelago\\Emogrifier\\HtmlProcessor\\AbstractHtmlProcessor' => $vendorDir . '/pelago/emogrifier/src/Emogrifier/HtmlProcessor/AbstractHtmlProcessor.php', - 'Pelago\\Emogrifier\\HtmlProcessor\\CssToAttributeConverter' => $vendorDir . '/pelago/emogrifier/src/Emogrifier/HtmlProcessor/CssToAttributeConverter.php', - 'Pelago\\Emogrifier\\HtmlProcessor\\HtmlNormalizer' => $vendorDir . '/pelago/emogrifier/src/Emogrifier/HtmlProcessor/HtmlNormalizer.php', - 'Pelago\\Emogrifier\\HtmlProcessor\\HtmlPruner' => $vendorDir . '/pelago/emogrifier/src/Emogrifier/HtmlProcessor/HtmlPruner.php', - 'Pelago\\Emogrifier\\Utilities\\ArrayIntersector' => $vendorDir . '/pelago/emogrifier/src/Emogrifier/Utilities/ArrayIntersector.php', - 'Pelago\\Emogrifier\\Utilities\\CssConcatenator' => $vendorDir . '/pelago/emogrifier/src/Emogrifier/Utilities/CssConcatenator.php', + 'Pelago\\Emogrifier\\Caching\\SimpleStringCache' => $vendorDir . '/pelago/emogrifier/src/Caching/SimpleStringCache.php', + 'Pelago\\Emogrifier\\CssInliner' => $vendorDir . '/pelago/emogrifier/src/CssInliner.php', + 'Pelago\\Emogrifier\\Css\\CssDocument' => $vendorDir . '/pelago/emogrifier/src/Css/CssDocument.php', + 'Pelago\\Emogrifier\\Css\\StyleRule' => $vendorDir . '/pelago/emogrifier/src/Css/StyleRule.php', + 'Pelago\\Emogrifier\\HtmlProcessor\\AbstractHtmlProcessor' => $vendorDir . '/pelago/emogrifier/src/HtmlProcessor/AbstractHtmlProcessor.php', + 'Pelago\\Emogrifier\\HtmlProcessor\\CssToAttributeConverter' => $vendorDir . '/pelago/emogrifier/src/HtmlProcessor/CssToAttributeConverter.php', + 'Pelago\\Emogrifier\\HtmlProcessor\\HtmlNormalizer' => $vendorDir . '/pelago/emogrifier/src/HtmlProcessor/HtmlNormalizer.php', + 'Pelago\\Emogrifier\\HtmlProcessor\\HtmlPruner' => $vendorDir . '/pelago/emogrifier/src/HtmlProcessor/HtmlPruner.php', + 'Pelago\\Emogrifier\\Utilities\\ArrayIntersector' => $vendorDir . '/pelago/emogrifier/src/Utilities/ArrayIntersector.php', + 'Pelago\\Emogrifier\\Utilities\\CssConcatenator' => $vendorDir . '/pelago/emogrifier/src/Utilities/CssConcatenator.php', 'PhpParser\\Builder' => $vendorDir . '/nikic/php-parser/lib/PhpParser/Builder.php', 'PhpParser\\BuilderFactory' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php', 'PhpParser\\BuilderHelpers' => $vendorDir . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php', @@ -1290,6 +1296,10 @@ return array( 'Psr\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/psr/event-dispatcher/src/EventDispatcherInterface.php', 'Psr\\EventDispatcher\\ListenerProviderInterface' => $vendorDir . '/psr/event-dispatcher/src/ListenerProviderInterface.php', 'Psr\\EventDispatcher\\StoppableEventInterface' => $vendorDir . '/psr/event-dispatcher/src/StoppableEventInterface.php', + 'Psr\\Http\\Client\\ClientExceptionInterface' => $vendorDir . '/psr/http-client/src/ClientExceptionInterface.php', + 'Psr\\Http\\Client\\ClientInterface' => $vendorDir . '/psr/http-client/src/ClientInterface.php', + 'Psr\\Http\\Client\\NetworkExceptionInterface' => $vendorDir . '/psr/http-client/src/NetworkExceptionInterface.php', + 'Psr\\Http\\Client\\RequestExceptionInterface' => $vendorDir . '/psr/http-client/src/RequestExceptionInterface.php', 'Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php', 'Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php', 'Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php', @@ -1336,6 +1346,45 @@ return array( 'SQLQuery' => $baseDir . '/core/sqlquery.class.inc.php', 'SQLUnionQuery' => $baseDir . '/core/sqlunionquery.class.inc.php', 'SVGDOMSanitizer' => $baseDir . '/core/htmlsanitizer.class.inc.php', + 'Sabberworm\\CSS\\CSSList\\AtRuleBlockList' => $vendorDir . '/sabberworm/php-css-parser/src/CSSList/AtRuleBlockList.php', + 'Sabberworm\\CSS\\CSSList\\CSSBlockList' => $vendorDir . '/sabberworm/php-css-parser/src/CSSList/CSSBlockList.php', + 'Sabberworm\\CSS\\CSSList\\CSSList' => $vendorDir . '/sabberworm/php-css-parser/src/CSSList/CSSList.php', + 'Sabberworm\\CSS\\CSSList\\Document' => $vendorDir . '/sabberworm/php-css-parser/src/CSSList/Document.php', + 'Sabberworm\\CSS\\CSSList\\KeyFrame' => $vendorDir . '/sabberworm/php-css-parser/src/CSSList/KeyFrame.php', + 'Sabberworm\\CSS\\Comment\\Comment' => $vendorDir . '/sabberworm/php-css-parser/src/Comment/Comment.php', + 'Sabberworm\\CSS\\Comment\\Commentable' => $vendorDir . '/sabberworm/php-css-parser/src/Comment/Commentable.php', + 'Sabberworm\\CSS\\OutputFormat' => $vendorDir . '/sabberworm/php-css-parser/src/OutputFormat.php', + 'Sabberworm\\CSS\\OutputFormatter' => $vendorDir . '/sabberworm/php-css-parser/src/OutputFormatter.php', + 'Sabberworm\\CSS\\Parser' => $vendorDir . '/sabberworm/php-css-parser/src/Parser.php', + 'Sabberworm\\CSS\\Parsing\\OutputException' => $vendorDir . '/sabberworm/php-css-parser/src/Parsing/OutputException.php', + 'Sabberworm\\CSS\\Parsing\\ParserState' => $vendorDir . '/sabberworm/php-css-parser/src/Parsing/ParserState.php', + 'Sabberworm\\CSS\\Parsing\\SourceException' => $vendorDir . '/sabberworm/php-css-parser/src/Parsing/SourceException.php', + 'Sabberworm\\CSS\\Parsing\\UnexpectedEOFException' => $vendorDir . '/sabberworm/php-css-parser/src/Parsing/UnexpectedEOFException.php', + 'Sabberworm\\CSS\\Parsing\\UnexpectedTokenException' => $vendorDir . '/sabberworm/php-css-parser/src/Parsing/UnexpectedTokenException.php', + 'Sabberworm\\CSS\\Property\\AtRule' => $vendorDir . '/sabberworm/php-css-parser/src/Property/AtRule.php', + 'Sabberworm\\CSS\\Property\\CSSNamespace' => $vendorDir . '/sabberworm/php-css-parser/src/Property/CSSNamespace.php', + 'Sabberworm\\CSS\\Property\\Charset' => $vendorDir . '/sabberworm/php-css-parser/src/Property/Charset.php', + 'Sabberworm\\CSS\\Property\\Import' => $vendorDir . '/sabberworm/php-css-parser/src/Property/Import.php', + 'Sabberworm\\CSS\\Property\\KeyframeSelector' => $vendorDir . '/sabberworm/php-css-parser/src/Property/KeyframeSelector.php', + 'Sabberworm\\CSS\\Property\\Selector' => $vendorDir . '/sabberworm/php-css-parser/src/Property/Selector.php', + 'Sabberworm\\CSS\\Renderable' => $vendorDir . '/sabberworm/php-css-parser/src/Renderable.php', + 'Sabberworm\\CSS\\RuleSet\\AtRuleSet' => $vendorDir . '/sabberworm/php-css-parser/src/RuleSet/AtRuleSet.php', + 'Sabberworm\\CSS\\RuleSet\\DeclarationBlock' => $vendorDir . '/sabberworm/php-css-parser/src/RuleSet/DeclarationBlock.php', + 'Sabberworm\\CSS\\RuleSet\\RuleSet' => $vendorDir . '/sabberworm/php-css-parser/src/RuleSet/RuleSet.php', + 'Sabberworm\\CSS\\Rule\\Rule' => $vendorDir . '/sabberworm/php-css-parser/src/Rule/Rule.php', + 'Sabberworm\\CSS\\Settings' => $vendorDir . '/sabberworm/php-css-parser/src/Settings.php', + 'Sabberworm\\CSS\\Value\\CSSFunction' => $vendorDir . '/sabberworm/php-css-parser/src/Value/CSSFunction.php', + 'Sabberworm\\CSS\\Value\\CSSString' => $vendorDir . '/sabberworm/php-css-parser/src/Value/CSSString.php', + 'Sabberworm\\CSS\\Value\\CalcFunction' => $vendorDir . '/sabberworm/php-css-parser/src/Value/CalcFunction.php', + 'Sabberworm\\CSS\\Value\\CalcRuleValueList' => $vendorDir . '/sabberworm/php-css-parser/src/Value/CalcRuleValueList.php', + 'Sabberworm\\CSS\\Value\\Color' => $vendorDir . '/sabberworm/php-css-parser/src/Value/Color.php', + 'Sabberworm\\CSS\\Value\\LineName' => $vendorDir . '/sabberworm/php-css-parser/src/Value/LineName.php', + 'Sabberworm\\CSS\\Value\\PrimitiveValue' => $vendorDir . '/sabberworm/php-css-parser/src/Value/PrimitiveValue.php', + 'Sabberworm\\CSS\\Value\\RuleValueList' => $vendorDir . '/sabberworm/php-css-parser/src/Value/RuleValueList.php', + 'Sabberworm\\CSS\\Value\\Size' => $vendorDir . '/sabberworm/php-css-parser/src/Value/Size.php', + 'Sabberworm\\CSS\\Value\\URL' => $vendorDir . '/sabberworm/php-css-parser/src/Value/URL.php', + 'Sabberworm\\CSS\\Value\\Value' => $vendorDir . '/sabberworm/php-css-parser/src/Value/Value.php', + 'Sabberworm\\CSS\\Value\\ValueList' => $vendorDir . '/sabberworm/php-css-parser/src/Value/ValueList.php', 'ScalarExpression' => $baseDir . '/core/oql/expression.class.inc.php', 'ScalarOqlExpression' => $baseDir . '/core/oql/oqlquery.class.inc.php', 'ScssPhp\\ScssPhp\\Base\\Range' => $vendorDir . '/scssphp/scssphp/src/Base/Range.php', @@ -2504,13 +2553,8 @@ return array( 'Symfony\\Contracts\\Translation\\TranslatorTrait' => $vendorDir . '/symfony/translation-contracts/TranslatorTrait.php', 'Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php', 'Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => $vendorDir . '/symfony/polyfill-intl-grapheme/Grapheme.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Idn' => $vendorDir . '/symfony/polyfill-intl-idn/Idn.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Info' => $vendorDir . '/symfony/polyfill-intl-idn/Info.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\DisallowedRanges' => $vendorDir . '/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\Regex' => $vendorDir . '/symfony/polyfill-intl-idn/Resources/unidata/Regex.php', 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Normalizer.php', 'Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php', - 'Symfony\\Polyfill\\Php72\\Php72' => $vendorDir . '/symfony/polyfill-php72/Php72.php', 'Symfony\\Polyfill\\Php73\\Php73' => $vendorDir . '/symfony/polyfill-php73/Php73.php', 'Symfony\\Polyfill\\Php80\\Php80' => $vendorDir . '/symfony/polyfill-php80/Php80.php', 'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php', diff --git a/lib/composer/autoload_files.php b/lib/composer/autoload_files.php index 9423c7385..6645a1715 100644 --- a/lib/composer/autoload_files.php +++ b/lib/composer/autoload_files.php @@ -14,13 +14,11 @@ return array( '23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php', - 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', - '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php', - 'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php', + 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', 'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php', ); diff --git a/lib/composer/autoload_psr4.php b/lib/composer/autoload_psr4.php index 0a7d4ce20..97e19cfd2 100644 --- a/lib/composer/autoload_psr4.php +++ b/lib/composer/autoload_psr4.php @@ -12,10 +12,8 @@ return array( 'Symfony\\Polyfill\\Php81\\' => array($vendorDir . '/symfony/polyfill-php81'), 'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'), 'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'), - 'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'), 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'), - 'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'), 'Symfony\\Polyfill\\Intl\\Grapheme\\' => array($vendorDir . '/symfony/polyfill-intl-grapheme'), 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), 'Symfony\\Contracts\\Translation\\' => array($vendorDir . '/symfony/translation-contracts'), @@ -45,13 +43,15 @@ return array( 'Symfony\\Bundle\\FrameworkBundle\\' => array($vendorDir . '/symfony/framework-bundle'), 'Symfony\\Bridge\\Twig\\' => array($vendorDir . '/symfony/twig-bridge'), 'ScssPhp\\ScssPhp\\' => array($vendorDir . '/scssphp/scssphp/src'), + 'Sabberworm\\CSS\\' => array($vendorDir . '/sabberworm/php-css-parser/src'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'), 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), + 'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'), 'Psr\\EventDispatcher\\' => array($vendorDir . '/psr/event-dispatcher/src'), 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), 'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'), 'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'), - 'Pelago\\' => array($vendorDir . '/pelago/emogrifier/src'), + 'Pelago\\Emogrifier\\' => array($vendorDir . '/pelago/emogrifier/src'), 'League\\OAuth2\\Client\\' => array($vendorDir . '/league/oauth2-client/src', $vendorDir . '/league/oauth2-google/src'), 'Laminas\\ZendFrameworkBridge\\' => array($vendorDir . '/laminas/laminas-zendframework-bridge/src'), 'Laminas\\Validator\\' => array($vendorDir . '/laminas/laminas-validator/src'), diff --git a/lib/composer/autoload_static.php b/lib/composer/autoload_static.php index c212dd424..77ae48929 100644 --- a/lib/composer/autoload_static.php +++ b/lib/composer/autoload_static.php @@ -15,14 +15,12 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f '23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php', - 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', - '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', 'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php', - 'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php', + 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', 'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php', ); @@ -38,10 +36,8 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'Symfony\\Polyfill\\Php81\\' => 23, 'Symfony\\Polyfill\\Php80\\' => 23, 'Symfony\\Polyfill\\Php73\\' => 23, - 'Symfony\\Polyfill\\Php72\\' => 23, 'Symfony\\Polyfill\\Mbstring\\' => 26, 'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33, - 'Symfony\\Polyfill\\Intl\\Idn\\' => 26, 'Symfony\\Polyfill\\Intl\\Grapheme\\' => 31, 'Symfony\\Polyfill\\Ctype\\' => 23, 'Symfony\\Contracts\\Translation\\' => 30, @@ -71,16 +67,18 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'Symfony\\Bundle\\FrameworkBundle\\' => 31, 'Symfony\\Bridge\\Twig\\' => 20, 'ScssPhp\\ScssPhp\\' => 16, + 'Sabberworm\\CSS\\' => 15, ), 'P' => array ( 'Psr\\Log\\' => 8, 'Psr\\Http\\Message\\' => 17, + 'Psr\\Http\\Client\\' => 16, 'Psr\\EventDispatcher\\' => 20, 'Psr\\Container\\' => 14, 'Psr\\Cache\\' => 10, 'PhpParser\\' => 10, - 'Pelago\\' => 7, + 'Pelago\\Emogrifier\\' => 18, ), 'L' => array ( @@ -134,10 +132,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php73', ), - 'Symfony\\Polyfill\\Php72\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-php72', - ), 'Symfony\\Polyfill\\Mbstring\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', @@ -146,10 +140,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer', ), - 'Symfony\\Polyfill\\Intl\\Idn\\' => - array ( - 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-idn', - ), 'Symfony\\Polyfill\\Intl\\Grapheme\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme', @@ -266,6 +256,10 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f array ( 0 => __DIR__ . '/..' . '/scssphp/scssphp/src', ), + 'Sabberworm\\CSS\\' => + array ( + 0 => __DIR__ . '/..' . '/sabberworm/php-css-parser/src', + ), 'Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log/Psr/Log', @@ -274,6 +268,10 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f array ( 0 => __DIR__ . '/..' . '/psr/http-message/src', ), + 'Psr\\Http\\Client\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/http-client/src', + ), 'Psr\\EventDispatcher\\' => array ( 0 => __DIR__ . '/..' . '/psr/event-dispatcher/src', @@ -290,7 +288,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f array ( 0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser', ), - 'Pelago\\' => + 'Pelago\\Emogrifier\\' => array ( 0 => __DIR__ . '/..' . '/pelago/emogrifier/src', ), @@ -843,6 +841,7 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'FilterPrivateKey' => __DIR__ . '/../..' . '/core/filterdef.class.inc.php', 'FindStylesheetObject' => __DIR__ . '/../..' . '/application/findstylesheetobject.class.inc.php', 'Firebase\\JWT\\BeforeValidException' => __DIR__ . '/..' . '/firebase/php-jwt/src/BeforeValidException.php', + 'Firebase\\JWT\\CachedKeySet' => __DIR__ . '/..' . '/firebase/php-jwt/src/CachedKeySet.php', 'Firebase\\JWT\\ExpiredException' => __DIR__ . '/..' . '/firebase/php-jwt/src/ExpiredException.php', 'Firebase\\JWT\\JWK' => __DIR__ . '/..' . '/firebase/php-jwt/src/JWK.php', 'Firebase\\JWT\\JWT' => __DIR__ . '/..' . '/firebase/php-jwt/src/JWT.php', @@ -853,8 +852,11 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'GraphEdge' => __DIR__ . '/../..' . '/core/simplegraph.class.inc.php', 'GraphElement' => __DIR__ . '/../..' . '/core/simplegraph.class.inc.php', 'GraphNode' => __DIR__ . '/../..' . '/core/simplegraph.class.inc.php', + 'GuzzleHttp\\BodySummarizer' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/BodySummarizer.php', + 'GuzzleHttp\\BodySummarizerInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/BodySummarizerInterface.php', 'GuzzleHttp\\Client' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Client.php', 'GuzzleHttp\\ClientInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/ClientInterface.php', + 'GuzzleHttp\\ClientTrait' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/ClientTrait.php', 'GuzzleHttp\\Cookie\\CookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/CookieJar.php', 'GuzzleHttp\\Cookie\\CookieJarInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php', 'GuzzleHttp\\Cookie\\FileCookieJar' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php', @@ -866,7 +868,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'GuzzleHttp\\Exception\\GuzzleException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/GuzzleException.php', 'GuzzleHttp\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php', 'GuzzleHttp\\Exception\\RequestException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/RequestException.php', - 'GuzzleHttp\\Exception\\SeekException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/SeekException.php', 'GuzzleHttp\\Exception\\ServerException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/ServerException.php', 'GuzzleHttp\\Exception\\TooManyRedirectsException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php', 'GuzzleHttp\\Exception\\TransferException' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Exception/TransferException.php', @@ -876,10 +877,12 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'GuzzleHttp\\Handler\\CurlHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlHandler.php', 'GuzzleHttp\\Handler\\CurlMultiHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php', 'GuzzleHttp\\Handler\\EasyHandle' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/EasyHandle.php', + 'GuzzleHttp\\Handler\\HeaderProcessor' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php', 'GuzzleHttp\\Handler\\MockHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/MockHandler.php', 'GuzzleHttp\\Handler\\Proxy' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/Proxy.php', 'GuzzleHttp\\Handler\\StreamHandler' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Handler/StreamHandler.php', 'GuzzleHttp\\MessageFormatter' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/MessageFormatter.php', + 'GuzzleHttp\\MessageFormatterInterface' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/MessageFormatterInterface.php', 'GuzzleHttp\\Middleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Middleware.php', 'GuzzleHttp\\Pool' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Pool.php', 'GuzzleHttp\\PrepareBodyMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php', @@ -932,7 +935,6 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'GuzzleHttp\\RequestOptions' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RequestOptions.php', 'GuzzleHttp\\RetryMiddleware' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/RetryMiddleware.php', 'GuzzleHttp\\TransferStats' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/TransferStats.php', - 'GuzzleHttp\\UriTemplate' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/UriTemplate.php', 'GuzzleHttp\\Utils' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Utils.php', 'HTMLBulkExport' => __DIR__ . '/../..' . '/core/htmlbulkexport.class.inc.php', 'HTMLDOMSanitizer' => __DIR__ . '/../..' . '/core/htmlsanitizer.class.inc.php', @@ -1379,14 +1381,16 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'PEAR_ErrorStack' => __DIR__ . '/..' . '/pear/pear-core-minimal/src/PEAR/ErrorStack.php', 'PEAR_Exception' => __DIR__ . '/..' . '/pear/pear_exception/PEAR/Exception.php', 'Page' => __DIR__ . '/../..' . '/sources/Application/WebPage/Page.php', - 'Pelago\\Emogrifier' => __DIR__ . '/..' . '/pelago/emogrifier/src/Emogrifier.php', - 'Pelago\\Emogrifier\\CssInliner' => __DIR__ . '/..' . '/pelago/emogrifier/src/Emogrifier/CssInliner.php', - 'Pelago\\Emogrifier\\HtmlProcessor\\AbstractHtmlProcessor' => __DIR__ . '/..' . '/pelago/emogrifier/src/Emogrifier/HtmlProcessor/AbstractHtmlProcessor.php', - 'Pelago\\Emogrifier\\HtmlProcessor\\CssToAttributeConverter' => __DIR__ . '/..' . '/pelago/emogrifier/src/Emogrifier/HtmlProcessor/CssToAttributeConverter.php', - 'Pelago\\Emogrifier\\HtmlProcessor\\HtmlNormalizer' => __DIR__ . '/..' . '/pelago/emogrifier/src/Emogrifier/HtmlProcessor/HtmlNormalizer.php', - 'Pelago\\Emogrifier\\HtmlProcessor\\HtmlPruner' => __DIR__ . '/..' . '/pelago/emogrifier/src/Emogrifier/HtmlProcessor/HtmlPruner.php', - 'Pelago\\Emogrifier\\Utilities\\ArrayIntersector' => __DIR__ . '/..' . '/pelago/emogrifier/src/Emogrifier/Utilities/ArrayIntersector.php', - 'Pelago\\Emogrifier\\Utilities\\CssConcatenator' => __DIR__ . '/..' . '/pelago/emogrifier/src/Emogrifier/Utilities/CssConcatenator.php', + 'Pelago\\Emogrifier\\Caching\\SimpleStringCache' => __DIR__ . '/..' . '/pelago/emogrifier/src/Caching/SimpleStringCache.php', + 'Pelago\\Emogrifier\\CssInliner' => __DIR__ . '/..' . '/pelago/emogrifier/src/CssInliner.php', + 'Pelago\\Emogrifier\\Css\\CssDocument' => __DIR__ . '/..' . '/pelago/emogrifier/src/Css/CssDocument.php', + 'Pelago\\Emogrifier\\Css\\StyleRule' => __DIR__ . '/..' . '/pelago/emogrifier/src/Css/StyleRule.php', + 'Pelago\\Emogrifier\\HtmlProcessor\\AbstractHtmlProcessor' => __DIR__ . '/..' . '/pelago/emogrifier/src/HtmlProcessor/AbstractHtmlProcessor.php', + 'Pelago\\Emogrifier\\HtmlProcessor\\CssToAttributeConverter' => __DIR__ . '/..' . '/pelago/emogrifier/src/HtmlProcessor/CssToAttributeConverter.php', + 'Pelago\\Emogrifier\\HtmlProcessor\\HtmlNormalizer' => __DIR__ . '/..' . '/pelago/emogrifier/src/HtmlProcessor/HtmlNormalizer.php', + 'Pelago\\Emogrifier\\HtmlProcessor\\HtmlPruner' => __DIR__ . '/..' . '/pelago/emogrifier/src/HtmlProcessor/HtmlPruner.php', + 'Pelago\\Emogrifier\\Utilities\\ArrayIntersector' => __DIR__ . '/..' . '/pelago/emogrifier/src/Utilities/ArrayIntersector.php', + 'Pelago\\Emogrifier\\Utilities\\CssConcatenator' => __DIR__ . '/..' . '/pelago/emogrifier/src/Utilities/CssConcatenator.php', 'PhpParser\\Builder' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/Builder.php', 'PhpParser\\BuilderFactory' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderFactory.php', 'PhpParser\\BuilderHelpers' => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser/BuilderHelpers.php', @@ -1655,6 +1659,10 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'Psr\\EventDispatcher\\EventDispatcherInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/EventDispatcherInterface.php', 'Psr\\EventDispatcher\\ListenerProviderInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/ListenerProviderInterface.php', 'Psr\\EventDispatcher\\StoppableEventInterface' => __DIR__ . '/..' . '/psr/event-dispatcher/src/StoppableEventInterface.php', + 'Psr\\Http\\Client\\ClientExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/ClientExceptionInterface.php', + 'Psr\\Http\\Client\\ClientInterface' => __DIR__ . '/..' . '/psr/http-client/src/ClientInterface.php', + 'Psr\\Http\\Client\\NetworkExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/NetworkExceptionInterface.php', + 'Psr\\Http\\Client\\RequestExceptionInterface' => __DIR__ . '/..' . '/psr/http-client/src/RequestExceptionInterface.php', 'Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php', 'Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php', 'Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php', @@ -1701,6 +1709,45 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'SQLQuery' => __DIR__ . '/../..' . '/core/sqlquery.class.inc.php', 'SQLUnionQuery' => __DIR__ . '/../..' . '/core/sqlunionquery.class.inc.php', 'SVGDOMSanitizer' => __DIR__ . '/../..' . '/core/htmlsanitizer.class.inc.php', + 'Sabberworm\\CSS\\CSSList\\AtRuleBlockList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/CSSList/AtRuleBlockList.php', + 'Sabberworm\\CSS\\CSSList\\CSSBlockList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/CSSList/CSSBlockList.php', + 'Sabberworm\\CSS\\CSSList\\CSSList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/CSSList/CSSList.php', + 'Sabberworm\\CSS\\CSSList\\Document' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/CSSList/Document.php', + 'Sabberworm\\CSS\\CSSList\\KeyFrame' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/CSSList/KeyFrame.php', + 'Sabberworm\\CSS\\Comment\\Comment' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Comment/Comment.php', + 'Sabberworm\\CSS\\Comment\\Commentable' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Comment/Commentable.php', + 'Sabberworm\\CSS\\OutputFormat' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/OutputFormat.php', + 'Sabberworm\\CSS\\OutputFormatter' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/OutputFormatter.php', + 'Sabberworm\\CSS\\Parser' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Parser.php', + 'Sabberworm\\CSS\\Parsing\\OutputException' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Parsing/OutputException.php', + 'Sabberworm\\CSS\\Parsing\\ParserState' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Parsing/ParserState.php', + 'Sabberworm\\CSS\\Parsing\\SourceException' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Parsing/SourceException.php', + 'Sabberworm\\CSS\\Parsing\\UnexpectedEOFException' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Parsing/UnexpectedEOFException.php', + 'Sabberworm\\CSS\\Parsing\\UnexpectedTokenException' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Parsing/UnexpectedTokenException.php', + 'Sabberworm\\CSS\\Property\\AtRule' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Property/AtRule.php', + 'Sabberworm\\CSS\\Property\\CSSNamespace' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Property/CSSNamespace.php', + 'Sabberworm\\CSS\\Property\\Charset' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Property/Charset.php', + 'Sabberworm\\CSS\\Property\\Import' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Property/Import.php', + 'Sabberworm\\CSS\\Property\\KeyframeSelector' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Property/KeyframeSelector.php', + 'Sabberworm\\CSS\\Property\\Selector' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Property/Selector.php', + 'Sabberworm\\CSS\\Renderable' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Renderable.php', + 'Sabberworm\\CSS\\RuleSet\\AtRuleSet' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/RuleSet/AtRuleSet.php', + 'Sabberworm\\CSS\\RuleSet\\DeclarationBlock' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/RuleSet/DeclarationBlock.php', + 'Sabberworm\\CSS\\RuleSet\\RuleSet' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/RuleSet/RuleSet.php', + 'Sabberworm\\CSS\\Rule\\Rule' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Rule/Rule.php', + 'Sabberworm\\CSS\\Settings' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Settings.php', + 'Sabberworm\\CSS\\Value\\CSSFunction' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Value/CSSFunction.php', + 'Sabberworm\\CSS\\Value\\CSSString' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Value/CSSString.php', + 'Sabberworm\\CSS\\Value\\CalcFunction' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Value/CalcFunction.php', + 'Sabberworm\\CSS\\Value\\CalcRuleValueList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Value/CalcRuleValueList.php', + 'Sabberworm\\CSS\\Value\\Color' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Value/Color.php', + 'Sabberworm\\CSS\\Value\\LineName' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Value/LineName.php', + 'Sabberworm\\CSS\\Value\\PrimitiveValue' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Value/PrimitiveValue.php', + 'Sabberworm\\CSS\\Value\\RuleValueList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Value/RuleValueList.php', + 'Sabberworm\\CSS\\Value\\Size' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Value/Size.php', + 'Sabberworm\\CSS\\Value\\URL' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Value/URL.php', + 'Sabberworm\\CSS\\Value\\Value' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Value/Value.php', + 'Sabberworm\\CSS\\Value\\ValueList' => __DIR__ . '/..' . '/sabberworm/php-css-parser/src/Value/ValueList.php', 'ScalarExpression' => __DIR__ . '/../..' . '/core/oql/expression.class.inc.php', 'ScalarOqlExpression' => __DIR__ . '/../..' . '/core/oql/oqlquery.class.inc.php', 'ScssPhp\\ScssPhp\\Base\\Range' => __DIR__ . '/..' . '/scssphp/scssphp/src/Base/Range.php', @@ -2869,13 +2916,8 @@ class ComposerStaticInit7f81b4a2a468a061c306af5e447a9a9f 'Symfony\\Contracts\\Translation\\TranslatorTrait' => __DIR__ . '/..' . '/symfony/translation-contracts/TranslatorTrait.php', 'Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php', 'Symfony\\Polyfill\\Intl\\Grapheme\\Grapheme' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/Grapheme.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Idn' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Idn.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Info' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Info.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\DisallowedRanges' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php', - 'Symfony\\Polyfill\\Intl\\Idn\\Resources\\unidata\\Regex' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/Resources/unidata/Regex.php', 'Symfony\\Polyfill\\Intl\\Normalizer\\Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Normalizer.php', 'Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php', - 'Symfony\\Polyfill\\Php72\\Php72' => __DIR__ . '/..' . '/symfony/polyfill-php72/Php72.php', 'Symfony\\Polyfill\\Php73\\Php73' => __DIR__ . '/..' . '/symfony/polyfill-php73/Php73.php', 'Symfony\\Polyfill\\Php80\\Php80' => __DIR__ . '/..' . '/symfony/polyfill-php80/Php80.php', 'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php', diff --git a/lib/composer/installed.json b/lib/composer/installed.json index a471b2da7..79726b2eb 100644 --- a/lib/composer/installed.json +++ b/lib/composer/installed.json @@ -182,39 +182,47 @@ }, { "name": "guzzlehttp/guzzle", - "version": "6.5.8", - "version_normalized": "6.5.8.0", + "version": "7.4.5", + "version_normalized": "7.4.5.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981" + "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/a52f0440530b54fa079ce76e8c5d196a42cad981", - "reference": "a52f0440530b54fa079ce76e8c5d196a42cad981", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", + "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.9", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.17" + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.1" + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.5 || ^9.3.5", + "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, - "time": "2022-06-20T22:16:07+00:00", + "time": "2022-06-20T22:16:13+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "6.5-dev" + "dev-master": "7.4-dev" } }, "installation-source": "dist", @@ -268,19 +276,20 @@ } ], "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", "keywords": [ "client", "curl", "framework", "http", "http client", + "psr-18", + "psr-7", "rest", "web service" ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/6.5.8" + "source": "https://github.com/guzzle/guzzle/tree/7.4.5" }, "funding": [ { @@ -1502,42 +1511,42 @@ }, { "name": "pelago/emogrifier", - "version": "v3.1.0", - "version_normalized": "3.1.0.0", + "version": "v6.0.0", + "version_normalized": "6.0.0.0", "source": { "type": "git", "url": "https://github.com/MyIntervals/emogrifier.git", - "reference": "f6a5c7d44612d86c3901c93f1592f5440e6b2cd8" + "reference": "aa72d5407efac118f3896bcb995a2cba793df0ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MyIntervals/emogrifier/zipball/f6a5c7d44612d86c3901c93f1592f5440e6b2cd8", - "reference": "f6a5c7d44612d86c3901c93f1592f5440e6b2cd8", + "url": "https://api.github.com/repos/MyIntervals/emogrifier/zipball/aa72d5407efac118f3896bcb995a2cba793df0ae", + "reference": "aa72d5407efac118f3896bcb995a2cba793df0ae", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", - "php": "^5.6 || ~7.0 || ~7.1 || ~7.2 || ~7.3 || ~7.4", - "symfony/css-selector": "^2.8 || ^3.0 || ^4.0 || ^5.0" + "php": "~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0", + "sabberworm/php-css-parser": "^8.3.1", + "symfony/css-selector": "^3.4.32 || ^4.4 || ^5.3 || ^6.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.15.3", - "phpmd/phpmd": "^2.7.0", - "phpunit/phpunit": "^5.7.27", - "squizlabs/php_codesniffer": "^3.5.0" + "php-parallel-lint/php-parallel-lint": "^1.3.0", + "phpunit/phpunit": "^8.5.16", + "rawr/cross-data-providers": "^2.3.0" }, - "time": "2019-12-26T19:37:31+00:00", + "time": "2021-09-16T16:22:04+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0.x-dev" + "dev-main": "7.0.x-dev" } }, "installation-source": "dist", "autoload": { "psr-4": { - "Pelago\\": "src/" + "Pelago\\Emogrifier\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -1734,6 +1743,61 @@ }, "install-path": "../psr/event-dispatcher" }, + { + "name": "psr/http-client", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "time": "2020-06-29T06:28:15+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "install-path": "../psr/http-client" + }, { "name": "psr/http-message", "version": "1.0.1", @@ -1890,6 +1954,62 @@ }, "install-path": "../ralouphie/getallheaders" }, + { + "name": "sabberworm/php-css-parser", + "version": "8.4.0", + "version_normalized": "8.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sabberworm/PHP-CSS-Parser.git", + "reference": "e41d2140031d533348b2192a83f02d8dd8a71d30" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/e41d2140031d533348b2192a83f02d8dd8a71d30", + "reference": "e41d2140031d533348b2192a83f02d8dd8a71d30", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=5.6.20" + }, + "require-dev": { + "codacy/coverage": "^1.4", + "phpunit/phpunit": "^4.8.36" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" + }, + "time": "2021-12-11T13:40:54+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Sabberworm\\CSS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "support": { + "issues": "https://github.com/sabberworm/PHP-CSS-Parser/issues", + "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.4.0" + }, + "install-path": "../sabberworm/php-css-parser" + }, { "name": "scssphp/scssphp", "version": "v1.10.3", @@ -1969,17 +2089,17 @@ }, { "name": "symfony/cache", - "version": "v5.4.9", - "version_normalized": "5.4.9.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "a50b7249bea81ddd6d3b799ce40c5521c2f72f0b" + "reference": "c4e387b739022fd4b20abd8edb2143c44c5daa14" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/a50b7249bea81ddd6d3b799ce40c5521c2f72f0b", - "reference": "a50b7249bea81ddd6d3b799ce40c5521c2f72f0b", + "url": "https://api.github.com/repos/symfony/cache/zipball/c4e387b739022fd4b20abd8edb2143c44c5daa14", + "reference": "c4e387b739022fd4b20abd8edb2143c44c5daa14", "shasum": "" }, "require": { @@ -2017,7 +2137,7 @@ "symfony/messenger": "^4.4|^5.0|^6.0", "symfony/var-dumper": "^4.4|^5.0|^6.0" }, - "time": "2022-05-21T10:24:18+00:00", + "time": "2022-06-19T12:03:50+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2049,7 +2169,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.9" + "source": "https://github.com/symfony/cache/tree/v5.4.10" }, "funding": [ { @@ -2069,8 +2189,8 @@ }, { "name": "symfony/cache-contracts", - "version": "v2.5.1", - "version_normalized": "2.5.1.0", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", @@ -2131,7 +2251,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.5.1" + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2" }, "funding": [ { @@ -2233,17 +2353,17 @@ }, { "name": "symfony/console", - "version": "v5.4.9", - "version_normalized": "5.4.9.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb" + "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/829d5d1bf60b2efeb0887b7436873becc71a45eb", - "reference": "829d5d1bf60b2efeb0887b7436873becc71a45eb", + "url": "https://api.github.com/repos/symfony/console/zipball/4d671ab4ddac94ee439ea73649c69d9d200b5000", + "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000", "shasum": "" }, "require": { @@ -2281,7 +2401,7 @@ "symfony/lock": "", "symfony/process": "" }, - "time": "2022-05-18T06:17:34+00:00", + "time": "2022-06-26T13:00:04+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2315,7 +2435,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.9" + "source": "https://github.com/symfony/console/tree/v5.4.10" }, "funding": [ { @@ -2404,17 +2524,17 @@ }, { "name": "symfony/dependency-injection", - "version": "v5.4.9", - "version_normalized": "5.4.9.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "beecae161577305926ec078c4ed973f2b98880b3" + "reference": "88d1c0d38c2e60f757fa11d89cfc885f0b7f5171" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/beecae161577305926ec078c4ed973f2b98880b3", - "reference": "beecae161577305926ec078c4ed973f2b98880b3", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/88d1c0d38c2e60f757fa11d89cfc885f0b7f5171", + "reference": "88d1c0d38c2e60f757fa11d89cfc885f0b7f5171", "shasum": "" }, "require": { @@ -2448,7 +2568,7 @@ "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", "symfony/yaml": "" }, - "time": "2022-05-27T06:40:03+00:00", + "time": "2022-06-26T13:00:04+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2476,7 +2596,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.4.9" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.10" }, "funding": [ { @@ -2496,8 +2616,8 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.1", - "version_normalized": "2.5.1.0", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", @@ -2546,7 +2666,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -2802,8 +2922,8 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.1", - "version_normalized": "2.5.1.0", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", @@ -2864,7 +2984,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" }, "funding": [ { @@ -3017,17 +3137,17 @@ }, { "name": "symfony/framework-bundle", - "version": "v5.4.9", - "version_normalized": "5.4.9.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "1cb89cd3e36d5060545d0f223f00a774fa6430ef" + "reference": "7cbc790e067a23a47b9f0dc59e2ff0ecddbd3e14" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/1cb89cd3e36d5060545d0f223f00a774fa6430ef", - "reference": "1cb89cd3e36d5060545d0f223f00a774fa6430ef", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/7cbc790e067a23a47b9f0dc59e2ff0ecddbd3e14", + "reference": "7cbc790e067a23a47b9f0dc59e2ff0ecddbd3e14", "shasum": "" }, "require": { @@ -3123,7 +3243,7 @@ "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering", "symfony/yaml": "For using the debug:config and lint:yaml commands" }, - "time": "2022-05-27T06:29:07+00:00", + "time": "2022-06-19T13:15:57+00:00", "type": "symfony-bundle", "installation-source": "dist", "autoload": { @@ -3151,7 +3271,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.4.9" + "source": "https://github.com/symfony/framework-bundle/tree/v5.4.10" }, "funding": [ { @@ -3171,17 +3291,17 @@ }, { "name": "symfony/http-foundation", - "version": "v5.4.9", - "version_normalized": "5.4.9.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "6b0d0e4aca38d57605dcd11e2416994b38774522" + "reference": "e7793b7906f72a8cc51054fbca9dcff7a8af1c1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6b0d0e4aca38d57605dcd11e2416994b38774522", - "reference": "6b0d0e4aca38d57605dcd11e2416994b38774522", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e7793b7906f72a8cc51054fbca9dcff7a8af1c1e", + "reference": "e7793b7906f72a8cc51054fbca9dcff7a8af1c1e", "shasum": "" }, "require": { @@ -3199,7 +3319,7 @@ "suggest": { "symfony/mime": "To use the file extension guesser" }, - "time": "2022-05-17T15:07:29+00:00", + "time": "2022-06-19T13:13:40+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -3227,7 +3347,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.9" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.10" }, "funding": [ { @@ -3247,17 +3367,17 @@ }, { "name": "symfony/http-kernel", - "version": "v5.4.9", - "version_normalized": "5.4.9.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8" + "reference": "255ae3b0a488d78fbb34da23d3e0c059874b5948" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/34b121ad3dc761f35fe1346d2f15618f8cbf77f8", - "reference": "34b121ad3dc761f35fe1346d2f15618f8cbf77f8", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/255ae3b0a488d78fbb34da23d3e0c059874b5948", + "reference": "255ae3b0a488d78fbb34da23d3e0c059874b5948", "shasum": "" }, "require": { @@ -3314,7 +3434,7 @@ "symfony/console": "", "symfony/dependency-injection": "" }, - "time": "2022-05-27T07:09:08+00:00", + "time": "2022-06-26T16:57:59+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -3342,7 +3462,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.4.9" + "source": "https://github.com/symfony/http-kernel/tree/v5.4.10" }, "funding": [ { @@ -3529,96 +3649,6 @@ ], "install-path": "../symfony/polyfill-intl-grapheme" }, - { - "name": "symfony/polyfill-intl-idn", - "version": "v1.26.0", - "version_normalized": "1.26.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8", - "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "time": "2022-05-24T11:49:31+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "idn", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/polyfill-intl-idn" - }, { "name": "symfony/polyfill-intl-normalizer", "version": "v1.26.0", @@ -3792,85 +3822,6 @@ ], "install-path": "../symfony/polyfill-mbstring" }, - { - "name": "symfony/polyfill-php72", - "version": "v1.26.0", - "version_normalized": "1.26.0.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", - "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "time": "2022-05-24T11:49:31+00:00", - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "installation-source": "dist", - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "install-path": "../symfony/polyfill-php72" - }, { "name": "symfony/polyfill-php73", "version": "v1.26.0", @@ -4216,17 +4167,17 @@ }, { "name": "symfony/service-contracts", - "version": "v2.5.1", - "version_normalized": "2.5.1.0", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c" + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/24d9dc654b83e91aa59f9d167b131bc3b5bea24c", - "reference": "24d9dc654b83e91aa59f9d167b131bc3b5bea24c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "shasum": "" }, "require": { @@ -4240,7 +4191,7 @@ "suggest": { "symfony/service-implementation": "" }, - "time": "2022-03-13T20:07:29+00:00", + "time": "2022-05-30T19:17:29+00:00", "type": "library", "extra": { "branch-alias": { @@ -4282,7 +4233,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.1" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" }, "funding": [ { @@ -4367,17 +4318,17 @@ }, { "name": "symfony/string", - "version": "v5.4.9", - "version_normalized": "5.4.9.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99" + "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", - "reference": "985e6a9703ef5ce32ba617c9c7d97873bb7b2a99", + "url": "https://api.github.com/repos/symfony/string/zipball/4432bc7df82a554b3e413a8570ce2fea90e94097", + "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097", "shasum": "" }, "require": { @@ -4397,7 +4348,7 @@ "symfony/translation-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0|^6.0" }, - "time": "2022-04-19T10:40:37+00:00", + "time": "2022-06-26T15:57:47+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -4436,7 +4387,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.9" + "source": "https://github.com/symfony/string/tree/v5.4.10" }, "funding": [ { @@ -4456,17 +4407,17 @@ }, { "name": "symfony/translation-contracts", - "version": "v2.5.1", - "version_normalized": "2.5.1.0", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "1211df0afa701e45a04253110e959d4af4ef0f07" + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1211df0afa701e45a04253110e959d4af4ef0f07", - "reference": "1211df0afa701e45a04253110e959d4af4ef0f07", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", "shasum": "" }, "require": { @@ -4475,7 +4426,7 @@ "suggest": { "symfony/translation-implementation": "" }, - "time": "2022-01-02T09:53:40+00:00", + "time": "2022-06-27T16:58:25+00:00", "type": "library", "extra": { "branch-alias": { @@ -4517,7 +4468,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.5.1" + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" }, "funding": [ { @@ -4845,17 +4796,17 @@ }, { "name": "symfony/var-exporter", - "version": "v5.4.9", - "version_normalized": "5.4.9.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "63249ebfca4e75a357679fa7ba2089cfb898aa67" + "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/63249ebfca4e75a357679fa7ba2089cfb898aa67", - "reference": "63249ebfca4e75a357679fa7ba2089cfb898aa67", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8fc03ee75eeece3d9be1ef47d26d79bea1afb340", + "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340", "shasum": "" }, "require": { @@ -4865,7 +4816,7 @@ "require-dev": { "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0" }, - "time": "2022-05-21T10:24:18+00:00", + "time": "2022-05-27T12:56:18+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -4901,7 +4852,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.9" + "source": "https://github.com/symfony/var-exporter/tree/v5.4.10" }, "funding": [ { @@ -4921,17 +4872,17 @@ }, { "name": "symfony/web-profiler-bundle", - "version": "v5.4.8", - "version_normalized": "5.4.8.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "909c6eea7815066a80d0a362ed41abd7924e376a" + "reference": "f61c99d8dbd864b11935851b598f784bcff36fc7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/909c6eea7815066a80d0a362ed41abd7924e376a", - "reference": "909c6eea7815066a80d0a362ed41abd7924e376a", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/f61c99d8dbd864b11935851b598f784bcff36fc7", + "reference": "f61c99d8dbd864b11935851b598f784bcff36fc7", "shasum": "" }, "require": { @@ -4956,7 +4907,7 @@ "symfony/css-selector": "^4.4|^5.0|^6.0", "symfony/stopwatch": "^4.4|^5.0|^6.0" }, - "time": "2022-04-22T08:14:12+00:00", + "time": "2022-06-06T19:10:58+00:00", "type": "symfony-bundle", "installation-source": "dist", "autoload": { @@ -4984,7 +4935,7 @@ "description": "Provides a development tool that gives detailed information about the execution of any request", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v5.4.8" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v5.4.10" }, "funding": [ { @@ -5004,17 +4955,17 @@ }, { "name": "symfony/yaml", - "version": "v5.4.3", - "version_normalized": "5.4.3.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e80f87d2c9495966768310fc531b487ce64237a2" + "reference": "04e42926429d9e8b39c174387ab990bf7817f7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2", - "reference": "e80f87d2c9495966768310fc531b487ce64237a2", + "url": "https://api.github.com/repos/symfony/yaml/zipball/04e42926429d9e8b39c174387ab990bf7817f7a2", + "reference": "04e42926429d9e8b39c174387ab990bf7817f7a2", "shasum": "" }, "require": { @@ -5031,7 +4982,7 @@ "suggest": { "symfony/console": "For validating YAML files using the lint command" }, - "time": "2022-01-26T16:32:32+00:00", + "time": "2022-06-20T11:50:59+00:00", "bin": [ "Resources/bin/yaml-lint" ], @@ -5062,7 +5013,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.3" + "source": "https://github.com/symfony/yaml/tree/v5.4.10" }, "funding": [ { @@ -5082,25 +5033,27 @@ }, { "name": "thenetworg/oauth2-azure", - "version": "v2.0.1", - "version_normalized": "2.0.1.0", + "version": "v2.1.1", + "version_normalized": "2.1.1.0", "source": { "type": "git", "url": "https://github.com/TheNetworg/oauth2-azure.git", - "reference": "2649422a0dc74af32d21d9d738d37abcd5b03998" + "reference": "06fb2d620fb6e6c934f632c7ec7c5ea2e978a844" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TheNetworg/oauth2-azure/zipball/2649422a0dc74af32d21d9d738d37abcd5b03998", - "reference": "2649422a0dc74af32d21d9d738d37abcd5b03998", + "url": "https://api.github.com/repos/TheNetworg/oauth2-azure/zipball/06fb2d620fb6e6c934f632c7ec7c5ea2e978a844", + "reference": "06fb2d620fb6e6c934f632c7ec7c5ea2e978a844", "shasum": "" }, "require": { - "firebase/php-jwt": "~3.0||~4.0||~5.0", + "ext-json": "*", + "ext-openssl": "*", + "firebase/php-jwt": "~3.0||~4.0||~5.0||~6.0", "league/oauth2-client": "~2.0", - "php": "^5.6|^7.0|^8.0" + "php": "^7.1|^8.0" }, - "time": "2021-01-11T12:20:12+00:00", + "time": "2022-06-23T10:35:36+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -5134,7 +5087,7 @@ ], "support": { "issues": "https://github.com/TheNetworg/oauth2-azure/issues", - "source": "https://github.com/TheNetworg/oauth2-azure/tree/v2.0.1" + "source": "https://github.com/TheNetworg/oauth2-azure/tree/v2.1.1" }, "install-path": "../thenetworg/oauth2-azure" }, diff --git a/lib/composer/installed.php b/lib/composer/installed.php index bfe0ab15c..50899cbc1 100644 --- a/lib/composer/installed.php +++ b/lib/composer/installed.php @@ -1,19 +1,19 @@ array( - 'name' => '__root__', + 'name' => 'combodo/itop', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '0ff25728a42814dd0c0eb98528c7a5d7213b1e3d', + 'reference' => 'f295d43978c4e53c77cad51c9bad327633ac813c', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => true, ), 'versions' => array( - '__root__' => array( + 'combodo/itop' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '0ff25728a42814dd0c0eb98528c7a5d7213b1e3d', + 'reference' => 'f295d43978c4e53c77cad51c9bad327633ac813c', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -53,9 +53,9 @@ 'dev_requirement' => false, ), 'guzzlehttp/guzzle' => array( - 'pretty_version' => '6.5.8', - 'version' => '6.5.8.0', - 'reference' => 'a52f0440530b54fa079ce76e8c5d196a42cad981', + 'pretty_version' => '7.4.5', + 'version' => '7.4.5.0', + 'reference' => '1dd98b0564cb3f6bd16ce683cb755f94c10fbd82', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/guzzle', 'aliases' => array(), @@ -215,9 +215,9 @@ 'dev_requirement' => false, ), 'pelago/emogrifier' => array( - 'pretty_version' => 'v3.1.0', - 'version' => '3.1.0.0', - 'reference' => 'f6a5c7d44612d86c3901c93f1592f5440e6b2cd8', + 'pretty_version' => 'v6.0.0', + 'version' => '6.0.0.0', + 'reference' => 'aa72d5407efac118f3896bcb995a2cba793df0ae', 'type' => 'library', 'install_path' => __DIR__ . '/../pelago/emogrifier', 'aliases' => array(), @@ -269,6 +269,21 @@ 0 => '1.0', ), ), + 'psr/http-client' => array( + 'pretty_version' => '1.0.1', + 'version' => '1.0.1.0', + 'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621', + 'type' => 'library', + 'install_path' => __DIR__ . '/../psr/http-client', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'psr/http-client-implementation' => array( + 'dev_requirement' => false, + 'provided' => array( + 0 => '1.0', + ), + ), 'psr/http-message' => array( 'pretty_version' => '1.0.1', 'version' => '1.0.1.0', @@ -320,6 +335,15 @@ 0 => 'v1.10.11', ), ), + 'sabberworm/php-css-parser' => array( + 'pretty_version' => '8.4.0', + 'version' => '8.4.0.0', + 'reference' => 'e41d2140031d533348b2192a83f02d8dd8a71d30', + 'type' => 'library', + 'install_path' => __DIR__ . '/../sabberworm/php-css-parser', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'scssphp/scssphp' => array( 'pretty_version' => 'v1.10.3', 'version' => '1.10.3.0', @@ -330,17 +354,17 @@ 'dev_requirement' => false, ), 'symfony/cache' => array( - 'pretty_version' => 'v5.4.9', - 'version' => '5.4.9.0', - 'reference' => 'a50b7249bea81ddd6d3b799ce40c5521c2f72f0b', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', + 'reference' => 'c4e387b739022fd4b20abd8edb2143c44c5daa14', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/cache', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/cache-contracts' => array( - 'pretty_version' => 'v2.5.1', - 'version' => '2.5.1.0', + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', 'reference' => '64be4a7acb83b6f2bf6de9a02cee6dad41277ebc', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/cache-contracts', @@ -363,9 +387,9 @@ 'dev_requirement' => false, ), 'symfony/console' => array( - 'pretty_version' => 'v5.4.9', - 'version' => '5.4.9.0', - 'reference' => '829d5d1bf60b2efeb0887b7436873becc71a45eb', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', + 'reference' => '4d671ab4ddac94ee439ea73649c69d9d200b5000', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), @@ -381,17 +405,17 @@ 'dev_requirement' => false, ), 'symfony/dependency-injection' => array( - 'pretty_version' => 'v5.4.9', - 'version' => '5.4.9.0', - 'reference' => 'beecae161577305926ec078c4ed973f2b98880b3', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', + 'reference' => '88d1c0d38c2e60f757fa11d89cfc885f0b7f5171', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/dependency-injection', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/deprecation-contracts' => array( - 'pretty_version' => 'v2.5.1', - 'version' => '2.5.1.0', + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', 'reference' => 'e8b495ea28c1d97b5e0c121748d6f9b53d075c66', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', @@ -426,8 +450,8 @@ 'dev_requirement' => false, ), 'symfony/event-dispatcher-contracts' => array( - 'pretty_version' => 'v2.5.1', - 'version' => '2.5.1.0', + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', 'reference' => 'f98b54df6ad059855739db6fcbc2d36995283fe1', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/event-dispatcher-contracts', @@ -459,27 +483,27 @@ 'dev_requirement' => false, ), 'symfony/framework-bundle' => array( - 'pretty_version' => 'v5.4.9', - 'version' => '5.4.9.0', - 'reference' => '1cb89cd3e36d5060545d0f223f00a774fa6430ef', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', + 'reference' => '7cbc790e067a23a47b9f0dc59e2ff0ecddbd3e14', 'type' => 'symfony-bundle', 'install_path' => __DIR__ . '/../symfony/framework-bundle', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/http-foundation' => array( - 'pretty_version' => 'v5.4.9', - 'version' => '5.4.9.0', - 'reference' => '6b0d0e4aca38d57605dcd11e2416994b38774522', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', + 'reference' => 'e7793b7906f72a8cc51054fbca9dcff7a8af1c1e', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/http-foundation', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/http-kernel' => array( - 'pretty_version' => 'v5.4.9', - 'version' => '5.4.9.0', - 'reference' => '34b121ad3dc761f35fe1346d2f15618f8cbf77f8', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', + 'reference' => '255ae3b0a488d78fbb34da23d3e0c059874b5948', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/http-kernel', 'aliases' => array(), @@ -503,15 +527,6 @@ 'aliases' => array(), 'dev_requirement' => false, ), - 'symfony/polyfill-intl-idn' => array( - 'pretty_version' => 'v1.26.0', - 'version' => '1.26.0.0', - 'reference' => '59a8d271f00dd0e4c2e518104cc7963f655a1aa8', - 'type' => 'library', - 'install_path' => __DIR__ . '/../symfony/polyfill-intl-idn', - 'aliases' => array(), - 'dev_requirement' => false, - ), 'symfony/polyfill-intl-normalizer' => array( 'pretty_version' => 'v1.26.0', 'version' => '1.26.0.0', @@ -530,15 +545,6 @@ 'aliases' => array(), 'dev_requirement' => false, ), - 'symfony/polyfill-php72' => array( - 'pretty_version' => 'v1.26.0', - 'version' => '1.26.0.0', - 'reference' => 'bf44a9fd41feaac72b074de600314a93e2ae78e2', - 'type' => 'library', - 'install_path' => __DIR__ . '/../symfony/polyfill-php72', - 'aliases' => array(), - 'dev_requirement' => false, - ), 'symfony/polyfill-php73' => array( 'pretty_version' => 'v1.26.0', 'version' => '1.26.0.0', @@ -576,9 +582,9 @@ 'dev_requirement' => false, ), 'symfony/service-contracts' => array( - 'pretty_version' => 'v2.5.1', - 'version' => '2.5.1.0', - 'reference' => '24d9dc654b83e91aa59f9d167b131bc3b5bea24c', + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', + 'reference' => '4b426aac47d6427cc1a1d0f7e2ac724627f5966c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), @@ -600,18 +606,18 @@ 'dev_requirement' => true, ), 'symfony/string' => array( - 'pretty_version' => 'v5.4.9', - 'version' => '5.4.9.0', - 'reference' => '985e6a9703ef5ce32ba617c9c7d97873bb7b2a99', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', + 'reference' => '4432bc7df82a554b3e413a8570ce2fea90e94097', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/string', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/translation-contracts' => array( - 'pretty_version' => 'v2.5.1', - 'version' => '2.5.1.0', - 'reference' => '1211df0afa701e45a04253110e959d4af4ef0f07', + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', + 'reference' => '136b19dd05cdf0709db6537d058bcab6dd6e2dbe', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/translation-contracts', 'aliases' => array(), @@ -645,27 +651,27 @@ 'dev_requirement' => false, ), 'symfony/var-exporter' => array( - 'pretty_version' => 'v5.4.9', - 'version' => '5.4.9.0', - 'reference' => '63249ebfca4e75a357679fa7ba2089cfb898aa67', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', + 'reference' => '8fc03ee75eeece3d9be1ef47d26d79bea1afb340', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/var-exporter', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/web-profiler-bundle' => array( - 'pretty_version' => 'v5.4.8', - 'version' => '5.4.8.0', - 'reference' => '909c6eea7815066a80d0a362ed41abd7924e376a', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', + 'reference' => 'f61c99d8dbd864b11935851b598f784bcff36fc7', 'type' => 'symfony-bundle', 'install_path' => __DIR__ . '/../symfony/web-profiler-bundle', 'aliases' => array(), 'dev_requirement' => true, ), 'symfony/yaml' => array( - 'pretty_version' => 'v5.4.3', - 'version' => '5.4.3.0', - 'reference' => 'e80f87d2c9495966768310fc531b487ce64237a2', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', + 'reference' => '04e42926429d9e8b39c174387ab990bf7817f7a2', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/yaml', 'aliases' => array(), @@ -678,9 +684,9 @@ ), ), 'thenetworg/oauth2-azure' => array( - 'pretty_version' => 'v2.0.1', - 'version' => '2.0.1.0', - 'reference' => '2649422a0dc74af32d21d9d738d37abcd5b03998', + 'pretty_version' => 'v2.1.1', + 'version' => '2.1.1.0', + 'reference' => '06fb2d620fb6e6c934f632c7ec7c5ea2e978a844', 'type' => 'library', 'install_path' => __DIR__ . '/../thenetworg/oauth2-azure', 'aliases' => array(), diff --git a/lib/composer/platform_check.php b/lib/composer/platform_check.php index 4bf5e61af..b94da5c4c 100644 --- a/lib/composer/platform_check.php +++ b/lib/composer/platform_check.php @@ -15,6 +15,7 @@ extension_loaded('iconv') || $missingExtensions[] = 'iconv'; extension_loaded('json') || $missingExtensions[] = 'json'; extension_loaded('libxml') || $missingExtensions[] = 'libxml'; extension_loaded('mysqli') || $missingExtensions[] = 'mysqli'; +extension_loaded('openssl') || $missingExtensions[] = 'openssl'; extension_loaded('soap') || $missingExtensions[] = 'soap'; extension_loaded('tokenizer') || $missingExtensions[] = 'tokenizer'; extension_loaded('xml') || $missingExtensions[] = 'xml'; diff --git a/lib/firebase/php-jwt/src/CachedKeySet.php b/lib/firebase/php-jwt/src/CachedKeySet.php new file mode 100644 index 000000000..e2215b309 --- /dev/null +++ b/lib/firebase/php-jwt/src/CachedKeySet.php @@ -0,0 +1,229 @@ + + */ +class CachedKeySet implements ArrayAccess +{ + /** + * @var string + */ + private $jwksUri; + /** + * @var ClientInterface + */ + private $httpClient; + /** + * @var RequestFactoryInterface + */ + private $httpFactory; + /** + * @var CacheItemPoolInterface + */ + private $cache; + /** + * @var ?int + */ + private $expiresAfter; + /** + * @var ?CacheItemInterface + */ + private $cacheItem; + /** + * @var array + */ + private $keySet; + /** + * @var string + */ + private $cacheKey; + /** + * @var string + */ + private $cacheKeyPrefix = 'jwks'; + /** + * @var int + */ + private $maxKeyLength = 64; + /** + * @var bool + */ + private $rateLimit; + /** + * @var string + */ + private $rateLimitCacheKey; + /** + * @var int + */ + private $maxCallsPerMinute = 10; + /** + * @var string|null + */ + private $defaultAlg; + + public function __construct( + string $jwksUri, + ClientInterface $httpClient, + RequestFactoryInterface $httpFactory, + CacheItemPoolInterface $cache, + int $expiresAfter = null, + bool $rateLimit = false, + string $defaultAlg = null + ) { + $this->jwksUri = $jwksUri; + $this->httpClient = $httpClient; + $this->httpFactory = $httpFactory; + $this->cache = $cache; + $this->expiresAfter = $expiresAfter; + $this->rateLimit = $rateLimit; + $this->defaultAlg = $defaultAlg; + $this->setCacheKeys(); + } + + /** + * @param string $keyId + * @return Key + */ + public function offsetGet($keyId): Key + { + if (!$this->keyIdExists($keyId)) { + throw new OutOfBoundsException('Key ID not found'); + } + return $this->keySet[$keyId]; + } + + /** + * @param string $keyId + * @return bool + */ + public function offsetExists($keyId): bool + { + return $this->keyIdExists($keyId); + } + + /** + * @param string $offset + * @param Key $value + */ + public function offsetSet($offset, $value): void + { + throw new LogicException('Method not implemented'); + } + + /** + * @param string $offset + */ + public function offsetUnset($offset): void + { + throw new LogicException('Method not implemented'); + } + + private function keyIdExists(string $keyId): bool + { + if (null === $this->keySet) { + $item = $this->getCacheItem(); + // Try to load keys from cache + if ($item->isHit()) { + // item found! Return it + $jwks = $item->get(); + $this->keySet = JWK::parseKeySet(json_decode($jwks, true), $this->defaultAlg); + } + } + + if (!isset($this->keySet[$keyId])) { + if ($this->rateLimitExceeded()) { + return false; + } + $request = $this->httpFactory->createRequest('get', $this->jwksUri); + $jwksResponse = $this->httpClient->sendRequest($request); + $jwks = (string) $jwksResponse->getBody(); + $this->keySet = JWK::parseKeySet(json_decode($jwks, true), $this->defaultAlg); + + if (!isset($this->keySet[$keyId])) { + return false; + } + + $item = $this->getCacheItem(); + $item->set($jwks); + if ($this->expiresAfter) { + $item->expiresAfter($this->expiresAfter); + } + $this->cache->save($item); + } + + return true; + } + + private function rateLimitExceeded(): bool + { + if (!$this->rateLimit) { + return false; + } + + $cacheItem = $this->cache->getItem($this->rateLimitCacheKey); + if (!$cacheItem->isHit()) { + $cacheItem->expiresAfter(1); // # of calls are cached each minute + } + + $callsPerMinute = (int) $cacheItem->get(); + if (++$callsPerMinute > $this->maxCallsPerMinute) { + return true; + } + $cacheItem->set($callsPerMinute); + $this->cache->save($cacheItem); + return false; + } + + private function getCacheItem(): CacheItemInterface + { + if (\is_null($this->cacheItem)) { + $this->cacheItem = $this->cache->getItem($this->cacheKey); + } + + return $this->cacheItem; + } + + private function setCacheKeys(): void + { + if (empty($this->jwksUri)) { + throw new RuntimeException('JWKS URI is empty'); + } + + // ensure we do not have illegal characters + $key = preg_replace('|[^a-zA-Z0-9_\.!]|', '', $this->jwksUri); + + // add prefix + $key = $this->cacheKeyPrefix . $key; + + // Hash keys if they exceed $maxKeyLength of 64 + if (\strlen($key) > $this->maxKeyLength) { + $key = substr(hash('sha256', $key), 0, $this->maxKeyLength); + } + + $this->cacheKey = $key; + + if ($this->rateLimit) { + // add prefix + $rateLimitKey = $this->cacheKeyPrefix . 'ratelimit' . $key; + + // Hash keys if they exceed $maxKeyLength of 64 + if (\strlen($rateLimitKey) > $this->maxKeyLength) { + $rateLimitKey = substr(hash('sha256', $rateLimitKey), 0, $this->maxKeyLength); + } + + $this->rateLimitCacheKey = $rateLimitKey; + } + } +} diff --git a/lib/guzzlehttp/guzzle/.php_cs b/lib/guzzlehttp/guzzle/.php_cs deleted file mode 100644 index 2dd5036c1..000000000 --- a/lib/guzzlehttp/guzzle/.php_cs +++ /dev/null @@ -1,23 +0,0 @@ -setRiskyAllowed(true) - ->setRules([ - '@PSR2' => true, - 'array_syntax' => ['syntax' => 'short'], - 'declare_strict_types' => false, - 'concat_space' => ['spacing'=>'one'], - 'php_unit_test_case_static_method_calls' => ['call_type' => 'self'], - 'ordered_imports' => true, - // 'phpdoc_align' => ['align'=>'vertical'], - // 'native_function_invocation' => true, - ]) - ->setFinder( - PhpCsFixer\Finder::create() - ->in(__DIR__.'/src') - ->in(__DIR__.'/tests') - ->name('*.php') - ) -; - -return $config; diff --git a/lib/guzzlehttp/guzzle/CHANGELOG.md b/lib/guzzlehttp/guzzle/CHANGELOG.md index b053017a9..3aaf11bf9 100644 --- a/lib/guzzlehttp/guzzle/CHANGELOG.md +++ b/lib/guzzlehttp/guzzle/CHANGELOG.md @@ -1,31 +1,196 @@ # Change Log -## 6.5.8 - 2022-06-20 +Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version. + +## 7.4.5 - 2022-06-20 * Fix change in port should be considered a change in origin * Fix `CURLOPT_HTTPAUTH` option not cleared on change of origin -## 6.5.7 - 2022-06-09 +## 7.4.4 - 2022-06-09 * Fix failure to strip Authorization header on HTTP downgrade * Fix failure to strip the Cookie header on change in host or HTTP downgrade -## 6.5.6 - 2022-05-25 +## 7.4.3 - 2022-05-25 * Fix cross-domain cookie leakage -## 6.5.5 - 2020-06-16 +## 7.4.2 - 2022-03-20 -* Unpin version constraint for `symfony/polyfill-intl-idn` [#2678](https://github.com/guzzle/guzzle/pull/2678) +### Fixed -## 6.5.4 - 2020-05-25 +- Remove curl auth on cross-domain redirects to align with the Authorization HTTP header +- Reject non-HTTP schemes in StreamHandler +- Set a default ssl.peer_name context in StreamHandler to allow `force_ip_resolve` -* Fix various intl icu issues [#2626](https://github.com/guzzle/guzzle/pull/2626) +## 7.4.1 - 2021-12-06 -## 6.5.3 - 2020-04-18 +### Changed +- Replaced implicit URI to string coercion [#2946](https://github.com/guzzle/guzzle/pull/2946) +- Allow `symfony/deprecation-contracts` version 3 [#2961](https://github.com/guzzle/guzzle/pull/2961) + +### Fixed + +- Only close curl handle if it's done [#2950](https://github.com/guzzle/guzzle/pull/2950) + +## 7.4.0 - 2021-10-18 + +### Added + +- Support PHP 8.1 [#2929](https://github.com/guzzle/guzzle/pull/2929), [#2939](https://github.com/guzzle/guzzle/pull/2939) +- Support `psr/log` version 2 and 3 [#2943](https://github.com/guzzle/guzzle/pull/2943) + +### Fixed + +- Make sure we always call `restore_error_handler()` [#2915](https://github.com/guzzle/guzzle/pull/2915) +- Fix progress parameter type compatibility between the cURL and stream handlers [#2936](https://github.com/guzzle/guzzle/pull/2936) +- Throw `InvalidArgumentException` when an incorrect `headers` array is provided [#2916](https://github.com/guzzle/guzzle/pull/2916), [#2942](https://github.com/guzzle/guzzle/pull/2942) + +### Changed + +- Be more strict with types [#2914](https://github.com/guzzle/guzzle/pull/2914), [#2917](https://github.com/guzzle/guzzle/pull/2917), [#2919](https://github.com/guzzle/guzzle/pull/2919), [#2945](https://github.com/guzzle/guzzle/pull/2945) + +## 7.3.0 - 2021-03-23 + +### Added + +- Support for DER and P12 certificates [#2413](https://github.com/guzzle/guzzle/pull/2413) +- Support the cURL (http://) scheme for StreamHandler proxies [#2850](https://github.com/guzzle/guzzle/pull/2850) +- Support for `guzzlehttp/psr7:^2.0` [#2878](https://github.com/guzzle/guzzle/pull/2878) + +### Fixed + +- Handle exceptions on invalid header consistently between PHP versions and handlers [#2872](https://github.com/guzzle/guzzle/pull/2872) + +## 7.2.0 - 2020-10-10 + +### Added + +- Support for PHP 8 [#2712](https://github.com/guzzle/guzzle/pull/2712), [#2715](https://github.com/guzzle/guzzle/pull/2715), [#2789](https://github.com/guzzle/guzzle/pull/2789) +- Support passing a body summarizer to the http errors middleware [#2795](https://github.com/guzzle/guzzle/pull/2795) + +### Fixed + +- Handle exceptions during response creation [#2591](https://github.com/guzzle/guzzle/pull/2591) +- Fix CURLOPT_ENCODING not to be overwritten [#2595](https://github.com/guzzle/guzzle/pull/2595) +- Make sure the Request always has a body object [#2804](https://github.com/guzzle/guzzle/pull/2804) + +### Changed + +- The `TooManyRedirectsException` has a response [#2660](https://github.com/guzzle/guzzle/pull/2660) +- Avoid "functions" from dependencies [#2712](https://github.com/guzzle/guzzle/pull/2712) + +### Deprecated + +- Using environment variable GUZZLE_CURL_SELECT_TIMEOUT [#2786](https://github.com/guzzle/guzzle/pull/2786) + +## 7.1.1 - 2020-09-30 + +### Fixed + +- Incorrect EOF detection for response body streams on Windows. + +### Changed + +- We dont connect curl `sink` on HEAD requests. +- Removed some PHP 5 workarounds + +## 7.1.0 - 2020-09-22 + +### Added + +- `GuzzleHttp\MessageFormatterInterface` + +### Fixed + +- Fixed issue that caused cookies with no value not to be stored. +- On redirects, we allow all safe methods like GET, HEAD and OPTIONS. +- Fixed logging on empty responses. +- Make sure MessageFormatter::format returns string + +### Deprecated + +- All functions in `GuzzleHttp` has been deprecated. Use static methods on `Utils` instead. +- `ClientInterface::getConfig()` +- `Client::getConfig()` +- `Client::__call()` +- `Utils::defaultCaBundle()` +- `CurlFactory::LOW_CURL_VERSION_NUMBER` + +## 7.0.1 - 2020-06-27 + +* Fix multiply defined functions fatal error [#2699](https://github.com/guzzle/guzzle/pull/2699) + +## 7.0.0 - 2020-06-27 + +No changes since 7.0.0-rc1. + +## 7.0.0-rc1 - 2020-06-15 + +### Changed + +* Use error level for logging errors in Middleware [#2629](https://github.com/guzzle/guzzle/pull/2629) +* Disabled IDN support by default and require ext-intl to use it [#2675](https://github.com/guzzle/guzzle/pull/2675) + +## 7.0.0-beta2 - 2020-05-25 + +### Added + +* Using `Utils` class instead of functions in the `GuzzleHttp` namespace. [#2546](https://github.com/guzzle/guzzle/pull/2546) +* `ClientInterface::MAJOR_VERSION` [#2583](https://github.com/guzzle/guzzle/pull/2583) + +### Changed + +* Avoid the `getenv` function when unsafe [#2531](https://github.com/guzzle/guzzle/pull/2531) +* Added real client methods [#2529](https://github.com/guzzle/guzzle/pull/2529) +* Avoid functions due to global install conflicts [#2546](https://github.com/guzzle/guzzle/pull/2546) * Use Symfony intl-idn polyfill [#2550](https://github.com/guzzle/guzzle/pull/2550) -* Remove use of internal functions [#2548](https://github.com/guzzle/guzzle/pull/2548) +* Adding methods for HTTP verbs like `Client::get()`, `Client::head()`, `Client::patch()` etc [#2529](https://github.com/guzzle/guzzle/pull/2529) +* `ConnectException` extends `TransferException` [#2541](https://github.com/guzzle/guzzle/pull/2541) +* Updated the default User Agent to "GuzzleHttp/7" [#2654](https://github.com/guzzle/guzzle/pull/2654) + +### Fixed + +* Various intl icu issues [#2626](https://github.com/guzzle/guzzle/pull/2626) + +### Removed + +* Pool option `pool_size` [#2528](https://github.com/guzzle/guzzle/pull/2528) + +## 7.0.0-beta1 - 2019-12-30 + +The diff might look very big but 95% of Guzzle users will be able to upgrade without modification. +Please see [the upgrade document](UPGRADING.md) that describes all BC breaking changes. + +### Added + +* Implement PSR-18 and dropped PHP 5 support [#2421](https://github.com/guzzle/guzzle/pull/2421) [#2474](https://github.com/guzzle/guzzle/pull/2474) +* PHP 7 types [#2442](https://github.com/guzzle/guzzle/pull/2442) [#2449](https://github.com/guzzle/guzzle/pull/2449) [#2466](https://github.com/guzzle/guzzle/pull/2466) [#2497](https://github.com/guzzle/guzzle/pull/2497) [#2499](https://github.com/guzzle/guzzle/pull/2499) +* IDN support for redirects [2424](https://github.com/guzzle/guzzle/pull/2424) + +### Changed + +* Dont allow passing null as third argument to `BadResponseException::__construct()` [#2427](https://github.com/guzzle/guzzle/pull/2427) +* Use SAPI constant instead of method call [#2450](https://github.com/guzzle/guzzle/pull/2450) +* Use native function invocation [#2444](https://github.com/guzzle/guzzle/pull/2444) +* Better defaults for PHP installations with old ICU lib [2454](https://github.com/guzzle/guzzle/pull/2454) +* Added visibility to all constants [#2462](https://github.com/guzzle/guzzle/pull/2462) +* Dont allow passing `null` as URI to `Client::request()` and `Client::requestAsync()` [#2461](https://github.com/guzzle/guzzle/pull/2461) +* Widen the exception argument to throwable [#2495](https://github.com/guzzle/guzzle/pull/2495) + +### Fixed + +* Logging when Promise rejected with a string [#2311](https://github.com/guzzle/guzzle/pull/2311) + +### Removed + +* Class `SeekException` [#2162](https://github.com/guzzle/guzzle/pull/2162) +* `RequestException::getResponseBodySummary()` [#2425](https://github.com/guzzle/guzzle/pull/2425) +* `CookieJar::getCookieValue()` [#2433](https://github.com/guzzle/guzzle/pull/2433) +* `uri_template()` and `UriTemplate` [#2440](https://github.com/guzzle/guzzle/pull/2440) +* Request options `save_to` and `exceptions` [#2464](https://github.com/guzzle/guzzle/pull/2464) ## 6.5.2 - 2019-12-23 @@ -41,16 +206,13 @@ * Improvement: Added support for reset internal queue in MockHandler. [#2143](https://github.com/guzzle/guzzle/pull/2143) * Improvement: Added support to pass arbitrary options to `curl_multi_init`. [#2287](https://github.com/guzzle/guzzle/pull/2287) * Fix: Gracefully handle passing `null` to the `header` option. [#2132](https://github.com/guzzle/guzzle/pull/2132) -* Fix: `RetryMiddleware` did not do exponential delay between retries due unit mismatch. [#2132](https://github.com/guzzle/guzzle/pull/2132) - Previously, `RetryMiddleware` would sleep for 1 millisecond, then 2 milliseconds, then 4 milliseconds. - **After this change, `RetryMiddleware` will sleep for 1 second, then 2 seconds, then 4 seconds.** - `Middleware::retry()` accepts a second callback parameter to override the default timeouts if needed. +* Fix: `RetryMiddleware` did not do exponential delay between retires due unit mismatch. [#2132](https://github.com/guzzle/guzzle/pull/2132) * Fix: Prevent undefined offset when using array for ssl_key options. [#2348](https://github.com/guzzle/guzzle/pull/2348) * Deprecated `ClientInterface::VERSION` ## 6.4.1 - 2019-10-23 -* No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that +* No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that * Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar` ## 6.4.0 - 2019-10-23 @@ -372,7 +534,7 @@ object). * Note: This has been changed in 5.0.3 to now encode query string values by default unless the `rawString` argument is provided when setting the query string on a URL: Now allowing many more characters to be present in the - query string without being percent encoded. See http://tools.ietf.org/html/rfc3986#appendix-A + query string without being percent encoded. See https://tools.ietf.org/html/rfc3986#appendix-A ## 5.0.1 - 2014-10-16 @@ -414,7 +576,7 @@ interfaces. responses, `GuzzleHttp\Collection`, `GuzzleHttp\Url`, `GuzzleHttp\Query`, `GuzzleHttp\Post\PostBody`, and `GuzzleHttp\Cookie\SetCookie`. This blog post provides a good outline of - why I did this: http://ocramius.github.io/blog/fluent-interfaces-are-evil/. + why I did this: https://ocramius.github.io/blog/fluent-interfaces-are-evil/. This also makes the Guzzle message interfaces compatible with the current PSR-7 message proposal. * Removed "functions.php", so that Guzzle is truly PSR-4 compliant. Except @@ -600,8 +762,6 @@ interfaces. ## 4.0.0 - 2014-03-29 -* For more information on the 4.0 transition, see: - http://mtdowling.com/blog/2014/03/15/guzzle-4-rc/ * For information on changes and upgrading, see: https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40 * Added `GuzzleHttp\batch()` as a convenience function for sending requests in @@ -910,7 +1070,7 @@ interfaces. ## 3.4.0 - 2013-04-11 -* Bug fix: URLs are now resolved correctly based on http://tools.ietf.org/html/rfc3986#section-5.2. #289 +* Bug fix: URLs are now resolved correctly based on https://tools.ietf.org/html/rfc3986#section-5.2. #289 * Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289 * Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263 * Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264. diff --git a/lib/guzzlehttp/guzzle/Dockerfile b/lib/guzzlehttp/guzzle/Dockerfile deleted file mode 100644 index f6a095230..000000000 --- a/lib/guzzlehttp/guzzle/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM composer:latest as setup - -RUN mkdir /guzzle - -WORKDIR /guzzle - -RUN set -xe \ - && composer init --name=guzzlehttp/test --description="Simple project for testing Guzzle scripts" --author="MĆ”rk SĆ”gi-KazĆ”r " --no-interaction \ - && composer require guzzlehttp/guzzle - - -FROM php:7.3 - -RUN mkdir /guzzle - -WORKDIR /guzzle - -COPY --from=setup /guzzle /guzzle diff --git a/lib/guzzlehttp/guzzle/README.md b/lib/guzzlehttp/guzzle/README.md index bc98e1a10..f287fa98d 100644 --- a/lib/guzzlehttp/guzzle/README.md +++ b/lib/guzzlehttp/guzzle/README.md @@ -15,6 +15,7 @@ trivial to integrate with web services. - Can send both synchronous and asynchronous requests using the same interface. - Uses PSR-7 interfaces for requests, responses, and streams. This allows you to utilize other PSR-7 compatible libraries with Guzzle. +- Supports PSR-18 allowing interoperability between other PSR-18 HTTP Clients. - Abstracts away the underlying HTTP transport, allowing you to write environment and transport agnostic code; i.e., no hard dependency on cURL, PHP streams, sockets, or non-blocking event loops. @@ -24,11 +25,11 @@ trivial to integrate with web services. $client = new \GuzzleHttp\Client(); $response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle'); -echo $response->getStatusCode(); # 200 -echo $response->getHeaderLine('content-type'); # 'application/json; charset=utf8' -echo $response->getBody(); # '{"id": 1420053, "name": "guzzle", ...}' +echo $response->getStatusCode(); // 200 +echo $response->getHeaderLine('content-type'); // 'application/json; charset=utf8' +echo $response->getBody(); // '{"id": 1420053, "name": "guzzle", ...}' -# Send an asynchronous request. +// Send an asynchronous request. $request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org'); $promise = $client->sendAsync($request)->then(function ($response) { echo 'I completed! ' . $response->getBody(); @@ -52,29 +53,10 @@ We use GitHub issues only to discuss bugs and new features. For support please r The recommended way to install Guzzle is through [Composer](https://getcomposer.org/). -```bash -# Install Composer -curl -sS https://getcomposer.org/installer | php -``` - -Next, run the Composer command to install the latest stable version of Guzzle: - ```bash composer require guzzlehttp/guzzle ``` -After installing, you need to require Composer's autoloader: - -```php -require 'vendor/autoload.php'; -``` - -You can then later update Guzzle using composer: - - ```bash -composer update - ``` - ## Version Guidance @@ -95,3 +77,18 @@ composer update [guzzle-5-docs]: https://docs.guzzlephp.org/en/5.3/ [guzzle-6-docs]: https://docs.guzzlephp.org/en/6.5/ [guzzle-7-docs]: https://docs.guzzlephp.org/en/latest/ + + +## Security + +If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/guzzle/security/policy) for more information. + +## License + +Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information. + +## For Enterprise + +Available as part of the Tidelift Subscription + +The maintainers of Guzzle and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/packagist-guzzlehttp-guzzle?utm_source=packagist-guzzlehttp-guzzle&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) diff --git a/lib/guzzlehttp/guzzle/UPGRADING.md b/lib/guzzlehttp/guzzle/UPGRADING.md index 91d1dcc99..45417a7e1 100644 --- a/lib/guzzlehttp/guzzle/UPGRADING.md +++ b/lib/guzzlehttp/guzzle/UPGRADING.md @@ -1,10 +1,60 @@ Guzzle Upgrade Guide ==================== +6.0 to 7.0 +---------- + +In order to take advantage of the new features of PHP, Guzzle dropped the support +of PHP 5. The minimum supported PHP version is now PHP 7.2. Type hints and return +types for functions and methods have been added wherever possible. + +Please make sure: +- You are calling a function or a method with the correct type. +- If you extend a class of Guzzle; update all signatures on methods you override. + +#### Other backwards compatibility breaking changes + +- Class `GuzzleHttp\UriTemplate` is removed. +- Class `GuzzleHttp\Exception\SeekException` is removed. +- Classes `GuzzleHttp\Exception\BadResponseException`, `GuzzleHttp\Exception\ClientException`, + `GuzzleHttp\Exception\ServerException` can no longer be initialized with an empty + Response as argument. +- Class `GuzzleHttp\Exception\ConnectException` now extends `GuzzleHttp\Exception\TransferException` + instead of `GuzzleHttp\Exception\RequestException`. +- Function `GuzzleHttp\Exception\ConnectException::getResponse()` is removed. +- Function `GuzzleHttp\Exception\ConnectException::hasResponse()` is removed. +- Constant `GuzzleHttp\ClientInterface::VERSION` is removed. Added `GuzzleHttp\ClientInterface::MAJOR_VERSION` instead. +- Function `GuzzleHttp\Exception\RequestException::getResponseBodySummary` is removed. + Use `\GuzzleHttp\Psr7\get_message_body_summary` as an alternative. +- Function `GuzzleHttp\Cookie\CookieJar::getCookieValue` is removed. +- Request option `exception` is removed. Please use `http_errors`. +- Request option `save_to` is removed. Please use `sink`. +- Pool option `pool_size` is removed. Please use `concurrency`. +- We now look for environment variables in the `$_SERVER` super global, due to thread safety issues with `getenv`. We continue to fallback to `getenv` in CLI environments, for maximum compatibility. +- The `get`, `head`, `put`, `post`, `patch`, `delete`, `getAsync`, `headAsync`, `putAsync`, `postAsync`, `patchAsync`, and `deleteAsync` methods are now implemented as genuine methods on `GuzzleHttp\Client`, with strong typing. The original `__call` implementation remains unchanged for now, for maximum backwards compatibility, but won't be invoked under normal operation. +- The `log` middleware will log the errors with level `error` instead of `notice` +- Support for international domain names (IDN) is now disabled by default, and enabling it requires installing ext-intl, linked against a modern version of the C library (ICU 4.6 or higher). + +#### Native functions calls + +All internal native functions calls of Guzzle are now prefixed with a slash. This +change makes it impossible for method overloading by other libraries or applications. +Example: + +```php +// Before: +curl_version(); + +// After: +\curl_version(); +``` + +For the full diff you can check [here](https://github.com/guzzle/guzzle/compare/6.5.4..master). + 5.0 to 6.0 ---------- -Guzzle now uses [PSR-7](http://www.php-fig.org/psr/psr-7/) for HTTP messages. +Guzzle now uses [PSR-7](https://www.php-fig.org/psr/psr-7/) for HTTP messages. Due to the fact that these messages are immutable, this prompted a refactoring of Guzzle to use a middleware based system rather than an event system. Any HTTP message interaction (e.g., `GuzzleHttp\Message\Request`) need to be @@ -167,7 +217,7 @@ passing a `GuzzleHttp\Adapter\AdapterInterface`, you must now pass a PHP ## Removed Fluent Interfaces -[Fluent interfaces were removed](http://ocramius.github.io/blog/fluent-interfaces-are-evil) +[Fluent interfaces were removed](https://ocramius.github.io/blog/fluent-interfaces-are-evil/) from the following classes: - `GuzzleHttp\Collection` @@ -820,7 +870,7 @@ HeaderInterface (e.g. toArray(), getAll(), etc.). 3.3 to 3.4 ---------- -Base URLs of a client now follow the rules of http://tools.ietf.org/html/rfc3986#section-5.2.2 when merging URLs. +Base URLs of a client now follow the rules of https://tools.ietf.org/html/rfc3986#section-5.2.2 when merging URLs. 3.2 to 3.3 ---------- diff --git a/lib/guzzlehttp/guzzle/composer.json b/lib/guzzlehttp/guzzle/composer.json index a57d78f60..7e043b038 100644 --- a/lib/guzzlehttp/guzzle/composer.json +++ b/lib/guzzlehttp/guzzle/composer.json @@ -1,6 +1,5 @@ { "name": "guzzlehttp/guzzle", - "type": "library", "description": "Guzzle is a PHP HTTP client library", "keywords": [ "framework", @@ -9,9 +8,10 @@ "web service", "curl", "client", - "HTTP client" + "HTTP client", + "PSR-7", + "PSR-18" ], - "homepage": "http://guzzlephp.org/", "license": "MIT", "authors": [ { @@ -51,29 +51,38 @@ } ], "require": { - "php": ">=5.5", + "php": "^7.2.5 || ^8.0", "ext-json": "*", - "symfony/polyfill-intl-idn": "^1.17", - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.9" + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" }, "require-dev": { "ext-curl": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.1" + "bamarni/composer-bin-plugin": "^1.4.1", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.5 || ^9.3.5", + "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "config": { - "sort-packages": true, "allow-plugins": { "bamarni/composer-bin-plugin": true - } + }, + "preferred-install": "dist", + "sort-packages": true }, "extra": { "branch-alias": { - "dev-master": "6.5-dev" + "dev-master": "7.4-dev" } }, "autoload": { diff --git a/lib/guzzlehttp/guzzle/src/BodySummarizer.php b/lib/guzzlehttp/guzzle/src/BodySummarizer.php new file mode 100644 index 000000000..6eca94ef9 --- /dev/null +++ b/lib/guzzlehttp/guzzle/src/BodySummarizer.php @@ -0,0 +1,28 @@ +truncateAt = $truncateAt; + } + + /** + * Returns a summarized message body. + */ + public function summarize(MessageInterface $message): ?string + { + return $this->truncateAt === null + ? \GuzzleHttp\Psr7\Message::bodySummary($message) + : \GuzzleHttp\Psr7\Message::bodySummary($message, $this->truncateAt); + } +} diff --git a/lib/guzzlehttp/guzzle/src/BodySummarizerInterface.php b/lib/guzzlehttp/guzzle/src/BodySummarizerInterface.php new file mode 100644 index 000000000..3e02e036e --- /dev/null +++ b/lib/guzzlehttp/guzzle/src/BodySummarizerInterface.php @@ -0,0 +1,13 @@ +configureDefaults($config); @@ -79,19 +74,21 @@ class Client implements ClientInterface * @param string $method * @param array $args * - * @return Promise\PromiseInterface + * @return PromiseInterface|ResponseInterface + * + * @deprecated Client::__call will be removed in guzzlehttp/guzzle:8.0. */ public function __call($method, $args) { - if (count($args) < 1) { - throw new \InvalidArgumentException('Magic request methods require a URI and optional options array'); + if (\count($args) < 1) { + throw new InvalidArgumentException('Magic request methods require a URI and optional options array'); } $uri = $args[0]; - $opts = isset($args[1]) ? $args[1] : []; + $opts = $args[1] ?? []; - return substr($method, -5) === 'Async' - ? $this->requestAsync(substr($method, 0, -5), $uri, $opts) + return \substr($method, -5) === 'Async' + ? $this->requestAsync(\substr($method, 0, -5), $uri, $opts) : $this->request($method, $uri, $opts); } @@ -100,10 +97,8 @@ class Client implements ClientInterface * * @param array $options Request options to apply to the given * request and to the transfer. See \GuzzleHttp\RequestOptions. - * - * @return Promise\PromiseInterface */ - public function sendAsync(RequestInterface $request, array $options = []) + public function sendAsync(RequestInterface $request, array $options = []): PromiseInterface { // Merge the base URI into the request URI if needed. $options = $this->prepareDefaults($options); @@ -120,15 +115,28 @@ class Client implements ClientInterface * @param array $options Request options to apply to the given * request and to the transfer. See \GuzzleHttp\RequestOptions. * - * @return ResponseInterface * @throws GuzzleException */ - public function send(RequestInterface $request, array $options = []) + public function send(RequestInterface $request, array $options = []): ResponseInterface { $options[RequestOptions::SYNCHRONOUS] = true; return $this->sendAsync($request, $options)->wait(); } + /** + * The HttpClient PSR (PSR-18) specify this method. + * + * @inheritDoc + */ + public function sendRequest(RequestInterface $request): ResponseInterface + { + $options[RequestOptions::SYNCHRONOUS] = true; + $options[RequestOptions::ALLOW_REDIRECTS] = false; + $options[RequestOptions::HTTP_ERRORS] = false; + + return $this->sendAsync($request, $options)->wait(); + } + /** * Create and send an asynchronous HTTP request. * @@ -140,20 +148,18 @@ class Client implements ClientInterface * @param string $method HTTP method * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. - * - * @return Promise\PromiseInterface */ - public function requestAsync($method, $uri = '', array $options = []) + public function requestAsync(string $method, $uri = '', array $options = []): PromiseInterface { $options = $this->prepareDefaults($options); // Remove request modifying parameter because it can be done up-front. - $headers = isset($options['headers']) ? $options['headers'] : []; - $body = isset($options['body']) ? $options['body'] : null; - $version = isset($options['version']) ? $options['version'] : '1.1'; + $headers = $options['headers'] ?? []; + $body = $options['body'] ?? null; + $version = $options['version'] ?? '1.1'; // Merge the URI into the base URI. - $uri = $this->buildUri($uri, $options); - if (is_array($body)) { - $this->invalidBody(); + $uri = $this->buildUri(Psr7\Utils::uriFor($uri), $options); + if (\is_array($body)) { + throw $this->invalidBody(); } $request = new Psr7\Request($method, $uri, $headers, $body, $version); // Remove the option so that they are not doubly-applied. @@ -173,10 +179,9 @@ class Client implements ClientInterface * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. * - * @return ResponseInterface * @throws GuzzleException */ - public function request($method, $uri = '', array $options = []) + public function request(string $method, $uri = '', array $options = []): ResponseInterface { $options[RequestOptions::SYNCHRONOUS] = true; return $this->requestAsync($method, $uri, $options)->wait(); @@ -192,30 +197,24 @@ class Client implements ClientInterface * @param string|null $option The config option to retrieve. * * @return mixed + * + * @deprecated Client::getConfig will be removed in guzzlehttp/guzzle:8.0. */ - public function getConfig($option = null) + public function getConfig(?string $option = null) { return $option === null ? $this->config - : (isset($this->config[$option]) ? $this->config[$option] : null); + : ($this->config[$option] ?? null); } - /** - * @param string|null $uri - * - * @return UriInterface - */ - private function buildUri($uri, array $config) + private function buildUri(UriInterface $uri, array $config): UriInterface { - // for BC we accept null which would otherwise fail in uri_for - $uri = Psr7\uri_for($uri === null ? '' : $uri); - if (isset($config['base_uri'])) { - $uri = Psr7\UriResolver::resolve(Psr7\uri_for($config['base_uri']), $uri); + $uri = Psr7\UriResolver::resolve(Psr7\Utils::uriFor($config['base_uri']), $uri); } if (isset($config['idn_conversion']) && ($config['idn_conversion'] !== false)) { - $idnOptions = ($config['idn_conversion'] === true) ? IDNA_DEFAULT : $config['idn_conversion']; + $idnOptions = ($config['idn_conversion'] === true) ? \IDNA_DEFAULT : $config['idn_conversion']; $uri = Utils::idnUriConvert($uri, $idnOptions); } @@ -224,11 +223,8 @@ class Client implements ClientInterface /** * Configures the default options for a client. - * - * @param array $config - * @return void */ - private function configureDefaults(array $config) + private function configureDefaults(array $config): void { $defaults = [ 'allow_redirects' => RedirectMiddleware::$defaultSettings, @@ -236,7 +232,7 @@ class Client implements ClientInterface 'decode_content' => true, 'verify' => true, 'cookies' => false, - 'idn_conversion' => true, + 'idn_conversion' => false, ]; // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set. @@ -244,17 +240,17 @@ class Client implements ClientInterface // We can only trust the HTTP_PROXY environment variable in a CLI // process due to the fact that PHP has no reliable mechanism to // get environment variables that start with "HTTP_". - if (php_sapi_name() === 'cli' && getenv('HTTP_PROXY')) { - $defaults['proxy']['http'] = getenv('HTTP_PROXY'); + if (\PHP_SAPI === 'cli' && ($proxy = Utils::getenv('HTTP_PROXY'))) { + $defaults['proxy']['http'] = $proxy; } - if ($proxy = getenv('HTTPS_PROXY')) { + if ($proxy = Utils::getenv('HTTPS_PROXY')) { $defaults['proxy']['https'] = $proxy; } - if ($noProxy = getenv('NO_PROXY')) { - $cleanedNoProxy = str_replace(' ', '', $noProxy); - $defaults['proxy']['no'] = explode(',', $cleanedNoProxy); + if ($noProxy = Utils::getenv('NO_PROXY')) { + $cleanedNoProxy = \str_replace(' ', '', $noProxy); + $defaults['proxy']['no'] = \explode(',', $cleanedNoProxy); } $this->config = $config + $defaults; @@ -265,15 +261,15 @@ class Client implements ClientInterface // Add the default user-agent header. if (!isset($this->config['headers'])) { - $this->config['headers'] = ['User-Agent' => default_user_agent()]; + $this->config['headers'] = ['User-Agent' => Utils::defaultUserAgent()]; } else { // Add the User-Agent header if one was not already set. - foreach (array_keys($this->config['headers']) as $name) { - if (strtolower($name) === 'user-agent') { + foreach (\array_keys($this->config['headers']) as $name) { + if (\strtolower($name) === 'user-agent') { return; } } - $this->config['headers']['User-Agent'] = default_user_agent(); + $this->config['headers']['User-Agent'] = Utils::defaultUserAgent(); } } @@ -281,10 +277,8 @@ class Client implements ClientInterface * Merges default options into the array. * * @param array $options Options to modify by reference - * - * @return array */ - private function prepareDefaults(array $options) + private function prepareDefaults(array $options): array { $defaults = $this->config; @@ -296,13 +290,13 @@ class Client implements ClientInterface // Special handling for headers is required as they are added as // conditional headers and as headers passed to a request ctor. - if (array_key_exists('headers', $options)) { + if (\array_key_exists('headers', $options)) { // Allows default headers to be unset. if ($options['headers'] === null) { $defaults['_conditional'] = []; unset($options['headers']); - } elseif (!is_array($options['headers'])) { - throw new \InvalidArgumentException('headers must be an array'); + } elseif (!\is_array($options['headers'])) { + throw new InvalidArgumentException('headers must be an array'); } } @@ -326,65 +320,49 @@ class Client implements ClientInterface * as-is without merging in default options. * * @param array $options See \GuzzleHttp\RequestOptions. - * - * @return Promise\PromiseInterface */ - private function transfer(RequestInterface $request, array $options) + private function transfer(RequestInterface $request, array $options): PromiseInterface { - // save_to -> sink - if (isset($options['save_to'])) { - $options['sink'] = $options['save_to']; - unset($options['save_to']); - } - - // exceptions -> http_errors - if (isset($options['exceptions'])) { - $options['http_errors'] = $options['exceptions']; - unset($options['exceptions']); - } - $request = $this->applyOptions($request, $options); /** @var HandlerStack $handler */ $handler = $options['handler']; try { - return Promise\promise_for($handler($request, $options)); + return P\Create::promiseFor($handler($request, $options)); } catch (\Exception $e) { - return Promise\rejection_for($e); + return P\Create::rejectionFor($e); } } /** * Applies the array of request options to a request. - * - * @param RequestInterface $request - * @param array $options - * - * @return RequestInterface */ - private function applyOptions(RequestInterface $request, array &$options) + private function applyOptions(RequestInterface $request, array &$options): RequestInterface { $modify = [ 'set_headers' => [], ]; if (isset($options['headers'])) { + if (array_keys($options['headers']) === range(0, count($options['headers']) - 1)) { + throw new InvalidArgumentException('The headers array must have header name as keys.'); + } $modify['set_headers'] = $options['headers']; unset($options['headers']); } if (isset($options['form_params'])) { if (isset($options['multipart'])) { - throw new \InvalidArgumentException('You cannot use ' + throw new InvalidArgumentException('You cannot use ' . 'form_params and multipart at the same time. Use the ' . 'form_params option if you want to send application/' . 'x-www-form-urlencoded requests, and the multipart ' . 'option to send multipart/form-data requests.'); } - $options['body'] = http_build_query($options['form_params'], '', '&'); + $options['body'] = \http_build_query($options['form_params'], '', '&'); unset($options['form_params']); // Ensure that we don't have the header in different case and set the new value. - $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); + $options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded'; } @@ -394,10 +372,10 @@ class Client implements ClientInterface } if (isset($options['json'])) { - $options['body'] = \GuzzleHttp\json_encode($options['json']); + $options['body'] = Utils::jsonEncode($options['json']); unset($options['json']); // Ensure that we don't have the header in different case and set the new value. - $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); + $options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'application/json'; } @@ -405,47 +383,47 @@ class Client implements ClientInterface && $options['decode_content'] !== true ) { // Ensure that we don't have the header in different case and set the new value. - $options['_conditional'] = Psr7\_caseless_remove(['Accept-Encoding'], $options['_conditional']); + $options['_conditional'] = Psr7\Utils::caselessRemove(['Accept-Encoding'], $options['_conditional']); $modify['set_headers']['Accept-Encoding'] = $options['decode_content']; } if (isset($options['body'])) { - if (is_array($options['body'])) { - $this->invalidBody(); + if (\is_array($options['body'])) { + throw $this->invalidBody(); } - $modify['body'] = Psr7\stream_for($options['body']); + $modify['body'] = Psr7\Utils::streamFor($options['body']); unset($options['body']); } - if (!empty($options['auth']) && is_array($options['auth'])) { + if (!empty($options['auth']) && \is_array($options['auth'])) { $value = $options['auth']; - $type = isset($value[2]) ? strtolower($value[2]) : 'basic'; + $type = isset($value[2]) ? \strtolower($value[2]) : 'basic'; switch ($type) { case 'basic': // Ensure that we don't have the header in different case and set the new value. - $modify['set_headers'] = Psr7\_caseless_remove(['Authorization'], $modify['set_headers']); + $modify['set_headers'] = Psr7\Utils::caselessRemove(['Authorization'], $modify['set_headers']); $modify['set_headers']['Authorization'] = 'Basic ' - . base64_encode("$value[0]:$value[1]"); + . \base64_encode("$value[0]:$value[1]"); break; case 'digest': // @todo: Do not rely on curl - $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_DIGEST; - $options['curl'][CURLOPT_USERPWD] = "$value[0]:$value[1]"; + $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_DIGEST; + $options['curl'][\CURLOPT_USERPWD] = "$value[0]:$value[1]"; break; case 'ntlm': - $options['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_NTLM; - $options['curl'][CURLOPT_USERPWD] = "$value[0]:$value[1]"; + $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_NTLM; + $options['curl'][\CURLOPT_USERPWD] = "$value[0]:$value[1]"; break; } } if (isset($options['query'])) { $value = $options['query']; - if (is_array($value)) { - $value = http_build_query($value, null, '&', PHP_QUERY_RFC3986); + if (\is_array($value)) { + $value = \http_build_query($value, '', '&', \PHP_QUERY_RFC3986); } - if (!is_string($value)) { - throw new \InvalidArgumentException('query must be a string or array'); + if (!\is_string($value)) { + throw new InvalidArgumentException('query must be a string or array'); } $modify['query'] = $value; unset($options['query']); @@ -454,16 +432,16 @@ class Client implements ClientInterface // Ensure that sink is not an invalid value. if (isset($options['sink'])) { // TODO: Add more sink validation? - if (is_bool($options['sink'])) { - throw new \InvalidArgumentException('sink must not be a boolean'); + if (\is_bool($options['sink'])) { + throw new InvalidArgumentException('sink must not be a boolean'); } } - $request = Psr7\modify_request($request, $modify); + $request = Psr7\Utils::modifyRequest($request, $modify); if ($request->getBody() instanceof Psr7\MultipartStream) { // Use a multipart/form-data POST if a Content-Type is not set. // Ensure that we don't have the header in different case and set the new value. - $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); + $options['_conditional'] = Psr7\Utils::caselessRemove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary=' . $request->getBody()->getBoundary(); } @@ -477,7 +455,7 @@ class Client implements ClientInterface $modify['set_headers'][$k] = $v; } } - $request = Psr7\modify_request($request, $modify); + $request = Psr7\Utils::modifyRequest($request, $modify); // Don't pass this internal value along to middleware/handlers. unset($options['_conditional']); } @@ -486,14 +464,12 @@ class Client implements ClientInterface } /** - * Throw Exception with pre-set message. - * @return void - * @throws \InvalidArgumentException Invalid body. + * Return an InvalidArgumentException with pre-set message. */ - private function invalidBody() + private function invalidBody(): InvalidArgumentException { - throw new \InvalidArgumentException('Passing in the "body" request ' - . 'option as an array to send a POST request has been deprecated. ' + return new InvalidArgumentException('Passing in the "body" request ' + . 'option as an array to send a request is not supported. ' . 'Please use the "form_params" request option to send a ' . 'application/x-www-form-urlencoded request, or the "multipart" ' . 'request option to send a multipart/form-data request.'); diff --git a/lib/guzzlehttp/guzzle/src/ClientInterface.php b/lib/guzzlehttp/guzzle/src/ClientInterface.php index 638b75dca..6aaee61af 100644 --- a/lib/guzzlehttp/guzzle/src/ClientInterface.php +++ b/lib/guzzlehttp/guzzle/src/ClientInterface.php @@ -1,4 +1,5 @@ request('GET', $uri, $options); + } + + /** + * Create and send an HTTP HEAD request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + * + * @throws GuzzleException + */ + public function head($uri, array $options = []): ResponseInterface + { + return $this->request('HEAD', $uri, $options); + } + + /** + * Create and send an HTTP PUT request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + * + * @throws GuzzleException + */ + public function put($uri, array $options = []): ResponseInterface + { + return $this->request('PUT', $uri, $options); + } + + /** + * Create and send an HTTP POST request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + * + * @throws GuzzleException + */ + public function post($uri, array $options = []): ResponseInterface + { + return $this->request('POST', $uri, $options); + } + + /** + * Create and send an HTTP PATCH request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + * + * @throws GuzzleException + */ + public function patch($uri, array $options = []): ResponseInterface + { + return $this->request('PATCH', $uri, $options); + } + + /** + * Create and send an HTTP DELETE request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + * + * @throws GuzzleException + */ + public function delete($uri, array $options = []): ResponseInterface + { + return $this->request('DELETE', $uri, $options); + } + + /** + * Create and send an asynchronous HTTP request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string $method HTTP method + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + */ + abstract public function requestAsync(string $method, $uri, array $options = []): PromiseInterface; + + /** + * Create and send an asynchronous HTTP GET request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + */ + public function getAsync($uri, array $options = []): PromiseInterface + { + return $this->requestAsync('GET', $uri, $options); + } + + /** + * Create and send an asynchronous HTTP HEAD request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + */ + public function headAsync($uri, array $options = []): PromiseInterface + { + return $this->requestAsync('HEAD', $uri, $options); + } + + /** + * Create and send an asynchronous HTTP PUT request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + */ + public function putAsync($uri, array $options = []): PromiseInterface + { + return $this->requestAsync('PUT', $uri, $options); + } + + /** + * Create and send an asynchronous HTTP POST request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + */ + public function postAsync($uri, array $options = []): PromiseInterface + { + return $this->requestAsync('POST', $uri, $options); + } + + /** + * Create and send an asynchronous HTTP PATCH request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + */ + public function patchAsync($uri, array $options = []): PromiseInterface + { + return $this->requestAsync('PATCH', $uri, $options); + } + + /** + * Create and send an asynchronous HTTP DELETE request. + * + * Use an absolute path to override the base path of the client, or a + * relative path to append to the base path of the client. The URL can + * contain the query string as well. Use an array to provide a URL + * template and additional variables to use in the URL template expansion. + * + * @param string|UriInterface $uri URI object or string. + * @param array $options Request options to apply. + */ + public function deleteAsync($uri, array $options = []): PromiseInterface + { + return $this->requestAsync('DELETE', $uri, $options); + } +} diff --git a/lib/guzzlehttp/guzzle/src/Cookie/CookieJar.php b/lib/guzzlehttp/guzzle/src/Cookie/CookieJar.php index 394df3a7c..6ef8e8c1d 100644 --- a/lib/guzzlehttp/guzzle/src/Cookie/CookieJar.php +++ b/lib/guzzlehttp/guzzle/src/Cookie/CookieJar.php @@ -1,4 +1,5 @@ strictMode = $strictMode; @@ -39,10 +44,8 @@ class CookieJar implements CookieJarInterface * * @param array $cookies Cookies to create the jar from * @param string $domain Domain to set the cookies to - * - * @return self */ - public static function fromArray(array $cookies, $domain) + public static function fromArray(array $cookies, string $domain): self { $cookieJar = new self(); foreach ($cookies as $name => $value) { @@ -57,26 +60,15 @@ class CookieJar implements CookieJarInterface return $cookieJar; } - /** - * @deprecated - */ - public static function getCookieValue($value) - { - return $value; - } - /** * Evaluate if this cookie should be persisted to storage * that survives between requests. * - * @param SetCookie $cookie Being evaluated. - * @param bool $allowSessionCookies If we should persist session cookies - * @return bool + * @param SetCookie $cookie Being evaluated. + * @param bool $allowSessionCookies If we should persist session cookies */ - public static function shouldPersist( - SetCookie $cookie, - $allowSessionCookies = false - ) { + public static function shouldPersist(SetCookie $cookie, bool $allowSessionCookies = false): bool + { if ($cookie->getExpires() || $allowSessionCookies) { if (!$cookie->getDiscard()) { return true; @@ -90,16 +82,13 @@ class CookieJar implements CookieJarInterface * Finds and returns the cookie based on the name * * @param string $name cookie name to search for + * * @return SetCookie|null cookie that was found or null if not found */ - public function getCookieByName($name) + public function getCookieByName(string $name): ?SetCookie { - // don't allow a non string name - if ($name === null || !is_scalar($name)) { - return null; - } foreach ($this->cookies as $cookie) { - if ($cookie->getName() !== null && strcasecmp($cookie->getName(), $name) === 0) { + if ($cookie->getName() !== null && \strcasecmp($cookie->getName(), $name) === 0) { return $cookie; } } @@ -107,37 +96,43 @@ class CookieJar implements CookieJarInterface return null; } - public function toArray() + /** + * @inheritDoc + */ + public function toArray(): array { - return array_map(function (SetCookie $cookie) { + return \array_map(static function (SetCookie $cookie): array { return $cookie->toArray(); }, $this->getIterator()->getArrayCopy()); } - public function clear($domain = null, $path = null, $name = null) + /** + * @inheritDoc + */ + public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void { if (!$domain) { $this->cookies = []; return; } elseif (!$path) { - $this->cookies = array_filter( + $this->cookies = \array_filter( $this->cookies, - function (SetCookie $cookie) use ($domain) { + static function (SetCookie $cookie) use ($domain): bool { return !$cookie->matchesDomain($domain); } ); } elseif (!$name) { - $this->cookies = array_filter( + $this->cookies = \array_filter( $this->cookies, - function (SetCookie $cookie) use ($path, $domain) { + static function (SetCookie $cookie) use ($path, $domain): bool { return !($cookie->matchesPath($path) && $cookie->matchesDomain($domain)); } ); } else { - $this->cookies = array_filter( + $this->cookies = \array_filter( $this->cookies, - function (SetCookie $cookie) use ($path, $domain, $name) { + static function (SetCookie $cookie) use ($path, $domain, $name) { return !($cookie->getName() == $name && $cookie->matchesPath($path) && $cookie->matchesDomain($domain)); @@ -146,17 +141,23 @@ class CookieJar implements CookieJarInterface } } - public function clearSessionCookies() + /** + * @inheritDoc + */ + public function clearSessionCookies(): void { - $this->cookies = array_filter( + $this->cookies = \array_filter( $this->cookies, - function (SetCookie $cookie) { + static function (SetCookie $cookie): bool { return !$cookie->getDiscard() && $cookie->getExpires(); } ); } - public function setCookie(SetCookie $cookie) + /** + * @inheritDoc + */ + public function setCookie(SetCookie $cookie): bool { // If the name string is empty (but not 0), ignore the set-cookie // string entirely. @@ -170,10 +171,9 @@ class CookieJar implements CookieJarInterface if ($result !== true) { if ($this->strictMode) { throw new \RuntimeException('Invalid cookie: ' . $result); - } else { - $this->removeCookieIfEmpty($cookie); - return false; } + $this->removeCookieIfEmpty($cookie); + return false; } // Resolve conflicts with previously set cookies @@ -217,27 +217,28 @@ class CookieJar implements CookieJarInterface return true; } - public function count() + public function count(): int { - return count($this->cookies); + return \count($this->cookies); } - public function getIterator() + /** + * @return \ArrayIterator + */ + public function getIterator(): \ArrayIterator { - return new \ArrayIterator(array_values($this->cookies)); + return new \ArrayIterator(\array_values($this->cookies)); } - public function extractCookies( - RequestInterface $request, - ResponseInterface $response - ) { + public function extractCookies(RequestInterface $request, ResponseInterface $response): void + { if ($cookieHeader = $response->getHeader('Set-Cookie')) { foreach ($cookieHeader as $cookie) { $sc = SetCookie::fromString($cookie); if (!$sc->getDomain()) { $sc->setDomain($request->getUri()->getHost()); } - if (0 !== strpos($sc->getPath(), '/')) { + if (0 !== \strpos($sc->getPath(), '/')) { $sc->setPath($this->getCookiePathFromRequest($request)); } if (!$sc->matchesDomain($request->getUri()->getHost())) { @@ -254,30 +255,28 @@ class CookieJar implements CookieJarInterface * Computes cookie path following RFC 6265 section 5.1.4 * * @link https://tools.ietf.org/html/rfc6265#section-5.1.4 - * - * @param RequestInterface $request - * @return string */ - private function getCookiePathFromRequest(RequestInterface $request) + private function getCookiePathFromRequest(RequestInterface $request): string { $uriPath = $request->getUri()->getPath(); - if ('' === $uriPath) { + if ('' === $uriPath) { return '/'; } - if (0 !== strpos($uriPath, '/')) { + if (0 !== \strpos($uriPath, '/')) { return '/'; } if ('/' === $uriPath) { return '/'; } - if (0 === $lastSlashPos = strrpos($uriPath, '/')) { + $lastSlashPos = \strrpos($uriPath, '/'); + if (0 === $lastSlashPos || false === $lastSlashPos) { return '/'; } - return substr($uriPath, 0, $lastSlashPos); + return \substr($uriPath, 0, $lastSlashPos); } - public function withCookieHeader(RequestInterface $request) + public function withCookieHeader(RequestInterface $request): RequestInterface { $values = []; $uri = $request->getUri(); @@ -297,17 +296,15 @@ class CookieJar implements CookieJarInterface } return $values - ? $request->withHeader('Cookie', implode('; ', $values)) + ? $request->withHeader('Cookie', \implode('; ', $values)) : $request; } /** * If a cookie already exists and the server asks to set it again with a * null value, the cookie must be deleted. - * - * @param SetCookie $cookie */ - private function removeCookieIfEmpty(SetCookie $cookie) + private function removeCookieIfEmpty(SetCookie $cookie): void { $cookieValue = $cookie->getValue(); if ($cookieValue === null || $cookieValue === '') { diff --git a/lib/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php b/lib/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php index 6ee11885e..7df374b5b 100644 --- a/lib/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php +++ b/lib/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php @@ -1,4 +1,5 @@ */ interface CookieJarInterface extends \Countable, \IteratorAggregate { @@ -26,7 +28,7 @@ interface CookieJarInterface extends \Countable, \IteratorAggregate * * @return RequestInterface returns the modified request. */ - public function withCookieHeader(RequestInterface $request); + public function withCookieHeader(RequestInterface $request): RequestInterface; /** * Extract cookies from an HTTP response and store them in the CookieJar. @@ -34,10 +36,7 @@ interface CookieJarInterface extends \Countable, \IteratorAggregate * @param RequestInterface $request Request that was sent * @param ResponseInterface $response Response that was received */ - public function extractCookies( - RequestInterface $request, - ResponseInterface $response - ); + public function extractCookies(RequestInterface $request, ResponseInterface $response): void; /** * Sets a cookie in the cookie jar. @@ -46,7 +45,7 @@ interface CookieJarInterface extends \Countable, \IteratorAggregate * * @return bool Returns true on success or false on failure */ - public function setCookie(SetCookie $cookie); + public function setCookie(SetCookie $cookie): bool; /** * Remove cookies currently held in the cookie jar. @@ -61,10 +60,8 @@ interface CookieJarInterface extends \Countable, \IteratorAggregate * @param string|null $domain Clears cookies matching a domain * @param string|null $path Clears cookies matching a domain and path * @param string|null $name Clears cookies matching a domain, path, and name - * - * @return CookieJarInterface */ - public function clear($domain = null, $path = null, $name = null); + public function clear(?string $domain = null, ?string $path = null, ?string $name = null): void; /** * Discard all sessions cookies. @@ -73,12 +70,10 @@ interface CookieJarInterface extends \Countable, \IteratorAggregate * field set to true. To be called when the user agent shuts down according * to RFC 2965. */ - public function clearSessionCookies(); + public function clearSessionCookies(): void; /** * Converts the cookie jar to an array. - * - * @return array */ - public function toArray(); + public function toArray(): array; } diff --git a/lib/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php b/lib/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php index 3fb8600ef..290236d54 100644 --- a/lib/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php +++ b/lib/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php @@ -1,33 +1,40 @@ filename = $cookieFile; $this->storeSessionCookies = $storeSessionCookies; - if (file_exists($cookieFile)) { + if (\file_exists($cookieFile)) { $this->load($cookieFile); } } @@ -44,20 +51,21 @@ class FileCookieJar extends CookieJar * Saves the cookies to a file. * * @param string $filename File to save + * * @throws \RuntimeException if the file cannot be found or created */ - public function save($filename) + public function save(string $filename): void { $json = []; + /** @var SetCookie $cookie */ foreach ($this as $cookie) { - /** @var SetCookie $cookie */ if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { $json[] = $cookie->toArray(); } } - $jsonStr = \GuzzleHttp\json_encode($json); - if (false === file_put_contents($filename, $jsonStr, LOCK_EX)) { + $jsonStr = Utils::jsonEncode($json); + if (false === \file_put_contents($filename, $jsonStr, \LOCK_EX)) { throw new \RuntimeException("Unable to save file {$filename}"); } } @@ -68,23 +76,25 @@ class FileCookieJar extends CookieJar * Old cookies are kept unless overwritten by newly loaded ones. * * @param string $filename Cookie file to load. + * * @throws \RuntimeException if the file cannot be loaded. */ - public function load($filename) + public function load(string $filename): void { - $json = file_get_contents($filename); + $json = \file_get_contents($filename); if (false === $json) { throw new \RuntimeException("Unable to load file {$filename}"); - } elseif ($json === '') { + } + if ($json === '') { return; } - $data = \GuzzleHttp\json_decode($json, true); - if (is_array($data)) { - foreach (json_decode($json, true) as $cookie) { + $data = Utils::jsonDecode($json, true); + if (\is_array($data)) { + foreach ($data as $cookie) { $this->setCookie(new SetCookie($cookie)); } - } elseif (strlen($data)) { + } elseif (\is_scalar($data) && !empty($data)) { throw new \RuntimeException("Invalid cookie file: {$filename}"); } } diff --git a/lib/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php b/lib/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php index 0224a2447..5d51ca982 100644 --- a/lib/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php +++ b/lib/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php @@ -1,4 +1,5 @@ sessionKey = $sessionKey; @@ -39,33 +44,33 @@ class SessionCookieJar extends CookieJar /** * Save cookies to the client session */ - public function save() + public function save(): void { $json = []; + /** @var SetCookie $cookie */ foreach ($this as $cookie) { - /** @var SetCookie $cookie */ if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { $json[] = $cookie->toArray(); } } - $_SESSION[$this->sessionKey] = json_encode($json); + $_SESSION[$this->sessionKey] = \json_encode($json); } /** * Load the contents of the client session into the data array */ - protected function load() + protected function load(): void { if (!isset($_SESSION[$this->sessionKey])) { return; } - $data = json_decode($_SESSION[$this->sessionKey], true); - if (is_array($data)) { + $data = \json_decode($_SESSION[$this->sessionKey], true); + if (\is_array($data)) { foreach ($data as $cookie) { $this->setCookie(new SetCookie($cookie)); } - } elseif (strlen($data)) { + } elseif (\strlen($data)) { throw new \RuntimeException("Invalid cookie data"); } } diff --git a/lib/guzzlehttp/guzzle/src/Cookie/SetCookie.php b/lib/guzzlehttp/guzzle/src/Cookie/SetCookie.php index 55f6901a7..a613c77bf 100644 --- a/lib/guzzlehttp/guzzle/src/Cookie/SetCookie.php +++ b/lib/guzzlehttp/guzzle/src/Cookie/SetCookie.php @@ -1,4 +1,5 @@ null, 'Value' => null, @@ -19,42 +22,42 @@ class SetCookie 'HttpOnly' => false ]; - /** @var array Cookie data */ + /** + * @var array Cookie data + */ private $data; /** - * Create a new SetCookie object from a string + * Create a new SetCookie object from a string. * * @param string $cookie Set-Cookie header string - * - * @return self */ - public static function fromString($cookie) + public static function fromString(string $cookie): self { // Create the default return array $data = self::$defaults; // Explode the cookie string using a series of semicolons - $pieces = array_filter(array_map('trim', explode(';', $cookie))); + $pieces = \array_filter(\array_map('trim', \explode(';', $cookie))); // The name of the cookie (first kvp) must exist and include an equal sign. - if (empty($pieces[0]) || !strpos($pieces[0], '=')) { + if (!isset($pieces[0]) || \strpos($pieces[0], '=') === false) { return new self($data); } // Add the cookie pieces into the parsed data array foreach ($pieces as $part) { - $cookieParts = explode('=', $part, 2); - $key = trim($cookieParts[0]); + $cookieParts = \explode('=', $part, 2); + $key = \trim($cookieParts[0]); $value = isset($cookieParts[1]) - ? trim($cookieParts[1], " \n\r\t\0\x0B") + ? \trim($cookieParts[1], " \n\r\t\0\x0B") : true; // Only check for non-cookies when cookies have been found - if (empty($data['Name'])) { + if (!isset($data['Name'])) { $data['Name'] = $key; $data['Value'] = $value; } else { - foreach (array_keys(self::$defaults) as $search) { - if (!strcasecmp($search, $key)) { + foreach (\array_keys(self::$defaults) as $search) { + if (!\strcasecmp($search, $key)) { $data[$search] = $value; continue 2; } @@ -71,39 +74,45 @@ class SetCookie */ public function __construct(array $data = []) { - $this->data = array_replace(self::$defaults, $data); + /** @var array|null $replaced will be null in case of replace error */ + $replaced = \array_replace(self::$defaults, $data); + if ($replaced === null) { + throw new \InvalidArgumentException('Unable to replace the default values for the Cookie.'); + } + + $this->data = $replaced; // Extract the Expires value and turn it into a UNIX timestamp if needed if (!$this->getExpires() && $this->getMaxAge()) { // Calculate the Expires date - $this->setExpires(time() + $this->getMaxAge()); - } elseif ($this->getExpires() && !is_numeric($this->getExpires())) { - $this->setExpires($this->getExpires()); + $this->setExpires(\time() + $this->getMaxAge()); + } elseif (null !== ($expires = $this->getExpires()) && !\is_numeric($expires)) { + $this->setExpires($expires); } } public function __toString() { - $str = $this->data['Name'] . '=' . $this->data['Value'] . '; '; + $str = $this->data['Name'] . '=' . ($this->data['Value'] ?? '') . '; '; foreach ($this->data as $k => $v) { if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== false) { if ($k === 'Expires') { - $str .= 'Expires=' . gmdate('D, d M Y H:i:s \G\M\T', $v) . '; '; + $str .= 'Expires=' . \gmdate('D, d M Y H:i:s \G\M\T', $v) . '; '; } else { $str .= ($v === true ? $k : "{$k}={$v}") . '; '; } } } - return rtrim($str, '; '); + return \rtrim($str, '; '); } - public function toArray() + public function toArray(): array { return $this->data; } /** - * Get the cookie name + * Get the cookie name. * * @return string */ @@ -113,19 +122,23 @@ class SetCookie } /** - * Set the cookie name + * Set the cookie name. * * @param string $name Cookie name */ - public function setName($name) + public function setName($name): void { - $this->data['Name'] = $name; + if (!is_string($name)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Name'] = (string) $name; } /** - * Get the cookie value + * Get the cookie value. * - * @return string + * @return string|null */ public function getValue() { @@ -133,17 +146,21 @@ class SetCookie } /** - * Set the cookie value + * Set the cookie value. * * @param string $value Cookie value */ - public function setValue($value) + public function setValue($value): void { - $this->data['Value'] = $value; + if (!is_string($value)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Value'] = (string) $value; } /** - * Get the domain + * Get the domain. * * @return string|null */ @@ -153,17 +170,21 @@ class SetCookie } /** - * Set the domain of the cookie + * Set the domain of the cookie. * - * @param string $domain + * @param string|null $domain */ - public function setDomain($domain) + public function setDomain($domain): void { - $this->data['Domain'] = $domain; + if (!is_string($domain) && null !== $domain) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Domain'] = null === $domain ? null : (string) $domain; } /** - * Get the path + * Get the path. * * @return string */ @@ -173,39 +194,47 @@ class SetCookie } /** - * Set the path of the cookie + * Set the path of the cookie. * * @param string $path Path of the cookie */ - public function setPath($path) + public function setPath($path): void { - $this->data['Path'] = $path; + if (!is_string($path)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Path'] = (string) $path; } /** - * Maximum lifetime of the cookie in seconds + * Maximum lifetime of the cookie in seconds. * * @return int|null */ public function getMaxAge() { - return $this->data['Max-Age']; + return null === $this->data['Max-Age'] ? null : (int) $this->data['Max-Age']; } /** - * Set the max-age of the cookie + * Set the max-age of the cookie. * - * @param int $maxAge Max age of the cookie in seconds + * @param int|null $maxAge Max age of the cookie in seconds */ - public function setMaxAge($maxAge) + public function setMaxAge($maxAge): void { - $this->data['Max-Age'] = $maxAge; + if (!is_int($maxAge) && null !== $maxAge) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Max-Age'] = $maxAge === null ? null : (int) $maxAge; } /** - * The UNIX timestamp when the cookie Expires + * The UNIX timestamp when the cookie Expires. * - * @return mixed + * @return string|int|null */ public function getExpires() { @@ -213,21 +242,23 @@ class SetCookie } /** - * Set the unix timestamp for which the cookie will expire + * Set the unix timestamp for which the cookie will expire. * - * @param int $timestamp Unix timestamp + * @param int|string|null $timestamp Unix timestamp or any English textual datetime description. */ - public function setExpires($timestamp) + public function setExpires($timestamp): void { - $this->data['Expires'] = is_numeric($timestamp) - ? (int) $timestamp - : strtotime($timestamp); + if (!is_int($timestamp) && !is_string($timestamp) && null !== $timestamp) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an int, string or null to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Expires'] = null === $timestamp ? null : (\is_numeric($timestamp) ? (int) $timestamp : \strtotime((string) $timestamp)); } /** - * Get whether or not this is a secure cookie + * Get whether or not this is a secure cookie. * - * @return bool|null + * @return bool */ public function getSecure() { @@ -235,17 +266,21 @@ class SetCookie } /** - * Set whether or not the cookie is secure + * Set whether or not the cookie is secure. * * @param bool $secure Set to true or false if secure */ - public function setSecure($secure) + public function setSecure($secure): void { - $this->data['Secure'] = $secure; + if (!is_bool($secure)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Secure'] = (bool) $secure; } /** - * Get whether or not this is a session cookie + * Get whether or not this is a session cookie. * * @return bool|null */ @@ -255,17 +290,21 @@ class SetCookie } /** - * Set whether or not this is a session cookie + * Set whether or not this is a session cookie. * * @param bool $discard Set to true or false if this is a session cookie */ - public function setDiscard($discard) + public function setDiscard($discard): void { - $this->data['Discard'] = $discard; + if (!is_bool($discard)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['Discard'] = (bool) $discard; } /** - * Get whether or not this is an HTTP only cookie + * Get whether or not this is an HTTP only cookie. * * @return bool */ @@ -275,13 +314,17 @@ class SetCookie } /** - * Set whether or not this is an HTTP only cookie + * Set whether or not this is an HTTP only cookie. * * @param bool $httpOnly Set to true or false if this is HTTP only */ - public function setHttpOnly($httpOnly) + public function setHttpOnly($httpOnly): void { - $this->data['HttpOnly'] = $httpOnly; + if (!is_bool($httpOnly)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a bool to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + + $this->data['HttpOnly'] = (bool) $httpOnly; } /** @@ -298,10 +341,8 @@ class SetCookie * path is a %x2F ("/") character. * * @param string $requestPath Path to check against - * - * @return bool */ - public function matchesPath($requestPath) + public function matchesPath(string $requestPath): bool { $cookiePath = $this->getPath(); @@ -311,27 +352,25 @@ class SetCookie } // Ensure that the cookie-path is a prefix of the request path. - if (0 !== strpos($requestPath, $cookiePath)) { + if (0 !== \strpos($requestPath, $cookiePath)) { return false; } // Match if the last character of the cookie-path is "/" - if (substr($cookiePath, -1, 1) === '/') { + if (\substr($cookiePath, -1, 1) === '/') { return true; } // Match if the first character not included in cookie path is "/" - return substr($requestPath, strlen($cookiePath), 1) === '/'; + return \substr($requestPath, \strlen($cookiePath), 1) === '/'; } /** - * Check if the cookie matches a domain value + * Check if the cookie matches a domain value. * * @param string $domain Domain to check against - * - * @return bool */ - public function matchesDomain($domain) + public function matchesDomain(string $domain): bool { $cookieDomain = $this->getDomain(); if (null === $cookieDomain) { @@ -339,10 +378,10 @@ class SetCookie } // Remove the leading '.' as per spec in RFC 6265. - // http://tools.ietf.org/html/rfc6265#section-5.2.3 - $cookieDomain = ltrim(strtolower($cookieDomain), '.'); + // https://tools.ietf.org/html/rfc6265#section-5.2.3 + $cookieDomain = \ltrim(\strtolower($cookieDomain), '.'); - $domain = strtolower($domain); + $domain = \strtolower($domain); // Domain not set or exact match. if ('' === $cookieDomain || $domain === $cookieDomain) { @@ -350,39 +389,36 @@ class SetCookie } // Matching the subdomain according to RFC 6265. - // http://tools.ietf.org/html/rfc6265#section-5.1.3 - if (filter_var($domain, FILTER_VALIDATE_IP)) { + // https://tools.ietf.org/html/rfc6265#section-5.1.3 + if (\filter_var($domain, \FILTER_VALIDATE_IP)) { return false; } - return (bool) preg_match('/\.' . preg_quote($cookieDomain, '/') . '$/', $domain); + return (bool) \preg_match('/\.' . \preg_quote($cookieDomain, '/') . '$/', $domain); } /** - * Check if the cookie is expired - * - * @return bool + * Check if the cookie is expired. */ - public function isExpired() + public function isExpired(): bool { - return $this->getExpires() !== null && time() > $this->getExpires(); + return $this->getExpires() !== null && \time() > $this->getExpires(); } /** - * Check if the cookie is valid according to RFC 6265 + * Check if the cookie is valid according to RFC 6265. * * @return bool|string Returns true if valid or an error message if invalid */ public function validate() { - // Names must not be empty, but can be 0 $name = $this->getName(); - if (empty($name) && !is_numeric($name)) { + if ($name === '') { return 'The cookie name must not be empty'; } // Check if any of the invalid characters are present in the cookie name - if (preg_match( + if (\preg_match( '/[\x00-\x20\x22\x28-\x29\x2c\x2f\x3a-\x40\x5c\x7b\x7d\x7f]/', $name )) { @@ -391,17 +427,17 @@ class SetCookie . 'following characters: ()<>@,;:\"/?={}'; } - // Value must not be empty, but can be 0 + // Value must not be null. 0 and empty string are valid. Empty strings + // are technically against RFC 6265, but known to happen in the wild. $value = $this->getValue(); - if (empty($value) && !is_numeric($value)) { + if ($value === null) { return 'The cookie value must not be empty'; } - // Domains must not be empty, but can be 0 - // A "0" is not a valid internet domain, but may be used as server name - // in a private network. + // Domains must not be empty, but can be 0. "0" is not a valid internet + // domain, but may be used as server name in a private network. $domain = $this->getDomain(); - if (empty($domain) && !is_numeric($domain)) { + if ($domain === null || $domain === '') { return 'The cookie domain must not be empty'; } diff --git a/lib/guzzlehttp/guzzle/src/Exception/BadResponseException.php b/lib/guzzlehttp/guzzle/src/Exception/BadResponseException.php index 427d896fb..a80956c9d 100644 --- a/lib/guzzlehttp/guzzle/src/Exception/BadResponseException.php +++ b/lib/guzzlehttp/guzzle/src/Exception/BadResponseException.php @@ -1,4 +1,5 @@ request = $request; + $this->handlerContext = $handlerContext; } /** - * @return null + * Get the request that caused the exception */ - public function getResponse() + public function getRequest(): RequestInterface { - return null; + return $this->request; } /** - * @return bool + * Get contextual information about the error from the underlying handler. + * + * The contents of this array will vary depending on which handler you are + * using. It may also be just an empty array. Relying on this data will + * couple you to a specific handler, but can give more debug information + * when needed. */ - public function hasResponse() + public function getHandlerContext(): array { - return false; + return $this->handlerContext; } } diff --git a/lib/guzzlehttp/guzzle/src/Exception/GuzzleException.php b/lib/guzzlehttp/guzzle/src/Exception/GuzzleException.php index 27b2722b0..fa3ed6998 100644 --- a/lib/guzzlehttp/guzzle/src/Exception/GuzzleException.php +++ b/lib/guzzlehttp/guzzle/src/Exception/GuzzleException.php @@ -1,23 +1,9 @@ getStatusCode() - : 0; + $code = $response ? $response->getStatusCode() : 0; parent::__construct($message, $code, $previous); $this->request = $request; $this->response = $response; @@ -39,46 +46,39 @@ class RequestException extends TransferException /** * Wrap non-RequestExceptions with a RequestException - * - * @param RequestInterface $request - * @param \Exception $e - * - * @return RequestException */ - public static function wrapException(RequestInterface $request, \Exception $e) + public static function wrapException(RequestInterface $request, \Throwable $e): RequestException { - return $e instanceof RequestException - ? $e - : new RequestException($e->getMessage(), $request, null, $e); + return $e instanceof RequestException ? $e : new RequestException($e->getMessage(), $request, null, $e); } /** * Factory method to create a new exception with a normalized error message * - * @param RequestInterface $request Request - * @param ResponseInterface $response Response received - * @param \Exception $previous Previous exception - * @param array $ctx Optional handler context. - * - * @return self + * @param RequestInterface $request Request sent + * @param ResponseInterface $response Response received + * @param \Throwable|null $previous Previous exception + * @param array $handlerContext Optional handler context + * @param BodySummarizerInterface|null $bodySummarizer Optional body summarizer */ public static function create( RequestInterface $request, ResponseInterface $response = null, - \Exception $previous = null, - array $ctx = [] - ) { + \Throwable $previous = null, + array $handlerContext = [], + BodySummarizerInterface $bodySummarizer = null + ): self { if (!$response) { return new self( 'Error completing request', $request, null, $previous, - $ctx + $handlerContext ); } - $level = (int) floor($response->getStatusCode() / 100); + $level = (int) \floor($response->getStatusCode() / 100); if ($level === 4) { $label = 'Client error'; $className = ClientException::class; @@ -95,51 +95,33 @@ class RequestException extends TransferException // Client Error: `GET /` resulted in a `404 Not Found` response: // ... (truncated) - $message = sprintf( + $message = \sprintf( '%s: `%s %s` resulted in a `%s %s` response', $label, $request->getMethod(), - $uri, + $uri->__toString(), $response->getStatusCode(), $response->getReasonPhrase() ); - $summary = static::getResponseBodySummary($response); + $summary = ($bodySummarizer ?? new BodySummarizer())->summarize($response); if ($summary !== null) { $message .= ":\n{$summary}\n"; } - return new $className($message, $request, $response, $previous, $ctx); - } - - /** - * Get a short summary of the response - * - * Will return `null` if the response is not printable. - * - * @param ResponseInterface $response - * - * @return string|null - */ - public static function getResponseBodySummary(ResponseInterface $response) - { - return \GuzzleHttp\Psr7\get_message_body_summary($response); + return new $className($message, $request, $response, $previous, $handlerContext); } /** * Obfuscates URI if there is a username and a password present - * - * @param UriInterface $uri - * - * @return UriInterface */ - private static function obfuscateUri(UriInterface $uri) + private static function obfuscateUri(UriInterface $uri): UriInterface { $userInfo = $uri->getUserInfo(); - if (false !== ($pos = strpos($userInfo, ':'))) { - return $uri->withUserInfo(substr($userInfo, 0, $pos), '***'); + if (false !== ($pos = \strpos($userInfo, ':'))) { + return $uri->withUserInfo(\substr($userInfo, 0, $pos), '***'); } return $uri; @@ -147,30 +129,24 @@ class RequestException extends TransferException /** * Get the request that caused the exception - * - * @return RequestInterface */ - public function getRequest() + public function getRequest(): RequestInterface { return $this->request; } /** * Get the associated response - * - * @return ResponseInterface|null */ - public function getResponse() + public function getResponse(): ?ResponseInterface { return $this->response; } /** * Check if a response was received - * - * @return bool */ - public function hasResponse() + public function hasResponse(): bool { return $this->response !== null; } @@ -182,10 +158,8 @@ class RequestException extends TransferException * using. It may also be just an empty array. Relying on this data will * couple you to a specific handler, but can give more debug information * when needed. - * - * @return array */ - public function getHandlerContext() + public function getHandlerContext(): array { return $this->handlerContext; } diff --git a/lib/guzzlehttp/guzzle/src/Exception/SeekException.php b/lib/guzzlehttp/guzzle/src/Exception/SeekException.php deleted file mode 100644 index a77c28926..000000000 --- a/lib/guzzlehttp/guzzle/src/Exception/SeekException.php +++ /dev/null @@ -1,27 +0,0 @@ -stream = $stream; - $msg = $msg ?: 'Could not seek the stream to position ' . $pos; - parent::__construct($msg); - } - - /** - * @return StreamInterface - */ - public function getStream() - { - return $this->stream; - } -} diff --git a/lib/guzzlehttp/guzzle/src/Exception/ServerException.php b/lib/guzzlehttp/guzzle/src/Exception/ServerException.php index 127094c14..8055e067c 100644 --- a/lib/guzzlehttp/guzzle/src/Exception/ServerException.php +++ b/lib/guzzlehttp/guzzle/src/Exception/ServerException.php @@ -1,4 +1,5 @@ maxHandles = $maxHandles; } - public function create(RequestInterface $request, array $options) + public function create(RequestInterface $request, array $options): EasyHandle { if (isset($options['curl']['body_as_string'])) { $options['_body_as_string'] = $options['curl']['body_as_string']; @@ -49,35 +62,33 @@ class CurlFactory implements CurlFactoryInterface // Add handler options from the request configuration options if (isset($options['curl'])) { - $conf = array_replace($conf, $options['curl']); + $conf = \array_replace($conf, $options['curl']); } - $conf[CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy); - $easy->handle = $this->handles - ? array_pop($this->handles) - : curl_init(); + $conf[\CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy); + $easy->handle = $this->handles ? \array_pop($this->handles) : \curl_init(); curl_setopt_array($easy->handle, $conf); return $easy; } - public function release(EasyHandle $easy) + public function release(EasyHandle $easy): void { $resource = $easy->handle; unset($easy->handle); - if (count($this->handles) >= $this->maxHandles) { - curl_close($resource); + if (\count($this->handles) >= $this->maxHandles) { + \curl_close($resource); } else { // Remove all callback functions as they can hold onto references // and are not cleaned up by curl_reset. Using curl_setopt_array // does not work for some reason, so removing each one // individually. - curl_setopt($resource, CURLOPT_HEADERFUNCTION, null); - curl_setopt($resource, CURLOPT_READFUNCTION, null); - curl_setopt($resource, CURLOPT_WRITEFUNCTION, null); - curl_setopt($resource, CURLOPT_PROGRESSFUNCTION, null); - curl_reset($resource); + \curl_setopt($resource, \CURLOPT_HEADERFUNCTION, null); + \curl_setopt($resource, \CURLOPT_READFUNCTION, null); + \curl_setopt($resource, \CURLOPT_WRITEFUNCTION, null); + \curl_setopt($resource, \CURLOPT_PROGRESSFUNCTION, null); + \curl_reset($resource); $this->handles[] = $resource; } } @@ -86,17 +97,11 @@ class CurlFactory implements CurlFactoryInterface * Completes a cURL transaction, either returning a response promise or a * rejected promise. * - * @param callable $handler - * @param EasyHandle $easy - * @param CurlFactoryInterface $factory Dictates how the handle is released - * - * @return \GuzzleHttp\Promise\PromiseInterface + * @param callable(RequestInterface, array): PromiseInterface $handler + * @param CurlFactoryInterface $factory Dictates how the handle is released */ - public static function finish( - callable $handler, - EasyHandle $easy, - CurlFactoryInterface $factory - ) { + public static function finish(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory): PromiseInterface + { if (isset($easy->options['on_stats'])) { self::invokeStats($easy); } @@ -117,10 +122,10 @@ class CurlFactory implements CurlFactoryInterface return new FulfilledPromise($easy->response); } - private static function invokeStats(EasyHandle $easy) + private static function invokeStats(EasyHandle $easy): void { - $curlStats = curl_getinfo($easy->handle); - $curlStats['appconnect_time'] = curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME); + $curlStats = \curl_getinfo($easy->handle); + $curlStats['appconnect_time'] = \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME); $stats = new TransferStats( $easy->request, $easy->response, @@ -128,47 +133,57 @@ class CurlFactory implements CurlFactoryInterface $easy->errno, $curlStats ); - call_user_func($easy->options['on_stats'], $stats); + ($easy->options['on_stats'])($stats); } - private static function finishError( - callable $handler, - EasyHandle $easy, - CurlFactoryInterface $factory - ) { + /** + * @param callable(RequestInterface, array): PromiseInterface $handler + */ + private static function finishError(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory): PromiseInterface + { // Get error information and release the handle to the factory. $ctx = [ 'errno' => $easy->errno, - 'error' => curl_error($easy->handle), - 'appconnect_time' => curl_getinfo($easy->handle, CURLINFO_APPCONNECT_TIME), - ] + curl_getinfo($easy->handle); - $ctx[self::CURL_VERSION_STR] = curl_version()['version']; + 'error' => \curl_error($easy->handle), + 'appconnect_time' => \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME), + ] + \curl_getinfo($easy->handle); + $ctx[self::CURL_VERSION_STR] = \curl_version()['version']; $factory->release($easy); // Retry when nothing is present or when curl failed to rewind. - if (empty($easy->options['_err_message']) - && (!$easy->errno || $easy->errno == 65) - ) { + if (empty($easy->options['_err_message']) && (!$easy->errno || $easy->errno == 65)) { return self::retryFailedRewind($handler, $easy, $ctx); } return self::createRejection($easy, $ctx); } - private static function createRejection(EasyHandle $easy, array $ctx) + private static function createRejection(EasyHandle $easy, array $ctx): PromiseInterface { static $connectionErrors = [ - CURLE_OPERATION_TIMEOUTED => true, - CURLE_COULDNT_RESOLVE_HOST => true, - CURLE_COULDNT_CONNECT => true, - CURLE_SSL_CONNECT_ERROR => true, - CURLE_GOT_NOTHING => true, + \CURLE_OPERATION_TIMEOUTED => true, + \CURLE_COULDNT_RESOLVE_HOST => true, + \CURLE_COULDNT_CONNECT => true, + \CURLE_SSL_CONNECT_ERROR => true, + \CURLE_GOT_NOTHING => true, ]; + if ($easy->createResponseException) { + return P\Create::rejectionFor( + new RequestException( + 'An error was encountered while creating the response', + $easy->request, + $easy->response, + $easy->createResponseException, + $ctx + ) + ); + } + // If an exception was encountered during the onHeaders event, then // return a rejected promise that wraps that exception. if ($easy->onHeadersException) { - return \GuzzleHttp\Promise\rejection_for( + return P\Create::rejectionFor( new RequestException( 'An error was encountered during the on_headers event', $easy->request, @@ -178,21 +193,16 @@ class CurlFactory implements CurlFactoryInterface ) ); } - if (version_compare($ctx[self::CURL_VERSION_STR], self::LOW_CURL_VERSION_NUMBER)) { - $message = sprintf( - 'cURL error %s: %s (%s)', - $ctx['errno'], - $ctx['error'], - 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html' - ); - } else { - $message = sprintf( - 'cURL error %s: %s (%s) for %s', - $ctx['errno'], - $ctx['error'], - 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html', - $easy->request->getUri() - ); + + $message = \sprintf( + 'cURL error %s: %s (%s)', + $ctx['errno'], + $ctx['error'], + 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html' + ); + $uriString = (string) $easy->request->getUri(); + if ($uriString !== '' && false === \strpos($ctx['error'], $uriString)) { + $message .= \sprintf(' for %s', $uriString); } // Create a connection exception if it was a specific error code. @@ -200,37 +210,40 @@ class CurlFactory implements CurlFactoryInterface ? new ConnectException($message, $easy->request, null, $ctx) : new RequestException($message, $easy->request, $easy->response, null, $ctx); - return \GuzzleHttp\Promise\rejection_for($error); + return P\Create::rejectionFor($error); } - private function getDefaultConf(EasyHandle $easy) + /** + * @return array + */ + private function getDefaultConf(EasyHandle $easy): array { $conf = [ - '_headers' => $easy->request->getHeaders(), - CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(), - CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''), - CURLOPT_RETURNTRANSFER => false, - CURLOPT_HEADER => false, - CURLOPT_CONNECTTIMEOUT => 150, + '_headers' => $easy->request->getHeaders(), + \CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(), + \CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''), + \CURLOPT_RETURNTRANSFER => false, + \CURLOPT_HEADER => false, + \CURLOPT_CONNECTTIMEOUT => 150, ]; - if (defined('CURLOPT_PROTOCOLS')) { - $conf[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS; + if (\defined('CURLOPT_PROTOCOLS')) { + $conf[\CURLOPT_PROTOCOLS] = \CURLPROTO_HTTP | \CURLPROTO_HTTPS; } $version = $easy->request->getProtocolVersion(); if ($version == 1.1) { - $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_1; + $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_1; } elseif ($version == 2.0) { - $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_2_0; + $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_2_0; } else { - $conf[CURLOPT_HTTP_VERSION] = CURL_HTTP_VERSION_1_0; + $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_0; } return $conf; } - private function applyMethod(EasyHandle $easy, array &$conf) + private function applyMethod(EasyHandle $easy, array &$conf): void { $body = $easy->request->getBody(); $size = $body->getSize(); @@ -242,22 +255,22 @@ class CurlFactory implements CurlFactoryInterface $method = $easy->request->getMethod(); if ($method === 'PUT' || $method === 'POST') { - // See http://tools.ietf.org/html/rfc7230#section-3.3.2 + // See https://tools.ietf.org/html/rfc7230#section-3.3.2 if (!$easy->request->hasHeader('Content-Length')) { - $conf[CURLOPT_HTTPHEADER][] = 'Content-Length: 0'; + $conf[\CURLOPT_HTTPHEADER][] = 'Content-Length: 0'; } } elseif ($method === 'HEAD') { - $conf[CURLOPT_NOBODY] = true; + $conf[\CURLOPT_NOBODY] = true; unset( - $conf[CURLOPT_WRITEFUNCTION], - $conf[CURLOPT_READFUNCTION], - $conf[CURLOPT_FILE], - $conf[CURLOPT_INFILE] + $conf[\CURLOPT_WRITEFUNCTION], + $conf[\CURLOPT_READFUNCTION], + $conf[\CURLOPT_FILE], + $conf[\CURLOPT_INFILE] ); } } - private function applyBody(RequestInterface $request, array $options, array &$conf) + private function applyBody(RequestInterface $request, array $options, array &$conf): void { $size = $request->hasHeader('Content-Length') ? (int) $request->getHeaderLine('Content-Length') @@ -265,40 +278,38 @@ class CurlFactory implements CurlFactoryInterface // Send the body as a string if the size is less than 1MB OR if the // [curl][body_as_string] request value is set. - if (($size !== null && $size < 1000000) || - !empty($options['_body_as_string']) - ) { - $conf[CURLOPT_POSTFIELDS] = (string) $request->getBody(); + if (($size !== null && $size < 1000000) || !empty($options['_body_as_string'])) { + $conf[\CURLOPT_POSTFIELDS] = (string) $request->getBody(); // Don't duplicate the Content-Length header $this->removeHeader('Content-Length', $conf); $this->removeHeader('Transfer-Encoding', $conf); } else { - $conf[CURLOPT_UPLOAD] = true; + $conf[\CURLOPT_UPLOAD] = true; if ($size !== null) { - $conf[CURLOPT_INFILESIZE] = $size; + $conf[\CURLOPT_INFILESIZE] = $size; $this->removeHeader('Content-Length', $conf); } $body = $request->getBody(); if ($body->isSeekable()) { $body->rewind(); } - $conf[CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use ($body) { + $conf[\CURLOPT_READFUNCTION] = static function ($ch, $fd, $length) use ($body) { return $body->read($length); }; } // If the Expect header is not present, prevent curl from adding it if (!$request->hasHeader('Expect')) { - $conf[CURLOPT_HTTPHEADER][] = 'Expect:'; + $conf[\CURLOPT_HTTPHEADER][] = 'Expect:'; } // cURL sometimes adds a content-type by default. Prevent this. if (!$request->hasHeader('Content-Type')) { - $conf[CURLOPT_HTTPHEADER][] = 'Content-Type:'; + $conf[\CURLOPT_HTTPHEADER][] = 'Content-Type:'; } } - private function applyHeaders(EasyHandle $easy, array &$conf) + private function applyHeaders(EasyHandle $easy, array &$conf): void { foreach ($conf['_headers'] as $name => $values) { foreach ($values as $value) { @@ -306,16 +317,16 @@ class CurlFactory implements CurlFactoryInterface if ($value === '') { // cURL requires a special format for empty headers. // See https://github.com/guzzle/guzzle/issues/1882 for more details. - $conf[CURLOPT_HTTPHEADER][] = "$name;"; + $conf[\CURLOPT_HTTPHEADER][] = "$name;"; } else { - $conf[CURLOPT_HTTPHEADER][] = "$name: $value"; + $conf[\CURLOPT_HTTPHEADER][] = "$name: $value"; } } } // Remove the Accept header if one was not set if (!$easy->request->hasHeader('Accept')) { - $conf[CURLOPT_HTTPHEADER][] = 'Accept:'; + $conf[\CURLOPT_HTTPHEADER][] = 'Accept:'; } } @@ -325,115 +336,115 @@ class CurlFactory implements CurlFactoryInterface * @param string $name Case-insensitive header to remove * @param array $options Array of options to modify */ - private function removeHeader($name, array &$options) + private function removeHeader(string $name, array &$options): void { - foreach (array_keys($options['_headers']) as $key) { - if (!strcasecmp($key, $name)) { + foreach (\array_keys($options['_headers']) as $key) { + if (!\strcasecmp($key, $name)) { unset($options['_headers'][$key]); return; } } } - private function applyHandlerOptions(EasyHandle $easy, array &$conf) + private function applyHandlerOptions(EasyHandle $easy, array &$conf): void { $options = $easy->options; if (isset($options['verify'])) { if ($options['verify'] === false) { - unset($conf[CURLOPT_CAINFO]); - $conf[CURLOPT_SSL_VERIFYHOST] = 0; - $conf[CURLOPT_SSL_VERIFYPEER] = false; + unset($conf[\CURLOPT_CAINFO]); + $conf[\CURLOPT_SSL_VERIFYHOST] = 0; + $conf[\CURLOPT_SSL_VERIFYPEER] = false; } else { - $conf[CURLOPT_SSL_VERIFYHOST] = 2; - $conf[CURLOPT_SSL_VERIFYPEER] = true; - if (is_string($options['verify'])) { + $conf[\CURLOPT_SSL_VERIFYHOST] = 2; + $conf[\CURLOPT_SSL_VERIFYPEER] = true; + if (\is_string($options['verify'])) { // Throw an error if the file/folder/link path is not valid or doesn't exist. - if (!file_exists($options['verify'])) { - throw new \InvalidArgumentException( - "SSL CA bundle not found: {$options['verify']}" - ); + if (!\file_exists($options['verify'])) { + throw new \InvalidArgumentException("SSL CA bundle not found: {$options['verify']}"); } // If it's a directory or a link to a directory use CURLOPT_CAPATH. // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO. - if (is_dir($options['verify']) || - (is_link($options['verify']) && is_dir(readlink($options['verify'])))) { - $conf[CURLOPT_CAPATH] = $options['verify']; + if ( + \is_dir($options['verify']) || + ( + \is_link($options['verify']) === true && + ($verifyLink = \readlink($options['verify'])) !== false && + \is_dir($verifyLink) + ) + ) { + $conf[\CURLOPT_CAPATH] = $options['verify']; } else { - $conf[CURLOPT_CAINFO] = $options['verify']; + $conf[\CURLOPT_CAINFO] = $options['verify']; } } } } - if (!empty($options['decode_content'])) { + if (!isset($options['curl'][\CURLOPT_ENCODING]) && !empty($options['decode_content'])) { $accept = $easy->request->getHeaderLine('Accept-Encoding'); if ($accept) { - $conf[CURLOPT_ENCODING] = $accept; + $conf[\CURLOPT_ENCODING] = $accept; } else { - $conf[CURLOPT_ENCODING] = ''; - // Don't let curl send the header over the wire - $conf[CURLOPT_HTTPHEADER][] = 'Accept-Encoding:'; + // The empty string enables all available decoders and implicitly + // sets a matching 'Accept-Encoding' header. + $conf[\CURLOPT_ENCODING] = ''; + // But as the user did not specify any acceptable encodings we need + // to overwrite this implicit header with an empty one. + $conf[\CURLOPT_HTTPHEADER][] = 'Accept-Encoding:'; } } - if (isset($options['sink'])) { - $sink = $options['sink']; - if (!is_string($sink)) { - $sink = \GuzzleHttp\Psr7\stream_for($sink); - } elseif (!is_dir(dirname($sink))) { - // Ensure that the directory exists before failing in curl. - throw new \RuntimeException(sprintf( - 'Directory %s does not exist for sink value of %s', - dirname($sink), - $sink - )); - } else { - $sink = new LazyOpenStream($sink, 'w+'); - } - $easy->sink = $sink; - $conf[CURLOPT_WRITEFUNCTION] = function ($ch, $write) use ($sink) { - return $sink->write($write); - }; - } else { + if (!isset($options['sink'])) { // Use a default temp stream if no sink was set. - $conf[CURLOPT_FILE] = fopen('php://temp', 'w+'); - $easy->sink = Psr7\stream_for($conf[CURLOPT_FILE]); + $options['sink'] = \GuzzleHttp\Psr7\Utils::tryFopen('php://temp', 'w+'); } + $sink = $options['sink']; + if (!\is_string($sink)) { + $sink = \GuzzleHttp\Psr7\Utils::streamFor($sink); + } elseif (!\is_dir(\dirname($sink))) { + // Ensure that the directory exists before failing in curl. + throw new \RuntimeException(\sprintf('Directory %s does not exist for sink value of %s', \dirname($sink), $sink)); + } else { + $sink = new LazyOpenStream($sink, 'w+'); + } + $easy->sink = $sink; + $conf[\CURLOPT_WRITEFUNCTION] = static function ($ch, $write) use ($sink): int { + return $sink->write($write); + }; + $timeoutRequiresNoSignal = false; if (isset($options['timeout'])) { $timeoutRequiresNoSignal |= $options['timeout'] < 1; - $conf[CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000; + $conf[\CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000; } // CURL default value is CURL_IPRESOLVE_WHATEVER if (isset($options['force_ip_resolve'])) { if ('v4' === $options['force_ip_resolve']) { - $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4; + $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V4; } elseif ('v6' === $options['force_ip_resolve']) { - $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V6; + $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V6; } } if (isset($options['connect_timeout'])) { $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1; - $conf[CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000; + $conf[\CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000; } - if ($timeoutRequiresNoSignal && strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN') { - $conf[CURLOPT_NOSIGNAL] = true; + if ($timeoutRequiresNoSignal && \strtoupper(\substr(\PHP_OS, 0, 3)) !== 'WIN') { + $conf[\CURLOPT_NOSIGNAL] = true; } if (isset($options['proxy'])) { - if (!is_array($options['proxy'])) { - $conf[CURLOPT_PROXY] = $options['proxy']; + if (!\is_array($options['proxy'])) { + $conf[\CURLOPT_PROXY] = $options['proxy']; } else { $scheme = $easy->request->getUri()->getScheme(); if (isset($options['proxy'][$scheme])) { $host = $easy->request->getUri()->getHost(); - if (!isset($options['proxy']['no']) || - !\GuzzleHttp\is_host_in_noproxy($host, $options['proxy']['no']) - ) { - $conf[CURLOPT_PROXY] = $options['proxy'][$scheme]; + if (!isset($options['proxy']['no']) || !Utils::isHostInNoProxy($host, $options['proxy']['no'])) { + $conf[\CURLOPT_PROXY] = $options['proxy'][$scheme]; } } } @@ -441,58 +452,53 @@ class CurlFactory implements CurlFactoryInterface if (isset($options['cert'])) { $cert = $options['cert']; - if (is_array($cert)) { - $conf[CURLOPT_SSLCERTPASSWD] = $cert[1]; + if (\is_array($cert)) { + $conf[\CURLOPT_SSLCERTPASSWD] = $cert[1]; $cert = $cert[0]; } - if (!file_exists($cert)) { - throw new \InvalidArgumentException( - "SSL certificate not found: {$cert}" - ); + if (!\file_exists($cert)) { + throw new \InvalidArgumentException("SSL certificate not found: {$cert}"); } - $conf[CURLOPT_SSLCERT] = $cert; + # OpenSSL (versions 0.9.3 and later) also support "P12" for PKCS#12-encoded files. + # see https://curl.se/libcurl/c/CURLOPT_SSLCERTTYPE.html + $ext = pathinfo($cert, \PATHINFO_EXTENSION); + if (preg_match('#^(der|p12)$#i', $ext)) { + $conf[\CURLOPT_SSLCERTTYPE] = strtoupper($ext); + } + $conf[\CURLOPT_SSLCERT] = $cert; } if (isset($options['ssl_key'])) { - if (is_array($options['ssl_key'])) { - if (count($options['ssl_key']) === 2) { - list($sslKey, $conf[CURLOPT_SSLKEYPASSWD]) = $options['ssl_key']; + if (\is_array($options['ssl_key'])) { + if (\count($options['ssl_key']) === 2) { + [$sslKey, $conf[\CURLOPT_SSLKEYPASSWD]] = $options['ssl_key']; } else { - list($sslKey) = $options['ssl_key']; + [$sslKey] = $options['ssl_key']; } } - $sslKey = isset($sslKey) ? $sslKey: $options['ssl_key']; + $sslKey = $sslKey ?? $options['ssl_key']; - if (!file_exists($sslKey)) { - throw new \InvalidArgumentException( - "SSL private key not found: {$sslKey}" - ); + if (!\file_exists($sslKey)) { + throw new \InvalidArgumentException("SSL private key not found: {$sslKey}"); } - $conf[CURLOPT_SSLKEY] = $sslKey; + $conf[\CURLOPT_SSLKEY] = $sslKey; } if (isset($options['progress'])) { $progress = $options['progress']; - if (!is_callable($progress)) { - throw new \InvalidArgumentException( - 'progress client option must be callable' - ); + if (!\is_callable($progress)) { + throw new \InvalidArgumentException('progress client option must be callable'); } - $conf[CURLOPT_NOPROGRESS] = false; - $conf[CURLOPT_PROGRESSFUNCTION] = function () use ($progress) { - $args = func_get_args(); - // PHP 5.5 pushed the handle onto the start of the args - if (is_resource($args[0])) { - array_shift($args); - } - call_user_func_array($progress, $args); + $conf[\CURLOPT_NOPROGRESS] = false; + $conf[\CURLOPT_PROGRESSFUNCTION] = static function ($resource, int $downloadSize, int $downloaded, int $uploadSize, int $uploaded) use ($progress) { + $progress($downloadSize, $downloaded, $uploadSize, $uploaded); }; } if (!empty($options['debug'])) { - $conf[CURLOPT_STDERR] = \GuzzleHttp\debug_resource($options['debug']); - $conf[CURLOPT_VERBOSE] = true; + $conf[\CURLOPT_STDERR] = Utils::debugResource($options['debug']); + $conf[\CURLOPT_VERBOSE] = true; } } @@ -504,12 +510,11 @@ class CurlFactory implements CurlFactoryInterface * stream, and then encountered a "necessary data rewind wasn't possible" * error, causing the request to be sent through curl_multi_info_read() * without an error status. + * + * @param callable(RequestInterface, array): PromiseInterface $handler */ - private static function retryFailedRewind( - callable $handler, - EasyHandle $easy, - array $ctx - ) { + private static function retryFailedRewind(callable $handler, EasyHandle $easy, array $ctx): PromiseInterface + { try { // Only rewind if the body has been read from. $body = $easy->request->getBody(); @@ -542,27 +547,32 @@ class CurlFactory implements CurlFactoryInterface return $handler($easy->request, $easy->options); } - private function createHeaderFn(EasyHandle $easy) + private function createHeaderFn(EasyHandle $easy): callable { if (isset($easy->options['on_headers'])) { $onHeaders = $easy->options['on_headers']; - if (!is_callable($onHeaders)) { + if (!\is_callable($onHeaders)) { throw new \InvalidArgumentException('on_headers must be callable'); } } else { $onHeaders = null; } - return function ($ch, $h) use ( + return static function ($ch, $h) use ( $onHeaders, $easy, &$startingResponse ) { - $value = trim($h); + $value = \trim($h); if ($value === '') { $startingResponse = true; - $easy->createResponse(); + try { + $easy->createResponse(); + } catch (\Exception $e) { + $easy->createResponseException = $e; + return -1; + } if ($onHeaders !== null) { try { $onHeaders($easy->response); @@ -579,7 +589,7 @@ class CurlFactory implements CurlFactoryInterface } else { $easy->headers[] = $value; } - return strlen($h); + return \strlen($h); }; } } diff --git a/lib/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php b/lib/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php index b0fc23685..fe57ed5d5 100644 --- a/lib/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php +++ b/lib/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php @@ -1,4 +1,5 @@ factory = isset($options['handle_factory']) - ? $options['handle_factory'] - : new CurlFactory(3); + $this->factory = $options['handle_factory'] + ?? new CurlFactory(3); } - public function __invoke(RequestInterface $request, array $options) + public function __invoke(RequestInterface $request, array $options): PromiseInterface { if (isset($options['delay'])) { - usleep($options['delay'] * 1000); + \usleep($options['delay'] * 1000); } $easy = $this->factory->create($request, $options); - curl_exec($easy->handle); - $easy->errno = curl_errno($easy->handle); + \curl_exec($easy->handle); + $easy->errno = \curl_errno($easy->handle); return CurlFactory::finish($this, $easy, $this->factory); } diff --git a/lib/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php b/lib/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php index 564c95f48..2f5b3f69b 100644 --- a/lib/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php +++ b/lib/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php @@ -1,8 +1,10 @@ An array of delay times, indexed by handle id in `addRequest`. + * + * @see CurlMultiHandler::addRequest + */ private $delays = []; + + /** + * @var array An associative array of CURLMOPT_* options and corresponding values for curl_multi_setopt() + */ private $options = []; /** @@ -33,52 +63,62 @@ class CurlMultiHandler * out while selecting curl handles. Defaults to 1 second. * - options: An associative array of CURLMOPT_* options and * corresponding values for curl_multi_setopt() - * - * @param array $options */ public function __construct(array $options = []) { - $this->factory = isset($options['handle_factory']) - ? $options['handle_factory'] : new CurlFactory(50); + $this->factory = $options['handle_factory'] ?? new CurlFactory(50); if (isset($options['select_timeout'])) { $this->selectTimeout = $options['select_timeout']; - } elseif ($selectTimeout = getenv('GUZZLE_CURL_SELECT_TIMEOUT')) { - $this->selectTimeout = $selectTimeout; + } elseif ($selectTimeout = Utils::getenv('GUZZLE_CURL_SELECT_TIMEOUT')) { + @trigger_error('Since guzzlehttp/guzzle 7.2.0: Using environment variable GUZZLE_CURL_SELECT_TIMEOUT is deprecated. Use option "select_timeout" instead.', \E_USER_DEPRECATED); + $this->selectTimeout = (int) $selectTimeout; } else { $this->selectTimeout = 1; } - $this->options = isset($options['options']) ? $options['options'] : []; + $this->options = $options['options'] ?? []; } + /** + * @param string $name + * + * @return resource|\CurlMultiHandle + * + * @throws \BadMethodCallException when another field as `_mh` will be gotten + * @throws \RuntimeException when curl can not initialize a multi handle + */ public function __get($name) { - if ($name === '_mh') { - $this->_mh = curl_multi_init(); - - foreach ($this->options as $option => $value) { - // A warning is raised in case of a wrong option. - curl_multi_setopt($this->_mh, $option, $value); - } - - // Further calls to _mh will return the value directly, without entering the - // __get() method at all. - return $this->_mh; + if ($name !== '_mh') { + throw new \BadMethodCallException("Can not get other property as '_mh'."); } - throw new \BadMethodCallException(); + $multiHandle = \curl_multi_init(); + + if (false === $multiHandle) { + throw new \RuntimeException('Can not initialize curl multi handle.'); + } + + $this->_mh = $multiHandle; + + foreach ($this->options as $option => $value) { + // A warning is raised in case of a wrong option. + curl_multi_setopt($this->_mh, $option, $value); + } + + return $this->_mh; } public function __destruct() { if (isset($this->_mh)) { - curl_multi_close($this->_mh); + \curl_multi_close($this->_mh); unset($this->_mh); } } - public function __invoke(RequestInterface $request, array $options) + public function __invoke(RequestInterface $request, array $options): PromiseInterface { $easy = $this->factory->create($request, $options); $id = (int) $easy->handle; @@ -98,7 +138,7 @@ class CurlMultiHandler /** * Ticks the curl event loop. */ - public function tick() + public function tick(): void { // Add any delayed handles if needed. if ($this->delays) { @@ -106,7 +146,7 @@ class CurlMultiHandler foreach ($this->delays as $id => $delay) { if ($currentTime >= $delay) { unset($this->delays[$id]); - curl_multi_add_handle( + \curl_multi_add_handle( $this->_mh, $this->handles[$id]['easy']->handle ); @@ -115,17 +155,15 @@ class CurlMultiHandler } // Step through the task queue which may add additional requests. - P\queue()->run(); + P\Utils::queue()->run(); - if ($this->active && - curl_multi_select($this->_mh, $this->selectTimeout) === -1 - ) { + if ($this->active && \curl_multi_select($this->_mh, $this->selectTimeout) === -1) { // Perform a usleep if a select returns -1. // See: https://bugs.php.net/bug.php?id=61141 - usleep(250); + \usleep(250); } - while (curl_multi_exec($this->_mh, $this->active) === CURLM_CALL_MULTI_PERFORM); + while (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM); $this->processMessages(); } @@ -133,26 +171,26 @@ class CurlMultiHandler /** * Runs until all outstanding connections have completed. */ - public function execute() + public function execute(): void { - $queue = P\queue(); + $queue = P\Utils::queue(); while ($this->handles || !$queue->isEmpty()) { // If there are no transfers, then sleep for the next delay if (!$this->active && $this->delays) { - usleep($this->timeToNext()); + \usleep($this->timeToNext()); } $this->tick(); } } - private function addRequest(array $entry) + private function addRequest(array $entry): void { $easy = $entry['easy']; $id = (int) $easy->handle; $this->handles[$id] = $entry; if (empty($easy->options['delay'])) { - curl_multi_add_handle($this->_mh, $easy->handle); + \curl_multi_add_handle($this->_mh, $easy->handle); } else { $this->delays[$id] = Utils::currentTime() + ($easy->options['delay'] / 1000); } @@ -165,8 +203,12 @@ class CurlMultiHandler * * @return bool True on success, false on failure. */ - private function cancel($id) + private function cancel($id): bool { + if (!is_int($id)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing an integer to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + // Cannot cancel if it has been processed. if (!isset($this->handles[$id])) { return false; @@ -174,17 +216,21 @@ class CurlMultiHandler $handle = $this->handles[$id]['easy']->handle; unset($this->delays[$id], $this->handles[$id]); - curl_multi_remove_handle($this->_mh, $handle); - curl_close($handle); + \curl_multi_remove_handle($this->_mh, $handle); + \curl_close($handle); return true; } - private function processMessages() + private function processMessages(): void { - while ($done = curl_multi_info_read($this->_mh)) { + while ($done = \curl_multi_info_read($this->_mh)) { + if ($done['msg'] !== \CURLMSG_DONE) { + // if it's not done, then it would be premature to remove the handle. ref https://github.com/guzzle/guzzle/pull/2892#issuecomment-945150216 + continue; + } $id = (int) $done['handle']; - curl_multi_remove_handle($this->_mh, $done['handle']); + \curl_multi_remove_handle($this->_mh, $done['handle']); if (!isset($this->handles[$id])) { // Probably was cancelled. @@ -195,25 +241,21 @@ class CurlMultiHandler unset($this->handles[$id], $this->delays[$id]); $entry['easy']->errno = $done['result']; $entry['deferred']->resolve( - CurlFactory::finish( - $this, - $entry['easy'], - $this->factory - ) + CurlFactory::finish($this, $entry['easy'], $this->factory) ); } } - private function timeToNext() + private function timeToNext(): int { $currentTime = Utils::currentTime(); - $nextTime = PHP_INT_MAX; + $nextTime = \PHP_INT_MAX; foreach ($this->delays as $time) { if ($time < $nextTime) { $nextTime = $time; } } - return max(0, $nextTime - $currentTime) * 1000000; + return ((int) \max(0, $nextTime - $currentTime)) * 1000000; } } diff --git a/lib/guzzlehttp/guzzle/src/Handler/EasyHandle.php b/lib/guzzlehttp/guzzle/src/Handler/EasyHandle.php index 7754e9111..224344d7c 100644 --- a/lib/guzzlehttp/guzzle/src/Handler/EasyHandle.php +++ b/lib/guzzlehttp/guzzle/src/Handler/EasyHandle.php @@ -1,7 +1,9 @@ headers)) { - throw new \RuntimeException('No headers have been received'); - } + [$ver, $status, $reason, $headers] = HeaderProcessor::parseHeaders($this->headers); - // HTTP-version SP status-code SP reason-phrase - $startLine = explode(' ', array_shift($this->headers), 3); - $headers = \GuzzleHttp\headers_from_lines($this->headers); - $normalizedKeys = \GuzzleHttp\normalize_header_keys($headers); + $normalizedKeys = Utils::normalizeHeaderKeys($headers); - if (!empty($this->options['decode_content']) - && isset($normalizedKeys['content-encoding']) - ) { - $headers['x-encoded-content-encoding'] - = $headers[$normalizedKeys['content-encoding']]; + if (!empty($this->options['decode_content']) && isset($normalizedKeys['content-encoding'])) { + $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; unset($headers[$normalizedKeys['content-encoding']]); if (isset($normalizedKeys['content-length'])) { - $headers['x-encoded-content-length'] - = $headers[$normalizedKeys['content-length']]; + $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; $bodyLength = (int) $this->sink->getSize(); if ($bodyLength) { @@ -74,19 +89,24 @@ final class EasyHandle // Attach a response to the easy handle with the parsed headers. $this->response = new Response( - $startLine[1], + $status, $headers, $this->sink, - substr($startLine[0], 5), - isset($startLine[2]) ? (string) $startLine[2] : null + $ver, + $reason ); } + /** + * @param string $name + * + * @return void + * + * @throws \BadMethodCallException + */ public function __get($name) { - $msg = $name === 'handle' - ? 'The EasyHandle has been released' - : 'Invalid property: ' . $name; + $msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: ' . $name; throw new \BadMethodCallException($msg); } } diff --git a/lib/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php b/lib/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php new file mode 100644 index 000000000..a0988845f --- /dev/null +++ b/lib/guzzlehttp/guzzle/src/Handler/HeaderProcessor.php @@ -0,0 +1,42 @@ +|null $queue The parameters to be passed to the append function, as an indexed array. + * @param callable|null $onFulfilled Callback to invoke when the return value is fulfilled. + * @param callable|null $onRejected Callback to invoke when the return value is rejected. */ - public function __construct( - array $queue = null, - callable $onFulfilled = null, - callable $onRejected = null - ) { + public function __construct(array $queue = null, callable $onFulfilled = null, callable $onRejected = null) + { $this->onFulfilled = $onFulfilled; $this->onRejected = $onRejected; if ($queue) { - call_user_func_array([$this, 'append'], $queue); + // array_values included for BC + $this->append(...array_values($queue)); } } - public function __invoke(RequestInterface $request, array $options) + public function __invoke(RequestInterface $request, array $options): PromiseInterface { if (!$this->queue) { throw new \OutOfBoundsException('Mock queue is empty'); } - if (isset($options['delay']) && is_numeric($options['delay'])) { - usleep($options['delay'] * 1000); + if (isset($options['delay']) && \is_numeric($options['delay'])) { + \usleep((int) $options['delay'] * 1000); } $this->lastRequest = $request; $this->lastOptions = $options; - $response = array_shift($this->queue); + $response = \array_shift($this->queue); if (isset($options['on_headers'])) { - if (!is_callable($options['on_headers'])) { + if (!\is_callable($options['on_headers'])) { throw new \InvalidArgumentException('on_headers must be callable'); } try { @@ -86,29 +103,30 @@ class MockHandler implements \Countable } } - if (is_callable($response)) { - $response = call_user_func($response, $request, $options); + if (\is_callable($response)) { + $response = $response($request, $options); } - $response = $response instanceof \Exception - ? \GuzzleHttp\Promise\rejection_for($response) - : \GuzzleHttp\Promise\promise_for($response); + $response = $response instanceof \Throwable + ? P\Create::rejectionFor($response) + : P\Create::promiseFor($response); return $response->then( - function ($value) use ($request, $options) { + function (?ResponseInterface $value) use ($request, $options) { $this->invokeStats($request, $options, $value); if ($this->onFulfilled) { - call_user_func($this->onFulfilled, $value); + ($this->onFulfilled)($value); } - if (isset($options['sink'])) { + + if ($value !== null && isset($options['sink'])) { $contents = (string) $value->getBody(); $sink = $options['sink']; - if (is_resource($sink)) { - fwrite($sink, $contents); - } elseif (is_string($sink)) { - file_put_contents($sink, $contents); - } elseif ($sink instanceof \Psr\Http\Message\StreamInterface) { + if (\is_resource($sink)) { + \fwrite($sink, $contents); + } elseif (\is_string($sink)) { + \file_put_contents($sink, $contents); + } elseif ($sink instanceof StreamInterface) { $sink->write($contents); } } @@ -118,9 +136,9 @@ class MockHandler implements \Countable function ($reason) use ($request, $options) { $this->invokeStats($request, $options, null, $reason); if ($this->onRejected) { - call_user_func($this->onRejected, $reason); + ($this->onRejected)($reason); } - return \GuzzleHttp\Promise\rejection_for($reason); + return P\Create::rejectionFor($reason); } ); } @@ -128,68 +146,66 @@ class MockHandler implements \Countable /** * Adds one or more variadic requests, exceptions, callables, or promises * to the queue. + * + * @param mixed ...$values */ - public function append() + public function append(...$values): void { - foreach (func_get_args() as $value) { + foreach ($values as $value) { if ($value instanceof ResponseInterface - || $value instanceof \Exception + || $value instanceof \Throwable || $value instanceof PromiseInterface - || is_callable($value) + || \is_callable($value) ) { $this->queue[] = $value; } else { - throw new \InvalidArgumentException('Expected a response or ' - . 'exception. Found ' . \GuzzleHttp\describe_type($value)); + throw new \TypeError('Expected a Response, Promise, Throwable or callable. Found ' . Utils::describeType($value)); } } } /** * Get the last received request. - * - * @return RequestInterface */ - public function getLastRequest() + public function getLastRequest(): ?RequestInterface { return $this->lastRequest; } /** * Get the last received request options. - * - * @return array */ - public function getLastOptions() + public function getLastOptions(): array { return $this->lastOptions; } /** * Returns the number of remaining items in the queue. - * - * @return int */ - public function count() + public function count(): int { - return count($this->queue); + return \count($this->queue); } - public function reset() + public function reset(): void { $this->queue = []; } + /** + * @param mixed $reason Promise or reason. + */ private function invokeStats( RequestInterface $request, array $options, ResponseInterface $response = null, $reason = null - ) { + ): void { if (isset($options['on_stats'])) { - $transferTime = isset($options['transfer_time']) ? $options['transfer_time'] : 0; + $transferTime = $options['transfer_time'] ?? 0; $stats = new TransferStats($request, $response, $transferTime, $reason); - call_user_func($options['on_stats'], $stats); + ($options['on_stats'])($stats); } } } diff --git a/lib/guzzlehttp/guzzle/src/Handler/Proxy.php b/lib/guzzlehttp/guzzle/src/Handler/Proxy.php index f8b00be0b..f045b526c 100644 --- a/lib/guzzlehttp/guzzle/src/Handler/Proxy.php +++ b/lib/guzzlehttp/guzzle/src/Handler/Proxy.php @@ -1,11 +1,15 @@ getMessage(); // This list can probably get more comprehensive. - if (strpos($message, 'getaddrinfo') // DNS lookup failed - || strpos($message, 'Connection refused') - || strpos($message, "couldn't connect to host") // error on HHVM - || strpos($message, "connection attempt failed") + if (false !== \strpos($message, 'getaddrinfo') // DNS lookup failed + || false !== \strpos($message, 'Connection refused') + || false !== \strpos($message, "couldn't connect to host") // error on HHVM + || false !== \strpos($message, "connection attempt failed") ) { $e = new ConnectException($e->getMessage(), $request, $e); + } else { + $e = RequestException::wrapException($request, $e); } - $e = RequestException::wrapException($request, $e); $this->invokeStats($options, $request, $startTime, null, $e); - return \GuzzleHttp\Promise\rejection_for($e); + return P\Create::rejectionFor($e); } } private function invokeStats( array $options, RequestInterface $request, - $startTime, + ?float $startTime, ResponseInterface $response = null, - $error = null - ) { + \Throwable $error = null + ): void { if (isset($options['on_stats'])) { - $stats = new TransferStats( - $request, - $response, - Utils::currentTime() - $startTime, - $error, - [] - ); - call_user_func($options['on_stats'], $stats); + $stats = new TransferStats($request, $response, Utils::currentTime() - $startTime, $error, []); + ($options['on_stats'])($stats); } } - private function createResponse( - RequestInterface $request, - array $options, - $stream, - $startTime - ) { + /** + * @param resource $stream + */ + private function createResponse(RequestInterface $request, array $options, $stream, ?float $startTime): PromiseInterface + { $hdrs = $this->lastHeaders; $this->lastHeaders = []; - $parts = explode(' ', array_shift($hdrs), 3); - $ver = explode('/', $parts[0])[1]; - $status = $parts[1]; - $reason = isset($parts[2]) ? $parts[2] : null; - $headers = \GuzzleHttp\headers_from_lines($hdrs); - list($stream, $headers) = $this->checkDecode($options, $headers, $stream); - $stream = Psr7\stream_for($stream); + + try { + [$ver, $status, $reason, $headers] = HeaderProcessor::parseHeaders($hdrs); + } catch (\Exception $e) { + return P\Create::rejectionFor( + new RequestException('An error was encountered while creating the response', $request, null, $e) + ); + } + + [$stream, $headers] = $this->checkDecode($options, $headers, $stream); + $stream = Psr7\Utils::streamFor($stream); $sink = $stream; - if (strcasecmp('HEAD', $request->getMethod())) { + if (\strcasecmp('HEAD', $request->getMethod())) { $sink = $this->createSink($stream, $options); } - $response = new Psr7\Response($status, $headers, $sink, $ver, $reason); + try { + $response = new Psr7\Response($status, $headers, $sink, $ver, $reason); + } catch (\Exception $e) { + return P\Create::rejectionFor( + new RequestException('An error was encountered while creating the response', $request, null, $e) + ); + } if (isset($options['on_headers'])) { try { $options['on_headers']($response); } catch (\Exception $e) { - $msg = 'An error was encountered during the on_headers event'; - $ex = new RequestException($msg, $request, $response, $e); - return \GuzzleHttp\Promise\rejection_for($ex); + return P\Create::rejectionFor( + new RequestException('An error was encountered during the on_headers event', $request, $response, $e) + ); } } // Do not drain when the request is a HEAD request because they have // no body. if ($sink !== $stream) { - $this->drain( - $stream, - $sink, - $response->getHeaderLine('Content-Length') - ); + $this->drain($stream, $sink, $response->getHeaderLine('Content-Length')); } $this->invokeStats($options, $request, $startTime, $response, null); @@ -139,41 +145,37 @@ class StreamHandler return new FulfilledPromise($response); } - private function createSink(StreamInterface $stream, array $options) + private function createSink(StreamInterface $stream, array $options): StreamInterface { if (!empty($options['stream'])) { return $stream; } - $sink = isset($options['sink']) - ? $options['sink'] - : fopen('php://temp', 'r+'); + $sink = $options['sink'] ?? Psr7\Utils::tryFopen('php://temp', 'r+'); - return is_string($sink) - ? new Psr7\LazyOpenStream($sink, 'w+') - : Psr7\stream_for($sink); + return \is_string($sink) ? new Psr7\LazyOpenStream($sink, 'w+') : Psr7\Utils::streamFor($sink); } - private function checkDecode(array $options, array $headers, $stream) + /** + * @param resource $stream + */ + private function checkDecode(array $options, array $headers, $stream): array { // Automatically decode responses when instructed. if (!empty($options['decode_content'])) { - $normalizedKeys = \GuzzleHttp\normalize_header_keys($headers); + $normalizedKeys = Utils::normalizeHeaderKeys($headers); if (isset($normalizedKeys['content-encoding'])) { $encoding = $headers[$normalizedKeys['content-encoding']]; if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') { - $stream = new Psr7\InflateStream( - Psr7\stream_for($stream) - ); - $headers['x-encoded-content-encoding'] - = $headers[$normalizedKeys['content-encoding']]; + $stream = new Psr7\InflateStream(Psr7\Utils::streamFor($stream)); + $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; + // Remove content-encoding header unset($headers[$normalizedKeys['content-encoding']]); + // Fix content-length header if (isset($normalizedKeys['content-length'])) { - $headers['x-encoded-content-length'] - = $headers[$normalizedKeys['content-length']]; - + $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; $length = (int) $stream->getSize(); if ($length === 0) { unset($headers[$normalizedKeys['content-length']]); @@ -191,27 +193,21 @@ class StreamHandler /** * Drains the source stream into the "sink" client option. * - * @param StreamInterface $source - * @param StreamInterface $sink - * @param string $contentLength Header specifying the amount of - * data to read. + * @param string $contentLength Header specifying the amount of + * data to read. * - * @return StreamInterface * @throws \RuntimeException when the sink option is invalid. */ - private function drain( - StreamInterface $source, - StreamInterface $sink, - $contentLength - ) { + private function drain(StreamInterface $source, StreamInterface $sink, string $contentLength): StreamInterface + { // If a content-length header is provided, then stop reading once // that number of bytes has been read. This can prevent infinitely // reading from a stream when dealing with servers that do not honor // Connection: Close headers. - Psr7\copy_to_stream( + Psr7\Utils::copyToStream( $source, $sink, - (strlen($contentLength) > 0 && (int) $contentLength > 0) ? (int) $contentLength : -1 + (\strlen($contentLength) > 0 && (int) $contentLength > 0) ? (int) $contentLength : -1 ); $sink->seek(0); @@ -226,12 +222,13 @@ class StreamHandler * @param callable $callback Callable that returns stream resource * * @return resource + * * @throws \RuntimeException on error */ private function createResource(callable $callback) { - $errors = null; - set_error_handler(function ($_, $msg, $file, $line) use (&$errors) { + $errors = []; + \set_error_handler(static function ($_, $msg, $file, $line) use (&$errors): bool { $errors[] = [ 'message' => $msg, 'file' => $file, @@ -240,27 +237,37 @@ class StreamHandler return true; }); - $resource = $callback(); - restore_error_handler(); + try { + $resource = $callback(); + } finally { + \restore_error_handler(); + } if (!$resource) { $message = 'Error creating resource: '; foreach ($errors as $err) { foreach ($err as $key => $value) { - $message .= "[$key] $value" . PHP_EOL; + $message .= "[$key] $value" . \PHP_EOL; } } - throw new \RuntimeException(trim($message)); + throw new \RuntimeException(\trim($message)); } return $resource; } + /** + * @return resource + */ private function createStream(RequestInterface $request, array $options) { static $methods; if (!$methods) { - $methods = array_flip(get_class_methods(__CLASS__)); + $methods = \array_flip(\get_class_methods(__CLASS__)); + } + + if (!\in_array($request->getUri()->getScheme(), ['http', 'https'])) { + throw new RequestException(\sprintf("The scheme '%s' is not supported.", $request->getUri()->getScheme()), $request); } // HTTP/1.1 streams using the PHP stream wrapper require a @@ -279,7 +286,7 @@ class StreamHandler $params = []; $context = $this->getDefaultContext($request); - if (isset($options['on_headers']) && !is_callable($options['on_headers'])) { + if (isset($options['on_headers']) && !\is_callable($options['on_headers'])) { throw new \InvalidArgumentException('on_headers must be callable'); } @@ -293,42 +300,39 @@ class StreamHandler } if (isset($options['stream_context'])) { - if (!is_array($options['stream_context'])) { + if (!\is_array($options['stream_context'])) { throw new \InvalidArgumentException('stream_context must be an array'); } - $context = array_replace_recursive( - $context, - $options['stream_context'] - ); + $context = \array_replace_recursive($context, $options['stream_context']); } // Microsoft NTLM authentication only supported with curl handler - if (isset($options['auth']) - && is_array($options['auth']) - && isset($options['auth'][2]) - && 'ntlm' == $options['auth'][2] - ) { + if (isset($options['auth'][2]) && 'ntlm' === $options['auth'][2]) { throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler'); } $uri = $this->resolveHost($request, $options); - $context = $this->createResource( - function () use ($context, $params) { - return stream_context_create($context, $params); + $contextResource = $this->createResource( + static function () use ($context, $params) { + return \stream_context_create($context, $params); } ); return $this->createResource( - function () use ($uri, &$http_response_header, $context, $options) { - $resource = fopen((string) $uri, 'r', null, $context); - $this->lastHeaders = $http_response_header; + function () use ($uri, &$http_response_header, $contextResource, $context, $options, $request) { + $resource = @\fopen((string) $uri, 'r', false, $contextResource); + $this->lastHeaders = $http_response_header ?? []; + + if (false === $resource) { + throw new ConnectException(sprintf('Connection refused for URI %s', $uri), $request, null, $context); + } if (isset($options['read_timeout'])) { $readTimeout = $options['read_timeout']; $sec = (int) $readTimeout; $usec = ($readTimeout - $sec) * 100000; - stream_set_timeout($resource, $sec, $usec); + \stream_set_timeout($resource, $sec, $usec); } return $resource; @@ -336,42 +340,31 @@ class StreamHandler ); } - private function resolveHost(RequestInterface $request, array $options) + private function resolveHost(RequestInterface $request, array $options): UriInterface { $uri = $request->getUri(); - if (isset($options['force_ip_resolve']) && !filter_var($uri->getHost(), FILTER_VALIDATE_IP)) { + if (isset($options['force_ip_resolve']) && !\filter_var($uri->getHost(), \FILTER_VALIDATE_IP)) { if ('v4' === $options['force_ip_resolve']) { - $records = dns_get_record($uri->getHost(), DNS_A); - if (!isset($records[0]['ip'])) { - throw new ConnectException( - sprintf( - "Could not resolve IPv4 address for host '%s'", - $uri->getHost() - ), - $request - ); + $records = \dns_get_record($uri->getHost(), \DNS_A); + if (false === $records || !isset($records[0]['ip'])) { + throw new ConnectException(\sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request); } - $uri = $uri->withHost($records[0]['ip']); - } elseif ('v6' === $options['force_ip_resolve']) { - $records = dns_get_record($uri->getHost(), DNS_AAAA); - if (!isset($records[0]['ipv6'])) { - throw new ConnectException( - sprintf( - "Could not resolve IPv6 address for host '%s'", - $uri->getHost() - ), - $request - ); + return $uri->withHost($records[0]['ip']); + } + if ('v6' === $options['force_ip_resolve']) { + $records = \dns_get_record($uri->getHost(), \DNS_AAAA); + if (false === $records || !isset($records[0]['ipv6'])) { + throw new ConnectException(\sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request); } - $uri = $uri->withHost('[' . $records[0]['ipv6'] . ']'); + return $uri->withHost('[' . $records[0]['ipv6'] . ']'); } } return $uri; } - private function getDefaultContext(RequestInterface $request) + private function getDefaultContext(RequestInterface $request): array { $headers = ''; foreach ($request->getHeaders() as $name => $value) { @@ -388,6 +381,9 @@ class StreamHandler 'ignore_errors' => true, 'follow_location' => 0, ], + 'ssl' => [ + 'peer_name' => $request->getUri()->getHost(), + ], ]; $body = (string) $request->getBody(); @@ -400,55 +396,100 @@ class StreamHandler } } - $context['http']['header'] = rtrim($context['http']['header']); + $context['http']['header'] = \rtrim($context['http']['header']); return $context; } - private function add_proxy(RequestInterface $request, &$options, $value, &$params) + /** + * @param mixed $value as passed via Request transfer options. + */ + private function add_proxy(RequestInterface $request, array &$options, $value, array &$params): void { - if (!is_array($value)) { - $options['http']['proxy'] = $value; + $uri = null; + + if (!\is_array($value)) { + $uri = $value; } else { $scheme = $request->getUri()->getScheme(); if (isset($value[$scheme])) { - if (!isset($value['no']) - || !\GuzzleHttp\is_host_in_noproxy( - $request->getUri()->getHost(), - $value['no'] - ) - ) { - $options['http']['proxy'] = $value[$scheme]; + if (!isset($value['no']) || !Utils::isHostInNoProxy($request->getUri()->getHost(), $value['no'])) { + $uri = $value[$scheme]; } } } + + if (!$uri) { + return; + } + + $parsed = $this->parse_proxy($uri); + $options['http']['proxy'] = $parsed['proxy']; + + if ($parsed['auth']) { + if (!isset($options['http']['header'])) { + $options['http']['header'] = []; + } + $options['http']['header'] .= "\r\nProxy-Authorization: {$parsed['auth']}"; + } } - private function add_timeout(RequestInterface $request, &$options, $value, &$params) + /** + * Parses the given proxy URL to make it compatible with the format PHP's stream context expects. + */ + private function parse_proxy(string $url): array + { + $parsed = \parse_url($url); + + if ($parsed !== false && isset($parsed['scheme']) && $parsed['scheme'] === 'http') { + if (isset($parsed['host']) && isset($parsed['port'])) { + $auth = null; + if (isset($parsed['user']) && isset($parsed['pass'])) { + $auth = \base64_encode("{$parsed['user']}:{$parsed['pass']}"); + } + + return [ + 'proxy' => "tcp://{$parsed['host']}:{$parsed['port']}", + 'auth' => $auth ? "Basic {$auth}" : null, + ]; + } + } + + // Return proxy as-is. + return [ + 'proxy' => $url, + 'auth' => null, + ]; + } + + /** + * @param mixed $value as passed via Request transfer options. + */ + private function add_timeout(RequestInterface $request, array &$options, $value, array &$params): void { if ($value > 0) { $options['http']['timeout'] = $value; } } - private function add_verify(RequestInterface $request, &$options, $value, &$params) + /** + * @param mixed $value as passed via Request transfer options. + */ + private function add_verify(RequestInterface $request, array &$options, $value, array &$params): void { - if ($value === true) { - // PHP 5.6 or greater will find the system cert by default. When - // < 5.6, use the Guzzle bundled cacert. - if (PHP_VERSION_ID < 50600) { - $options['ssl']['cafile'] = \GuzzleHttp\default_ca_bundle(); - } - } elseif (is_string($value)) { - $options['ssl']['cafile'] = $value; - if (!file_exists($value)) { - throw new \RuntimeException("SSL CA bundle not found: $value"); - } - } elseif ($value === false) { + if ($value === false) { $options['ssl']['verify_peer'] = false; $options['ssl']['verify_peer_name'] = false; + return; - } else { + } + + if (\is_string($value)) { + $options['ssl']['cafile'] = $value; + if (!\file_exists($value)) { + throw new \RuntimeException("SSL CA bundle not found: $value"); + } + } elseif ($value !== true) { throw new \InvalidArgumentException('Invalid verify request option'); } @@ -457,88 +498,95 @@ class StreamHandler $options['ssl']['allow_self_signed'] = false; } - private function add_cert(RequestInterface $request, &$options, $value, &$params) + /** + * @param mixed $value as passed via Request transfer options. + */ + private function add_cert(RequestInterface $request, array &$options, $value, array &$params): void { - if (is_array($value)) { + if (\is_array($value)) { $options['ssl']['passphrase'] = $value[1]; $value = $value[0]; } - if (!file_exists($value)) { + if (!\file_exists($value)) { throw new \RuntimeException("SSL certificate not found: {$value}"); } $options['ssl']['local_cert'] = $value; } - private function add_progress(RequestInterface $request, &$options, $value, &$params) + /** + * @param mixed $value as passed via Request transfer options. + */ + private function add_progress(RequestInterface $request, array &$options, $value, array &$params): void { - $this->addNotification( + self::addNotification( $params, - function ($code, $a, $b, $c, $transferred, $total) use ($value) { - if ($code == STREAM_NOTIFY_PROGRESS) { - $value($total, $transferred, null, null); + static function ($code, $a, $b, $c, $transferred, $total) use ($value) { + if ($code == \STREAM_NOTIFY_PROGRESS) { + // The upload progress cannot be determined. Use 0 for cURL compatibility: + // https://curl.se/libcurl/c/CURLOPT_PROGRESSFUNCTION.html + $value($total, $transferred, 0, 0); } } ); } - private function add_debug(RequestInterface $request, &$options, $value, &$params) + /** + * @param mixed $value as passed via Request transfer options. + */ + private function add_debug(RequestInterface $request, array &$options, $value, array &$params): void { if ($value === false) { return; } static $map = [ - STREAM_NOTIFY_CONNECT => 'CONNECT', - STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', - STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT', - STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS', - STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS', - STREAM_NOTIFY_REDIRECTED => 'REDIRECTED', - STREAM_NOTIFY_PROGRESS => 'PROGRESS', - STREAM_NOTIFY_FAILURE => 'FAILURE', - STREAM_NOTIFY_COMPLETED => 'COMPLETED', - STREAM_NOTIFY_RESOLVE => 'RESOLVE', + \STREAM_NOTIFY_CONNECT => 'CONNECT', + \STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', + \STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT', + \STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS', + \STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS', + \STREAM_NOTIFY_REDIRECTED => 'REDIRECTED', + \STREAM_NOTIFY_PROGRESS => 'PROGRESS', + \STREAM_NOTIFY_FAILURE => 'FAILURE', + \STREAM_NOTIFY_COMPLETED => 'COMPLETED', + \STREAM_NOTIFY_RESOLVE => 'RESOLVE', ]; - static $args = ['severity', 'message', 'message_code', - 'bytes_transferred', 'bytes_max']; + static $args = ['severity', 'message', 'message_code', 'bytes_transferred', 'bytes_max']; - $value = \GuzzleHttp\debug_resource($value); + $value = Utils::debugResource($value); $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment(''); - $this->addNotification( + self::addNotification( $params, - function () use ($ident, $value, $map, $args) { - $passed = func_get_args(); - $code = array_shift($passed); - fprintf($value, '<%s> [%s] ', $ident, $map[$code]); - foreach (array_filter($passed) as $i => $v) { - fwrite($value, $args[$i] . ': "' . $v . '" '); + static function (int $code, ...$passed) use ($ident, $value, $map, $args): void { + \fprintf($value, '<%s> [%s] ', $ident, $map[$code]); + foreach (\array_filter($passed) as $i => $v) { + \fwrite($value, $args[$i] . ': "' . $v . '" '); } - fwrite($value, "\n"); + \fwrite($value, "\n"); } ); } - private function addNotification(array &$params, callable $notify) + private static function addNotification(array &$params, callable $notify): void { // Wrap the existing function if needed. if (!isset($params['notification'])) { $params['notification'] = $notify; } else { - $params['notification'] = $this->callArray([ + $params['notification'] = self::callArray([ $params['notification'], $notify ]); } } - private function callArray(array $functions) + private static function callArray(array $functions): callable { - return function () use ($functions) { - $args = func_get_args(); + return static function (...$args) use ($functions) { foreach ($functions as $fn) { - call_user_func_array($fn, $args); + $fn(...$args); } }; } diff --git a/lib/guzzlehttp/guzzle/src/HandlerStack.php b/lib/guzzlehttp/guzzle/src/HandlerStack.php index 6a49cc069..e0a1d1191 100644 --- a/lib/guzzlehttp/guzzle/src/HandlerStack.php +++ b/lib/guzzlehttp/guzzle/src/HandlerStack.php @@ -1,4 +1,5 @@ push(Middleware::httpErrors(), 'http_errors'); $stack->push(Middleware::redirect(), 'allow_redirects'); $stack->push(Middleware::cookies(), 'cookies'); @@ -49,7 +56,7 @@ class HandlerStack } /** - * @param callable $handler Underlying HTTP handler. + * @param (callable(RequestInterface, array): PromiseInterface)|null $handler Underlying HTTP handler. */ public function __construct(callable $handler = null) { @@ -59,9 +66,6 @@ class HandlerStack /** * Invokes the handler stack as a composed handler * - * @param RequestInterface $request - * @param array $options - * * @return ResponseInterface|PromiseInterface */ public function __invoke(RequestInterface $request, array $options) @@ -80,12 +84,13 @@ class HandlerStack { $depth = 0; $stack = []; - if ($this->handler) { + + if ($this->handler !== null) { $stack[] = "0) Handler: " . $this->debugCallable($this->handler); } $result = ''; - foreach (array_reverse($this->stack) as $tuple) { + foreach (\array_reverse($this->stack) as $tuple) { $depth++; $str = "{$depth}) Name: '{$tuple[1]}', "; $str .= "Function: " . $this->debugCallable($tuple[0]); @@ -93,7 +98,7 @@ class HandlerStack $stack[] = $str; } - foreach (array_keys($stack) as $k) { + foreach (\array_keys($stack) as $k) { $result .= "< {$stack[$k]}\n"; } @@ -103,10 +108,10 @@ class HandlerStack /** * Set the HTTP handler that actually returns a promise. * - * @param callable $handler Accepts a request and array of options and - * returns a Promise. + * @param callable(RequestInterface, array): PromiseInterface $handler Accepts a request and array of options and + * returns a Promise. */ - public function setHandler(callable $handler) + public function setHandler(callable $handler): void { $this->handler = $handler; $this->cached = null; @@ -114,33 +119,31 @@ class HandlerStack /** * Returns true if the builder has a handler. - * - * @return bool */ - public function hasHandler() + public function hasHandler(): bool { - return (bool) $this->handler; + return $this->handler !== null ; } /** * Unshift a middleware to the bottom of the stack. * - * @param callable $middleware Middleware function - * @param string $name Name to register for this middleware. + * @param callable(callable): callable $middleware Middleware function + * @param string $name Name to register for this middleware. */ - public function unshift(callable $middleware, $name = null) + public function unshift(callable $middleware, ?string $name = null): void { - array_unshift($this->stack, [$middleware, $name]); + \array_unshift($this->stack, [$middleware, $name]); $this->cached = null; } /** * Push a middleware to the top of the stack. * - * @param callable $middleware Middleware function - * @param string $name Name to register for this middleware. + * @param callable(callable): callable $middleware Middleware function + * @param string $name Name to register for this middleware. */ - public function push(callable $middleware, $name = '') + public function push(callable $middleware, string $name = ''): void { $this->stack[] = [$middleware, $name]; $this->cached = null; @@ -149,11 +152,11 @@ class HandlerStack /** * Add a middleware before another middleware by name. * - * @param string $findName Middleware to find - * @param callable $middleware Middleware function - * @param string $withName Name to register for this middleware. + * @param string $findName Middleware to find + * @param callable(callable): callable $middleware Middleware function + * @param string $withName Name to register for this middleware. */ - public function before($findName, callable $middleware, $withName = '') + public function before(string $findName, callable $middleware, string $withName = ''): void { $this->splice($findName, $withName, $middleware, true); } @@ -161,11 +164,11 @@ class HandlerStack /** * Add a middleware after another middleware by name. * - * @param string $findName Middleware to find - * @param callable $middleware Middleware function - * @param string $withName Name to register for this middleware. + * @param string $findName Middleware to find + * @param callable(callable): callable $middleware Middleware function + * @param string $withName Name to register for this middleware. */ - public function after($findName, callable $middleware, $withName = '') + public function after(string $findName, callable $middleware, string $withName = ''): void { $this->splice($findName, $withName, $middleware, false); } @@ -175,13 +178,17 @@ class HandlerStack * * @param callable|string $remove Middleware to remove by instance or name. */ - public function remove($remove) + public function remove($remove): void { + if (!is_string($remove) && !is_callable($remove)) { + trigger_deprecation('guzzlehttp/guzzle', '7.4', 'Not passing a callable or string to %s::%s() is deprecated and will cause an error in 8.0.', __CLASS__, __FUNCTION__); + } + $this->cached = null; - $idx = is_callable($remove) ? 0 : 1; - $this->stack = array_values(array_filter( + $idx = \is_callable($remove) ? 0 : 1; + $this->stack = \array_values(\array_filter( $this->stack, - function ($tuple) use ($idx, $remove) { + static function ($tuple) use ($idx, $remove) { return $tuple[$idx] !== $remove; } )); @@ -190,16 +197,17 @@ class HandlerStack /** * Compose the middleware and handler into a single callable function. * - * @return callable + * @return callable(RequestInterface, array): PromiseInterface */ - public function resolve() + public function resolve(): callable { - if (!$this->cached) { - if (!($prev = $this->handler)) { + if ($this->cached === null) { + if (($prev = $this->handler) === null) { throw new \LogicException('No handler has been specified'); } - foreach (array_reverse($this->stack) as $fn) { + foreach (\array_reverse($this->stack) as $fn) { + /** @var callable(RequestInterface, array): PromiseInterface $prev */ $prev = $fn[0]($prev); } @@ -209,11 +217,7 @@ class HandlerStack return $this->cached; } - /** - * @param string $name - * @return int - */ - private function findByName($name) + private function findByName(string $name): int { foreach ($this->stack as $k => $v) { if ($v[1] === $name) { @@ -226,13 +230,8 @@ class HandlerStack /** * Splices a function into the middleware list at a specific position. - * - * @param string $findName - * @param string $withName - * @param callable $middleware - * @param bool $before */ - private function splice($findName, $withName, callable $middleware, $before) + private function splice(string $findName, string $withName, callable $middleware, bool $before): void { $this->cached = null; $idx = $this->findByName($findName); @@ -240,38 +239,37 @@ class HandlerStack if ($before) { if ($idx === 0) { - array_unshift($this->stack, $tuple); + \array_unshift($this->stack, $tuple); } else { $replacement = [$tuple, $this->stack[$idx]]; - array_splice($this->stack, $idx, 1, $replacement); + \array_splice($this->stack, $idx, 1, $replacement); } - } elseif ($idx === count($this->stack) - 1) { + } elseif ($idx === \count($this->stack) - 1) { $this->stack[] = $tuple; } else { $replacement = [$this->stack[$idx], $tuple]; - array_splice($this->stack, $idx, 1, $replacement); + \array_splice($this->stack, $idx, 1, $replacement); } } /** * Provides a debug string for a given callable. * - * @param array|callable $fn Function to write as a string. - * - * @return string + * @param callable|string $fn Function to write as a string. */ - private function debugCallable($fn) + private function debugCallable($fn): string { - if (is_string($fn)) { + if (\is_string($fn)) { return "callable({$fn})"; } - if (is_array($fn)) { - return is_string($fn[0]) + if (\is_array($fn)) { + return \is_string($fn[0]) ? "callable({$fn[0]}::{$fn[1]})" - : "callable(['" . get_class($fn[0]) . "', '{$fn[1]}'])"; + : "callable(['" . \get_class($fn[0]) . "', '{$fn[1]}'])"; } - return 'callable(' . spl_object_hash($fn) . ')'; + /** @var object $fn */ + return 'callable(' . \spl_object_hash($fn) . ')'; } } diff --git a/lib/guzzlehttp/guzzle/src/MessageFormatter.php b/lib/guzzlehttp/guzzle/src/MessageFormatter.php index dc36bb524..da499547f 100644 --- a/lib/guzzlehttp/guzzle/src/MessageFormatter.php +++ b/lib/guzzlehttp/guzzle/src/MessageFormatter.php @@ -1,4 +1,5 @@ >>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}"; - const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}'; + public const CLF = "{hostname} {req_header_User-Agent} - [{date_common_log}] \"{method} {target} HTTP/{version}\" {code} {res_header_Content-Length}"; + public const DEBUG = ">>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}"; + public const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}'; - /** @var string Template used to format log messages */ + /** + * @var string Template used to format log messages + */ private $template; /** * @param string $template Log message template */ - public function __construct($template = self::CLF) + public function __construct(?string $template = self::CLF) { $this->template = $template ?: self::CLF; } @@ -57,20 +64,16 @@ class MessageFormatter /** * Returns a formatted message string. * - * @param RequestInterface $request Request that was sent - * @param ResponseInterface $response Response that was received - * @param \Exception $error Exception that was received - * - * @return string + * @param RequestInterface $request Request that was sent + * @param ResponseInterface|null $response Response that was received + * @param \Throwable|null $error Exception that was received */ - public function format( - RequestInterface $request, - ResponseInterface $response = null, - \Exception $error = null - ) { + public function format(RequestInterface $request, ?ResponseInterface $response = null, ?\Throwable $error = null): string + { $cache = []; - return preg_replace_callback( + /** @var string */ + return \preg_replace_callback( '/{\s*([A-Za-z_\-\.0-9]+)\s*}/', function (array $matches) use ($request, $response, $error, &$cache) { if (isset($cache[$matches[1]])) { @@ -80,20 +83,20 @@ class MessageFormatter $result = ''; switch ($matches[1]) { case 'request': - $result = Psr7\str($request); + $result = Psr7\Message::toString($request); break; case 'response': - $result = $response ? Psr7\str($response) : ''; + $result = $response ? Psr7\Message::toString($response) : ''; break; case 'req_headers': - $result = trim($request->getMethod() + $result = \trim($request->getMethod() . ' ' . $request->getRequestTarget()) . ' HTTP/' . $request->getProtocolVersion() . "\r\n" . $this->headers($request); break; case 'res_headers': $result = $response ? - sprintf( + \sprintf( 'HTTP/%s %d %s', $response->getProtocolVersion(), $response->getStatusCode(), @@ -102,17 +105,29 @@ class MessageFormatter : 'NULL'; break; case 'req_body': - $result = $request->getBody(); + $result = $request->getBody()->__toString(); break; case 'res_body': - $result = $response ? $response->getBody() : 'NULL'; + if (!$response instanceof ResponseInterface) { + $result = 'NULL'; + break; + } + + $body = $response->getBody(); + + if (!$body->isSeekable()) { + $result = 'RESPONSE_NOT_LOGGEABLE'; + break; + } + + $result = $response->getBody()->__toString(); break; case 'ts': case 'date_iso_8601': - $result = gmdate('c'); + $result = \gmdate('c'); break; case 'date_common_log': - $result = date('d/M/Y:H:i:s O'); + $result = \date('d/M/Y:H:i:s O'); break; case 'method': $result = $request->getMethod(); @@ -122,7 +137,7 @@ class MessageFormatter break; case 'uri': case 'url': - $result = $request->getUri(); + $result = $request->getUri()->__toString(); break; case 'target': $result = $request->getRequestTarget(); @@ -139,7 +154,7 @@ class MessageFormatter $result = $request->getHeaderLine('Host'); break; case 'hostname': - $result = gethostname(); + $result = \gethostname(); break; case 'code': $result = $response ? $response->getStatusCode() : 'NULL'; @@ -152,11 +167,11 @@ class MessageFormatter break; default: // handle prefixed dynamic headers - if (strpos($matches[1], 'req_header_') === 0) { - $result = $request->getHeaderLine(substr($matches[1], 11)); - } elseif (strpos($matches[1], 'res_header_') === 0) { + if (\strpos($matches[1], 'req_header_') === 0) { + $result = $request->getHeaderLine(\substr($matches[1], 11)); + } elseif (\strpos($matches[1], 'res_header_') === 0) { $result = $response - ? $response->getHeaderLine(substr($matches[1], 11)) + ? $response->getHeaderLine(\substr($matches[1], 11)) : 'NULL'; } } @@ -170,16 +185,14 @@ class MessageFormatter /** * Get headers from message as string - * - * @return string */ - private function headers(MessageInterface $message) + private function headers(MessageInterface $message): string { $result = ''; foreach ($message->getHeaders() as $name => $values) { - $result .= $name . ': ' . implode(', ', $values) . "\r\n"; + $result .= $name . ': ' . \implode(', ', $values) . "\r\n"; } - return trim($result); + return \trim($result); } } diff --git a/lib/guzzlehttp/guzzle/src/MessageFormatterInterface.php b/lib/guzzlehttp/guzzle/src/MessageFormatterInterface.php new file mode 100644 index 000000000..a39ac248e --- /dev/null +++ b/lib/guzzlehttp/guzzle/src/MessageFormatterInterface.php @@ -0,0 +1,18 @@ +withCookieHeader($request); return $handler($request, $options) ->then( - function ($response) use ($cookieJar, $request) { + static function (ResponseInterface $response) use ($cookieJar, $request): ResponseInterface { $cookieJar->extractCookies($request, $response); return $response; } @@ -45,24 +47,26 @@ final class Middleware /** * Middleware that throws exceptions for 4xx or 5xx responses when the - * "http_error" request option is set to true. + * "http_errors" request option is set to true. * - * @return callable Returns a function that accepts the next handler. + * @param BodySummarizerInterface|null $bodySummarizer The body summarizer to use in exception messages. + * + * @return callable(callable): callable Returns a function that accepts the next handler. */ - public static function httpErrors() + public static function httpErrors(BodySummarizerInterface $bodySummarizer = null): callable { - return function (callable $handler) { - return function ($request, array $options) use ($handler) { + return static function (callable $handler) use ($bodySummarizer): callable { + return static function ($request, array $options) use ($handler, $bodySummarizer) { if (empty($options['http_errors'])) { return $handler($request, $options); } return $handler($request, $options)->then( - function (ResponseInterface $response) use ($request) { + static function (ResponseInterface $response) use ($request, $bodySummarizer) { $code = $response->getStatusCode(); if ($code < 400) { return $response; } - throw RequestException::create($request, $response); + throw RequestException::create($request, $response, null, [], $bodySummarizer); } ); }; @@ -72,21 +76,22 @@ final class Middleware /** * Middleware that pushes history data to an ArrayAccess container. * - * @param array|\ArrayAccess $container Container to hold the history (by reference). + * @param array|\ArrayAccess $container Container to hold the history (by reference). + * + * @return callable(callable): callable Returns a function that accepts the next handler. * - * @return callable Returns a function that accepts the next handler. * @throws \InvalidArgumentException if container is not an array or ArrayAccess. */ - public static function history(&$container) + public static function history(&$container): callable { - if (!is_array($container) && !$container instanceof \ArrayAccess) { + if (!\is_array($container) && !$container instanceof \ArrayAccess) { throw new \InvalidArgumentException('history container must be an array or object implementing ArrayAccess'); } - return function (callable $handler) use (&$container) { - return function ($request, array $options) use ($handler, &$container) { + return static function (callable $handler) use (&$container): callable { + return static function (RequestInterface $request, array $options) use ($handler, &$container) { return $handler($request, $options)->then( - function ($value) use ($request, &$container, $options) { + static function ($value) use ($request, &$container, $options) { $container[] = [ 'request' => $request, 'response' => $value, @@ -95,14 +100,14 @@ final class Middleware ]; return $value; }, - function ($reason) use ($request, &$container, $options) { + static function ($reason) use ($request, &$container, $options) { $container[] = [ 'request' => $request, 'response' => null, 'error' => $reason, 'options' => $options ]; - return \GuzzleHttp\Promise\rejection_for($reason); + return P\Create::rejectionFor($reason); } ); }; @@ -122,10 +127,10 @@ final class Middleware * * @return callable Returns a function that accepts the next handler. */ - public static function tap(callable $before = null, callable $after = null) + public static function tap(callable $before = null, callable $after = null): callable { - return function (callable $handler) use ($before, $after) { - return function ($request, array $options) use ($handler, $before, $after) { + return static function (callable $handler) use ($before, $after): callable { + return static function (RequestInterface $request, array $options) use ($handler, $before, $after) { if ($before) { $before($request, $options); } @@ -143,9 +148,9 @@ final class Middleware * * @return callable Returns a function that accepts the next handler. */ - public static function redirect() + public static function redirect(): callable { - return function (callable $handler) { + return static function (callable $handler): RedirectMiddleware { return new RedirectMiddleware($handler); }; } @@ -165,9 +170,9 @@ final class Middleware * * @return callable Returns a function that accepts the next handler. */ - public static function retry(callable $decider, callable $delay = null) + public static function retry(callable $decider, callable $delay = null): callable { - return function (callable $handler) use ($decider, $delay) { + return static function (callable $handler) use ($decider, $delay): RetryMiddleware { return new RetryMiddleware($decider, $handler, $delay); }; } @@ -176,29 +181,34 @@ final class Middleware * Middleware that logs requests, responses, and errors using a message * formatter. * - * @param LoggerInterface $logger Logs messages. - * @param MessageFormatter $formatter Formatter used to create message strings. - * @param string $logLevel Level at which to log requests. + * @phpstan-param \Psr\Log\LogLevel::* $logLevel Level at which to log requests. + * + * @param LoggerInterface $logger Logs messages. + * @param MessageFormatterInterface|MessageFormatter $formatter Formatter used to create message strings. + * @param string $logLevel Level at which to log requests. * * @return callable Returns a function that accepts the next handler. */ - public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = 'info' /* \Psr\Log\LogLevel::INFO */) + public static function log(LoggerInterface $logger, $formatter, string $logLevel = 'info'): callable { - return function (callable $handler) use ($logger, $formatter, $logLevel) { - return function ($request, array $options) use ($handler, $logger, $formatter, $logLevel) { + // To be compatible with Guzzle 7.1.x we need to allow users to pass a MessageFormatter + if (!$formatter instanceof MessageFormatter && !$formatter instanceof MessageFormatterInterface) { + throw new \LogicException(sprintf('Argument 2 to %s::log() must be of type %s', self::class, MessageFormatterInterface::class)); + } + + return static function (callable $handler) use ($logger, $formatter, $logLevel): callable { + return static function (RequestInterface $request, array $options = []) use ($handler, $logger, $formatter, $logLevel) { return $handler($request, $options)->then( - function ($response) use ($logger, $request, $formatter, $logLevel) { + static function ($response) use ($logger, $request, $formatter, $logLevel): ResponseInterface { $message = $formatter->format($request, $response); $logger->log($logLevel, $message); return $response; }, - function ($reason) use ($logger, $request, $formatter) { - $response = $reason instanceof RequestException - ? $reason->getResponse() - : null; - $message = $formatter->format($request, $response, $reason); - $logger->notice($message); - return \GuzzleHttp\Promise\rejection_for($reason); + static function ($reason) use ($logger, $request, $formatter): PromiseInterface { + $response = $reason instanceof RequestException ? $reason->getResponse() : null; + $message = $formatter->format($request, $response, P\Create::exceptionFor($reason)); + $logger->error($message); + return P\Create::rejectionFor($reason); } ); }; @@ -208,12 +218,10 @@ final class Middleware /** * This middleware adds a default content-type if possible, a default * content-length or transfer-encoding header, and the expect header. - * - * @return callable */ - public static function prepareBody() + public static function prepareBody(): callable { - return function (callable $handler) { + return static function (callable $handler): PrepareBodyMiddleware { return new PrepareBodyMiddleware($handler); }; } @@ -224,12 +232,11 @@ final class Middleware * * @param callable $fn Function that accepts a RequestInterface and returns * a RequestInterface. - * @return callable */ - public static function mapRequest(callable $fn) + public static function mapRequest(callable $fn): callable { - return function (callable $handler) use ($fn) { - return function ($request, array $options) use ($handler, $fn) { + return static function (callable $handler) use ($fn): callable { + return static function (RequestInterface $request, array $options) use ($handler, $fn) { return $handler($fn($request), $options); }; }; @@ -241,12 +248,11 @@ final class Middleware * * @param callable $fn Function that accepts a ResponseInterface and * returns a ResponseInterface. - * @return callable */ - public static function mapResponse(callable $fn) + public static function mapResponse(callable $fn): callable { - return function (callable $handler) use ($fn) { - return function ($request, array $options) use ($handler, $fn) { + return static function (callable $handler) use ($fn): callable { + return static function (RequestInterface $request, array $options) use ($handler, $fn) { return $handler($request, $options)->then($fn); }; }; diff --git a/lib/guzzlehttp/guzzle/src/Pool.php b/lib/guzzlehttp/guzzle/src/Pool.php index 5838db4f4..6277c61fb 100644 --- a/lib/guzzlehttp/guzzle/src/Pool.php +++ b/lib/guzzlehttp/guzzle/src/Pool.php @@ -1,6 +1,8 @@ $rfn) { if ($rfn instanceof RequestInterface) { yield $key => $client->sendAsync($rfn, $opts); - } elseif (is_callable($rfn)) { + } elseif (\is_callable($rfn)) { yield $key => $rfn($opts); } else { - throw new \InvalidArgumentException('Each value yielded by ' - . 'the iterator must be a Psr7\Http\Message\RequestInterface ' - . 'or a callable that returns a promise that fulfills ' - . 'with a Psr7\Message\Http\ResponseInterface object.'); + throw new \InvalidArgumentException('Each value yielded by the iterator must be a Psr7\Http\Message\RequestInterface or a callable that returns a promise that fulfills with a Psr7\Message\Http\ResponseInterface object.'); } } }; @@ -72,10 +69,8 @@ class Pool implements PromisorInterface /** * Get promise - * - * @return PromiseInterface */ - public function promise() + public function promise(): PromiseInterface { return $this->each->promise(); } @@ -91,41 +86,37 @@ class Pool implements PromisorInterface * @param ClientInterface $client Client used to send the requests * @param array|\Iterator $requests Requests to send concurrently. * @param array $options Passes through the options available in - * {@see GuzzleHttp\Pool::__construct} + * {@see \GuzzleHttp\Pool::__construct} * * @return array Returns an array containing the response or an exception * in the same order that the requests were sent. + * * @throws \InvalidArgumentException if the event format is incorrect. */ - public static function batch( - ClientInterface $client, - $requests, - array $options = [] - ) { + public static function batch(ClientInterface $client, $requests, array $options = []): array + { $res = []; self::cmpCallback($options, 'fulfilled', $res); self::cmpCallback($options, 'rejected', $res); $pool = new static($client, $requests, $options); $pool->promise()->wait(); - ksort($res); + \ksort($res); return $res; } /** * Execute callback(s) - * - * @return void */ - private static function cmpCallback(array &$options, $name, array &$results) + private static function cmpCallback(array &$options, string $name, array &$results): void { if (!isset($options[$name])) { - $options[$name] = function ($v, $k) use (&$results) { + $options[$name] = static function ($v, $k) use (&$results) { $results[$k] = $v; }; } else { $currentFn = $options[$name]; - $options[$name] = function ($v, $k) use (&$results, $currentFn) { + $options[$name] = static function ($v, $k) use (&$results, $currentFn) { $currentFn($v, $k); $results[$k] = $v; }; diff --git a/lib/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php b/lib/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php index 568a1e906..7ca628338 100644 --- a/lib/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php +++ b/lib/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php @@ -1,34 +1,32 @@ nextHandler = $nextHandler; } - /** - * @param RequestInterface $request - * @param array $options - * - * @return PromiseInterface - */ - public function __invoke(RequestInterface $request, array $options) + public function __invoke(RequestInterface $request, array $options): PromiseInterface { $fn = $this->nextHandler; @@ -42,7 +40,7 @@ class PrepareBodyMiddleware // Add a default content-type if possible. if (!$request->hasHeader('Content-Type')) { if ($uri = $request->getBody()->getMetadata('uri')) { - if ($type = Psr7\mimetype_from_filename($uri)) { + if (is_string($uri) && $type = Psr7\MimeType::fromFilename($uri)) { $modify['set_headers']['Content-Type'] = $type; } } @@ -63,25 +61,20 @@ class PrepareBodyMiddleware // Add the expect header if needed. $this->addExpectHeader($request, $options, $modify); - return $fn(Psr7\modify_request($request, $modify), $options); + return $fn(Psr7\Utils::modifyRequest($request, $modify), $options); } /** * Add expect header - * - * @return void */ - private function addExpectHeader( - RequestInterface $request, - array $options, - array &$modify - ) { + private function addExpectHeader(RequestInterface $request, array $options, array &$modify): void + { // Determine if the Expect header should be used if ($request->hasHeader('Expect')) { return; } - $expect = isset($options['expect']) ? $options['expect'] : null; + $expect = $options['expect'] ?? null; // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0 if ($expect === false || $request->getProtocolVersion() < 1.1) { diff --git a/lib/guzzlehttp/guzzle/src/RedirectMiddleware.php b/lib/guzzlehttp/guzzle/src/RedirectMiddleware.php index 008a29b8c..f67d448be 100644 --- a/lib/guzzlehttp/guzzle/src/RedirectMiddleware.php +++ b/lib/guzzlehttp/guzzle/src/RedirectMiddleware.php @@ -1,10 +1,10 @@ 5, 'protocols' => ['http', 'https'], @@ -29,24 +34,20 @@ class RedirectMiddleware 'track_redirects' => false, ]; - /** @var callable */ + /** + * @var callable(RequestInterface, array): PromiseInterface + */ private $nextHandler; /** - * @param callable $nextHandler Next handler to invoke. + * @param callable(RequestInterface, array): PromiseInterface $nextHandler Next handler to invoke. */ public function __construct(callable $nextHandler) { $this->nextHandler = $nextHandler; } - /** - * @param RequestInterface $request - * @param array $options - * - * @return PromiseInterface - */ - public function __invoke(RequestInterface $request, array $options) + public function __invoke(RequestInterface $request, array $options): PromiseInterface { $fn = $this->nextHandler; @@ -56,7 +57,7 @@ class RedirectMiddleware if ($options['allow_redirects'] === true) { $options['allow_redirects'] = self::$defaultSettings; - } elseif (!is_array($options['allow_redirects'])) { + } elseif (!\is_array($options['allow_redirects'])) { throw new \InvalidArgumentException('allow_redirects must be true, false, or array'); } else { // Merge the default settings with the provided settings @@ -74,24 +75,17 @@ class RedirectMiddleware } /** - * @param RequestInterface $request - * @param array $options - * @param ResponseInterface $response - * * @return ResponseInterface|PromiseInterface */ - public function checkRedirect( - RequestInterface $request, - array $options, - ResponseInterface $response - ) { - if (substr($response->getStatusCode(), 0, 1) != '3' + public function checkRedirect(RequestInterface $request, array $options, ResponseInterface $response) + { + if (\strpos((string) $response->getStatusCode(), '3') !== 0 || !$response->hasHeader('Location') ) { return $response; } - $this->guardMax($request, $options); + $this->guardMax($request, $response, $options); $nextRequest = $this->modifyRequest($request, $options, $response); // If authorization is handled by curl, unset it if URI is cross-origin. @@ -103,15 +97,13 @@ class RedirectMiddleware } if (isset($options['allow_redirects']['on_redirect'])) { - call_user_func( - $options['allow_redirects']['on_redirect'], + ($options['allow_redirects']['on_redirect'])( $request, $response, $nextRequest->getUri() ); } - /** @var PromiseInterface|ResponseInterface $promise */ $promise = $this($nextRequest, $options); // Add headers to be able to track history of redirects. @@ -128,20 +120,19 @@ class RedirectMiddleware /** * Enable tracking on promise. - * - * @return PromiseInterface */ - private function withTracking(PromiseInterface $promise, $uri, $statusCode) + private function withTracking(PromiseInterface $promise, string $uri, int $statusCode): PromiseInterface { return $promise->then( - function (ResponseInterface $response) use ($uri, $statusCode) { + static function (ResponseInterface $response) use ($uri, $statusCode) { // Note that we are pushing to the front of the list as this // would be an earlier response than what is currently present // in the history header. $historyHeader = $response->getHeader(self::HISTORY_HEADER); $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER); - array_unshift($historyHeader, $uri); - array_unshift($statusHeader, $statusCode); + \array_unshift($historyHeader, $uri); + \array_unshift($statusHeader, (string) $statusCode); + return $response->withHeader(self::HISTORY_HEADER, $historyHeader) ->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader); } @@ -151,38 +142,22 @@ class RedirectMiddleware /** * Check for too many redirects. * - * @return void - * * @throws TooManyRedirectsException Too many redirects. */ - private function guardMax(RequestInterface $request, array &$options) + private function guardMax(RequestInterface $request, ResponseInterface $response, array &$options): void { - $current = isset($options['__redirect_count']) - ? $options['__redirect_count'] - : 0; + $current = $options['__redirect_count'] + ?? 0; $options['__redirect_count'] = $current + 1; $max = $options['allow_redirects']['max']; if ($options['__redirect_count'] > $max) { - throw new TooManyRedirectsException( - "Will not follow more than {$max} redirects", - $request - ); + throw new TooManyRedirectsException("Will not follow more than {$max} redirects", $request, $response); } } - /** - * @param RequestInterface $request - * @param array $options - * @param ResponseInterface $response - * - * @return RequestInterface - */ - public function modifyRequest( - RequestInterface $request, - array $options, - ResponseInterface $response - ) { + public function modifyRequest(RequestInterface $request, array $options, ResponseInterface $response): RequestInterface + { // Request modifications to apply. $modify = []; $protocols = $options['allow_redirects']['protocols']; @@ -194,18 +169,21 @@ class RedirectMiddleware if ($statusCode == 303 || ($statusCode <= 302 && !$options['allow_redirects']['strict']) ) { - $modify['method'] = 'GET'; + $safeMethods = ['GET', 'HEAD', 'OPTIONS']; + $requestMethod = $request->getMethod(); + + $modify['method'] = in_array($requestMethod, $safeMethods) ? $requestMethod : 'GET'; $modify['body'] = ''; } $uri = self::redirectUri($request, $response, $protocols); if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) { - $idnOptions = ($options['idn_conversion'] === true) ? IDNA_DEFAULT : $options['idn_conversion']; + $idnOptions = ($options['idn_conversion'] === true) ? \IDNA_DEFAULT : $options['idn_conversion']; $uri = Utils::idnUriConvert($uri, $idnOptions); } $modify['uri'] = $uri; - Psr7\rewind_body($request); + Psr7\Message::rewindBody($request); // Add the Referer header if it is told to do so and only // add the header if we are not redirecting from https to http. @@ -224,39 +202,25 @@ class RedirectMiddleware $modify['remove_headers'][] = 'Cookie'; } - return Psr7\modify_request($request, $modify); + return Psr7\Utils::modifyRequest($request, $modify); } /** * Set the appropriate URL on the request based on the location header. - * - * @param RequestInterface $request - * @param ResponseInterface $response - * @param array $protocols - * - * @return UriInterface */ private static function redirectUri( RequestInterface $request, ResponseInterface $response, array $protocols - ) { + ): UriInterface { $location = Psr7\UriResolver::resolve( $request->getUri(), new Psr7\Uri($response->getHeaderLine('Location')) ); // Ensure that the redirect URI is allowed based on the protocols. - if (!in_array($location->getScheme(), $protocols)) { - throw new BadResponseException( - sprintf( - 'Redirect URI, %s, does not use one of the allowed redirect protocols: %s', - $location, - implode(', ', $protocols) - ), - $request, - $response - ); + if (!\in_array($location->getScheme(), $protocols)) { + throw new BadResponseException(\sprintf('Redirect URI, %s, does not use one of the allowed redirect protocols: %s', $location, \implode(', ', $protocols)), $request, $response); } return $location; diff --git a/lib/guzzlehttp/guzzle/src/RequestOptions.php b/lib/guzzlehttp/guzzle/src/RequestOptions.php index 355f658f0..20b31bc20 100644 --- a/lib/guzzlehttp/guzzle/src/RequestOptions.php +++ b/lib/guzzlehttp/guzzle/src/RequestOptions.php @@ -1,4 +1,5 @@ decider = $decider; $this->nextHandler = $nextHandler; $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; @@ -45,22 +50,14 @@ class RetryMiddleware /** * Default exponential backoff delay function. * - * @param int $retries - * * @return int milliseconds. */ - public static function exponentialDelay($retries) + public static function exponentialDelay(int $retries): int { - return (int) pow(2, $retries - 1) * 1000; + return (int) \pow(2, $retries - 1) * 1000; } - /** - * @param RequestInterface $request - * @param array $options - * - * @return PromiseInterface - */ - public function __invoke(RequestInterface $request, array $options) + public function __invoke(RequestInterface $request, array $options): PromiseInterface { if (!isset($options['retries'])) { $options['retries'] = 0; @@ -76,52 +73,43 @@ class RetryMiddleware /** * Execute fulfilled closure - * - * @return mixed */ - private function onFulfilled(RequestInterface $req, array $options) + private function onFulfilled(RequestInterface $request, array $options): callable { - return function ($value) use ($req, $options) { - if (!call_user_func( - $this->decider, + return function ($value) use ($request, $options) { + if (!($this->decider)( $options['retries'], - $req, + $request, $value, null )) { return $value; } - return $this->doRetry($req, $options, $value); + return $this->doRetry($request, $options, $value); }; } /** * Execute rejected closure - * - * @return callable */ - private function onRejected(RequestInterface $req, array $options) + private function onRejected(RequestInterface $req, array $options): callable { return function ($reason) use ($req, $options) { - if (!call_user_func( - $this->decider, + if (!($this->decider)( $options['retries'], $req, null, $reason )) { - return \GuzzleHttp\Promise\rejection_for($reason); + return P\Create::rejectionFor($reason); } return $this->doRetry($req, $options); }; } - /** - * @return self - */ - private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null) + private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null): PromiseInterface { - $options['delay'] = call_user_func($this->delay, ++$options['retries'], $response); + $options['delay'] = ($this->delay)(++$options['retries'], $response); return $this($request, $options); } diff --git a/lib/guzzlehttp/guzzle/src/TransferStats.php b/lib/guzzlehttp/guzzle/src/TransferStats.php index 87fb3c001..93fa334c8 100644 --- a/lib/guzzlehttp/guzzle/src/TransferStats.php +++ b/lib/guzzlehttp/guzzle/src/TransferStats.php @@ -1,4 +1,5 @@ request = $request; $this->response = $response; @@ -38,30 +58,23 @@ final class TransferStats $this->handlerStats = $handlerStats; } - /** - * @return RequestInterface - */ - public function getRequest() + public function getRequest(): RequestInterface { return $this->request; } /** * Returns the response that was received (if any). - * - * @return ResponseInterface|null */ - public function getResponse() + public function getResponse(): ?ResponseInterface { return $this->response; } /** * Returns true if a response was received. - * - * @return bool */ - public function hasResponse() + public function hasResponse(): bool { return $this->response !== null; } @@ -82,10 +95,8 @@ final class TransferStats /** * Get the effective URI the request was sent to. - * - * @return UriInterface */ - public function getEffectiveUri() + public function getEffectiveUri(): UriInterface { return $this->request->getUri(); } @@ -95,17 +106,15 @@ final class TransferStats * * @return float|null Time in seconds. */ - public function getTransferTime() + public function getTransferTime(): ?float { return $this->transferTime; } /** * Gets an array of all of the handler specific transfer data. - * - * @return array */ - public function getHandlerStats() + public function getHandlerStats(): array { return $this->handlerStats; } @@ -117,10 +126,8 @@ final class TransferStats * * @return mixed|null */ - public function getHandlerStat($stat) + public function getHandlerStat(string $stat) { - return isset($this->handlerStats[$stat]) - ? $this->handlerStats[$stat] - : null; + return $this->handlerStats[$stat] ?? null; } } diff --git a/lib/guzzlehttp/guzzle/src/UriTemplate.php b/lib/guzzlehttp/guzzle/src/UriTemplate.php deleted file mode 100644 index 96dcfd09c..000000000 --- a/lib/guzzlehttp/guzzle/src/UriTemplate.php +++ /dev/null @@ -1,237 +0,0 @@ - ['prefix' => '', 'joiner' => ',', 'query' => false], - '+' => ['prefix' => '', 'joiner' => ',', 'query' => false], - '#' => ['prefix' => '#', 'joiner' => ',', 'query' => false], - '.' => ['prefix' => '.', 'joiner' => '.', 'query' => false], - '/' => ['prefix' => '/', 'joiner' => '/', 'query' => false], - ';' => ['prefix' => ';', 'joiner' => ';', 'query' => true], - '?' => ['prefix' => '?', 'joiner' => '&', 'query' => true], - '&' => ['prefix' => '&', 'joiner' => '&', 'query' => true] - ]; - - /** @var array Delimiters */ - private static $delims = [':', '/', '?', '#', '[', ']', '@', '!', '$', - '&', '\'', '(', ')', '*', '+', ',', ';', '=']; - - /** @var array Percent encoded delimiters */ - private static $delimsPct = ['%3A', '%2F', '%3F', '%23', '%5B', '%5D', - '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', - '%3B', '%3D']; - - public function expand($template, array $variables) - { - if (false === strpos($template, '{')) { - return $template; - } - - $this->template = $template; - $this->variables = $variables; - - return preg_replace_callback( - '/\{([^\}]+)\}/', - [$this, 'expandMatch'], - $this->template - ); - } - - /** - * Parse an expression into parts - * - * @param string $expression Expression to parse - * - * @return array Returns an associative array of parts - */ - private function parseExpression($expression) - { - $result = []; - - if (isset(self::$operatorHash[$expression[0]])) { - $result['operator'] = $expression[0]; - $expression = substr($expression, 1); - } else { - $result['operator'] = ''; - } - - foreach (explode(',', $expression) as $value) { - $value = trim($value); - $varspec = []; - if ($colonPos = strpos($value, ':')) { - $varspec['value'] = substr($value, 0, $colonPos); - $varspec['modifier'] = ':'; - $varspec['position'] = (int) substr($value, $colonPos + 1); - } elseif (substr($value, -1) === '*') { - $varspec['modifier'] = '*'; - $varspec['value'] = substr($value, 0, -1); - } else { - $varspec['value'] = (string) $value; - $varspec['modifier'] = ''; - } - $result['values'][] = $varspec; - } - - return $result; - } - - /** - * Process an expansion - * - * @param array $matches Matches met in the preg_replace_callback - * - * @return string Returns the replacement string - */ - private function expandMatch(array $matches) - { - static $rfc1738to3986 = ['+' => '%20', '%7e' => '~']; - - $replacements = []; - $parsed = self::parseExpression($matches[1]); - $prefix = self::$operatorHash[$parsed['operator']]['prefix']; - $joiner = self::$operatorHash[$parsed['operator']]['joiner']; - $useQuery = self::$operatorHash[$parsed['operator']]['query']; - - foreach ($parsed['values'] as $value) { - if (!isset($this->variables[$value['value']])) { - continue; - } - - $variable = $this->variables[$value['value']]; - $actuallyUseQuery = $useQuery; - $expanded = ''; - - if (is_array($variable)) { - $isAssoc = $this->isAssoc($variable); - $kvp = []; - foreach ($variable as $key => $var) { - if ($isAssoc) { - $key = rawurlencode($key); - $isNestedArray = is_array($var); - } else { - $isNestedArray = false; - } - - if (!$isNestedArray) { - $var = rawurlencode($var); - if ($parsed['operator'] === '+' || - $parsed['operator'] === '#' - ) { - $var = $this->decodeReserved($var); - } - } - - if ($value['modifier'] === '*') { - if ($isAssoc) { - if ($isNestedArray) { - // Nested arrays must allow for deeply nested - // structures. - $var = strtr( - http_build_query([$key => $var]), - $rfc1738to3986 - ); - } else { - $var = $key . '=' . $var; - } - } elseif ($key > 0 && $actuallyUseQuery) { - $var = $value['value'] . '=' . $var; - } - } - - $kvp[$key] = $var; - } - - if (empty($variable)) { - $actuallyUseQuery = false; - } elseif ($value['modifier'] === '*') { - $expanded = implode($joiner, $kvp); - if ($isAssoc) { - // Don't prepend the value name when using the explode - // modifier with an associative array. - $actuallyUseQuery = false; - } - } else { - if ($isAssoc) { - // When an associative array is encountered and the - // explode modifier is not set, then the result must be - // a comma separated list of keys followed by their - // respective values. - foreach ($kvp as $k => &$v) { - $v = $k . ',' . $v; - } - } - $expanded = implode(',', $kvp); - } - } else { - if ($value['modifier'] === ':') { - $variable = substr($variable, 0, $value['position']); - } - $expanded = rawurlencode($variable); - if ($parsed['operator'] === '+' || $parsed['operator'] === '#') { - $expanded = $this->decodeReserved($expanded); - } - } - - if ($actuallyUseQuery) { - if (!$expanded && $joiner !== '&') { - $expanded = $value['value']; - } else { - $expanded = $value['value'] . '=' . $expanded; - } - } - - $replacements[] = $expanded; - } - - $ret = implode($joiner, $replacements); - if ($ret && $prefix) { - return $prefix . $ret; - } - - return $ret; - } - - /** - * Determines if an array is associative. - * - * This makes the assumption that input arrays are sequences or hashes. - * This assumption is a tradeoff for accuracy in favor of speed, but it - * should work in almost every case where input is supplied for a URI - * template. - * - * @param array $array Array to check - * - * @return bool - */ - private function isAssoc(array $array) - { - return $array && array_keys($array)[0] !== 0; - } - - /** - * Removes percent encoding on reserved characters (used with + and # - * modifiers). - * - * @param string $string String to fix - * - * @return string - */ - private function decodeReserved($string) - { - return str_replace(self::$delimsPct, self::$delims, $string); - } -} diff --git a/lib/guzzlehttp/guzzle/src/Utils.php b/lib/guzzlehttp/guzzle/src/Utils.php index c698acbf0..91591da2e 100644 --- a/lib/guzzlehttp/guzzle/src/Utils.php +++ b/lib/guzzlehttp/guzzle/src/Utils.php @@ -1,41 +1,331 @@ getHost()) { $asciiHost = self::idnToAsci($uri->getHost(), $options, $info); if ($asciiHost === false) { - $errorBitSet = isset($info['errors']) ? $info['errors'] : 0; + $errorBitSet = $info['errors'] ?? 0; - $errorConstants = array_filter(array_keys(get_defined_constants()), function ($name) { + $errorConstants = array_filter(array_keys(get_defined_constants()), static function (string $name): bool { return substr($name, 0, 11) === 'IDNA_ERROR_'; }); @@ -52,11 +342,10 @@ final class Utils } throw new InvalidArgumentException($errorMessage); - } else { - if ($uri->getHost() !== $asciiHost) { - // Replace URI only if the ASCII version is different - $uri = $uri->withHost($asciiHost); - } + } + if ($uri->getHost() !== $asciiHost) { + // Replace URI only if the ASCII version is different + $uri = $uri->withHost($asciiHost); } } @@ -64,29 +353,30 @@ final class Utils } /** - * @param string $domain - * @param int $options - * @param array $info - * + * @internal + */ + public static function getenv(string $name): ?string + { + if (isset($_SERVER[$name])) { + return (string) $_SERVER[$name]; + } + + if (\PHP_SAPI === 'cli' && ($value = \getenv($name)) !== false && $value !== null) { + return (string) $value; + } + + return null; + } + + /** * @return string|false */ - private static function idnToAsci($domain, $options, &$info = []) + private static function idnToAsci(string $domain, int $options, ?array &$info = []) { - if (\preg_match('%^[ -~]+$%', $domain) === 1) { - return $domain; + if (\function_exists('idn_to_ascii') && \defined('INTL_IDNA_VARIANT_UTS46')) { + return \idn_to_ascii($domain, $options, \INTL_IDNA_VARIANT_UTS46, $info); } - if (\extension_loaded('intl') && defined('INTL_IDNA_VARIANT_UTS46')) { - return \idn_to_ascii($domain, $options, INTL_IDNA_VARIANT_UTS46, $info); - } - - /* - * The Idn class is marked as @internal. Verify that class and method exists. - */ - if (method_exists(Idn::class, 'idn_to_ascii')) { - return Idn::idn_to_ascii($domain, $options, Idn::INTL_IDNA_VARIANT_UTS46, $info); - } - - throw new \RuntimeException('ext-intl or symfony/polyfill-intl-idn not loaded or too old'); + throw new \Error('ext-idn or symfony/polyfill-intl-idn not loaded or too old'); } } diff --git a/lib/guzzlehttp/guzzle/src/functions.php b/lib/guzzlehttp/guzzle/src/functions.php index c2afd8c7b..a70d2cbf3 100644 --- a/lib/guzzlehttp/guzzle/src/functions.php +++ b/lib/guzzlehttp/guzzle/src/functions.php @@ -1,77 +1,34 @@ expand($template, $variables); -} - /** * Debug function used to describe the provided value type and class. * - * @param mixed $input + * @param mixed $input Any type of variable to describe the type of. This + * parameter misses a typehint because of that. * * @return string Returns a string containing the type of the variable and * if a class is provided, the class name. + * + * @deprecated describe_type will be removed in guzzlehttp/guzzle:8.0. Use Utils::describeType instead. */ -function describe_type($input) +function describe_type($input): string { - switch (gettype($input)) { - case 'object': - return 'object(' . get_class($input) . ')'; - case 'array': - return 'array(' . count($input) . ')'; - default: - ob_start(); - var_dump($input); - // normalize float vs double - return str_replace('double(', 'float(', rtrim(ob_get_clean())); - } + return Utils::describeType($input); } /** * Parses an array of header lines into an associative array of headers. * * @param iterable $lines Header lines array of strings in the following - * format: "Name: Value" - * @return array + * format: "Name: Value" + * + * @deprecated headers_from_lines will be removed in guzzlehttp/guzzle:8.0. Use Utils::headersFromLines instead. */ -function headers_from_lines($lines) +function headers_from_lines(iterable $lines): array { - $headers = []; - - foreach ($lines as $line) { - $parts = explode(':', $line, 2); - $headers[trim($parts[0])][] = isset($parts[1]) - ? trim($parts[1]) - : null; - } - - return $headers; + return Utils::headersFromLines($lines); } /** @@ -80,16 +37,12 @@ function headers_from_lines($lines) * @param mixed $value Optional value * * @return resource + * + * @deprecated debug_resource will be removed in guzzlehttp/guzzle:8.0. Use Utils::debugResource instead. */ function debug_resource($value = null) { - if (is_resource($value)) { - return $value; - } elseif (defined('STDOUT')) { - return STDOUT; - } - - return fopen('php://output', 'w'); + return Utils::debugResource($value); } /** @@ -97,50 +50,25 @@ function debug_resource($value = null) * * The returned handler is not wrapped by any default middlewares. * - * @return callable Returns the best handler for the given system. * @throws \RuntimeException if no viable Handler is available. + * + * @return callable(\Psr\Http\Message\RequestInterface, array): \GuzzleHttp\Promise\PromiseInterface Returns the best handler for the given system. + * + * @deprecated choose_handler will be removed in guzzlehttp/guzzle:8.0. Use Utils::chooseHandler instead. */ -function choose_handler() +function choose_handler(): callable { - $handler = null; - if (function_exists('curl_multi_exec') && function_exists('curl_exec')) { - $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler()); - } elseif (function_exists('curl_exec')) { - $handler = new CurlHandler(); - } elseif (function_exists('curl_multi_exec')) { - $handler = new CurlMultiHandler(); - } - - if (ini_get('allow_url_fopen')) { - $handler = $handler - ? Proxy::wrapStreaming($handler, new StreamHandler()) - : new StreamHandler(); - } elseif (!$handler) { - throw new \RuntimeException('GuzzleHttp requires cURL, the ' - . 'allow_url_fopen ini setting, or a custom HTTP handler.'); - } - - return $handler; + return Utils::chooseHandler(); } /** - * Get the default User-Agent string to use with Guzzle + * Get the default User-Agent string to use with Guzzle. * - * @return string + * @deprecated default_user_agent will be removed in guzzlehttp/guzzle:8.0. Use Utils::defaultUserAgent instead. */ -function default_user_agent() +function default_user_agent(): string { - static $defaultAgent = ''; - - if (!$defaultAgent) { - $defaultAgent = 'GuzzleHttp/' . Client::VERSION; - if (extension_loaded('curl') && function_exists('curl_version')) { - $defaultAgent .= ' curl/' . \curl_version()['version']; - } - $defaultAgent .= ' PHP/' . PHP_VERSION; - } - - return $defaultAgent; + return Utils::defaultUserAgent(); } /** @@ -154,82 +82,24 @@ function default_user_agent() * * Note: the result of this function is cached for subsequent calls. * - * @return string * @throws \RuntimeException if no bundle can be found. + * + * @deprecated default_ca_bundle will be removed in guzzlehttp/guzzle:8.0. This function is not needed in PHP 5.6+. */ -function default_ca_bundle() +function default_ca_bundle(): string { - static $cached = null; - static $cafiles = [ - // Red Hat, CentOS, Fedora (provided by the ca-certificates package) - '/etc/pki/tls/certs/ca-bundle.crt', - // Ubuntu, Debian (provided by the ca-certificates package) - '/etc/ssl/certs/ca-certificates.crt', - // FreeBSD (provided by the ca_root_nss package) - '/usr/local/share/certs/ca-root-nss.crt', - // SLES 12 (provided by the ca-certificates package) - '/var/lib/ca-certificates/ca-bundle.pem', - // OS X provided by homebrew (using the default path) - '/usr/local/etc/openssl/cert.pem', - // Google app engine - '/etc/ca-certificates.crt', - // Windows? - 'C:\\windows\\system32\\curl-ca-bundle.crt', - 'C:\\windows\\curl-ca-bundle.crt', - ]; - - if ($cached) { - return $cached; - } - - if ($ca = ini_get('openssl.cafile')) { - return $cached = $ca; - } - - if ($ca = ini_get('curl.cainfo')) { - return $cached = $ca; - } - - foreach ($cafiles as $filename) { - if (file_exists($filename)) { - return $cached = $filename; - } - } - - throw new \RuntimeException( - <<< EOT -No system CA bundle could be found in any of the the common system locations. -PHP versions earlier than 5.6 are not properly configured to use the system's -CA bundle by default. In order to verify peer certificates, you will need to -supply the path on disk to a certificate bundle to the 'verify' request -option: http://docs.guzzlephp.org/en/latest/clients.html#verify. If you do not -need a specific certificate bundle, then Mozilla provides a commonly used CA -bundle which can be downloaded here (provided by the maintainer of cURL): -https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt. Once -you have a CA bundle available on disk, you can set the 'openssl.cafile' PHP -ini setting to point to the path to the file, allowing you to omit the 'verify' -request option. See http://curl.haxx.se/docs/sslcerts.html for more -information. -EOT - ); + return Utils::defaultCaBundle(); } /** * Creates an associative array of lowercase header names to the actual * header casing. * - * @param array $headers - * - * @return array + * @deprecated normalize_header_keys will be removed in guzzlehttp/guzzle:8.0. Use Utils::normalizeHeaderKeys instead. */ -function normalize_header_keys(array $headers) +function normalize_header_keys(array $headers): array { - $result = []; - foreach (array_keys($headers) as $key) { - $result[strtolower($key)] = $key; - } - - return $result; + return Utils::normalizeHeaderKeys($headers); } /** @@ -246,89 +116,52 @@ function normalize_header_keys(array $headers) * 3. The area starts with "." and the area is the last part of the host. e.g. * '.mit.edu' will match any host that ends with '.mit.edu'. * - * @param string $host Host to check against the patterns. - * @param array $noProxyArray An array of host patterns. + * @param string $host Host to check against the patterns. + * @param string[] $noProxyArray An array of host patterns. * - * @return bool + * @throws Exception\InvalidArgumentException + * + * @deprecated is_host_in_noproxy will be removed in guzzlehttp/guzzle:8.0. Use Utils::isHostInNoProxy instead. */ -function is_host_in_noproxy($host, array $noProxyArray) +function is_host_in_noproxy(string $host, array $noProxyArray): bool { - if (strlen($host) === 0) { - throw new \InvalidArgumentException('Empty host provided'); - } - - // Strip port if present. - if (strpos($host, ':')) { - $host = explode($host, ':', 2)[0]; - } - - foreach ($noProxyArray as $area) { - // Always match on wildcards. - if ($area === '*') { - return true; - } elseif (empty($area)) { - // Don't match on empty values. - continue; - } elseif ($area === $host) { - // Exact matches. - return true; - } else { - // Special match if the area when prefixed with ".". Remove any - // existing leading "." and add a new leading ".". - $area = '.' . ltrim($area, '.'); - if (substr($host, -(strlen($area))) === $area) { - return true; - } - } - } - - return false; + return Utils::isHostInNoProxy($host, $noProxyArray); } /** * Wrapper for json_decode that throws when an error occurs. * * @param string $json JSON data to parse - * @param bool $assoc When true, returned objects will be converted + * @param bool $assoc When true, returned objects will be converted * into associative arrays. * @param int $depth User specified recursion depth. * @param int $options Bitmask of JSON decode options. * - * @return mixed + * @return object|array|string|int|float|bool|null + * * @throws Exception\InvalidArgumentException if the JSON cannot be decoded. - * @link http://www.php.net/manual/en/function.json-decode.php + * + * @link https://www.php.net/manual/en/function.json-decode.php + * @deprecated json_decode will be removed in guzzlehttp/guzzle:8.0. Use Utils::jsonDecode instead. */ -function json_decode($json, $assoc = false, $depth = 512, $options = 0) +function json_decode(string $json, bool $assoc = false, int $depth = 512, int $options = 0) { - $data = \json_decode($json, $assoc, $depth, $options); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new Exception\InvalidArgumentException( - 'json_decode error: ' . json_last_error_msg() - ); - } - - return $data; + return Utils::jsonDecode($json, $assoc, $depth, $options); } /** * Wrapper for JSON encoding that throws when an error occurs. * * @param mixed $value The value being encoded - * @param int $options JSON encode option bitmask - * @param int $depth Set the maximum depth. Must be greater than zero. + * @param int $options JSON encode option bitmask + * @param int $depth Set the maximum depth. Must be greater than zero. * - * @return string * @throws Exception\InvalidArgumentException if the JSON cannot be encoded. - * @link http://www.php.net/manual/en/function.json-encode.php + * + * @link https://www.php.net/manual/en/function.json-encode.php + * @deprecated json_encode will be removed in guzzlehttp/guzzle:8.0. Use Utils::jsonEncode instead. */ -function json_encode($value, $options = 0, $depth = 512) +function json_encode($value, int $options = 0, int $depth = 512): string { - $json = \json_encode($value, $options, $depth); - if (JSON_ERROR_NONE !== json_last_error()) { - throw new Exception\InvalidArgumentException( - 'json_encode error: ' . json_last_error_msg() - ); - } - - return $json; + return Utils::jsonEncode($value, $options, $depth); } diff --git a/lib/guzzlehttp/guzzle/src/functions_include.php b/lib/guzzlehttp/guzzle/src/functions_include.php index a93393acc..6636a4224 100644 --- a/lib/guzzlehttp/guzzle/src/functions_include.php +++ b/lib/guzzlehttp/guzzle/src/functions_include.php @@ -1,6 +1,6 @@ ` elements with `CssToAttributeConverter` (#1008) + +### Changed +- Use `sabberworm/php-css-parser` to parse the CSS (#1015) +- Also check the unit test code with Psalm (#1003) + +### Deprecated +- Support for PHP 7.2 will be removed in Emogrifier 7.0. + +### Removed +- Remove a redundant CSS data cache (#1018) +- Drop support for Symfony 5.1 and 5.2 (#972, #1104) +- Drop support for PHP 7.1 (#967) + +### Fixed +- Allow `@import` after ignored invalid `@charset` (@1081) +- Allow line feeds within `` tag (#987) + +## 5.0.1 + +### Changed +- Switch the default branch from `master` to `main` (#951) + +### Fixed +- Ignore `http-equiv` `Content-Type` in `` (#961) +- Allow "Content-Type" in content (#959) + +## 5.0.0 + +### Added +- Add an `.editorconfig` file (#940) +- Support PHP 8.0 (#926) +- Run the CI build once a week (#933) +- Move more development tools to PHIVE (#894, #907) + +### Changed +- Automatically add a backslash for global functions (#909) +- Update the development tools (#898, #895) +- Upgrade to PHPUnit 7.5 (#888) +- Enforce constant visibility (#892) +- Rename the PHPCS configuration file (#891, #896) +- Make use of PHP 7.1 language features (#883) + +### Deprecated +- Support for PHP 7.1 will be removed in Emogrifier 6.0. + +### Removed +- Drop support for Symfony 4.3 and 5.0 (#936) +- Stop checking `tests/` with Psalm (#885) +- Drop support for PHP 7.0 (#880) + +### Fixed +- Fix a nonsensical code example in the README (#920, #935) +- Remove `!important` from `style` attributes also when uppercase, mixed case or + having whitespace after `!` (#911) +- Copy rules using `:...of-type` without a type to the `