diff --git a/CHANGELOG.md b/CHANGELOG.md
index e63d0a1f..11f4e3cd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,7 +5,20 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
-## [UNRELEASED]
+## [1.21.26] - 2026-02-12
+
+### Fixed
+
+- Fix the value of `id_search_option` in the log table when updating a dropdown field
+
+## [1.21.25] - 2025-11-20
+
+### Fixed
+
+- Fix default value format for multiple dropdown (GLPIObject)
+- Increased the maximum length of the language column to support longer locale codes
+
+## [1.21.24] - 2025-10-10
### Fixed
diff --git a/composer.json b/composer.json
index 7c79a173..483e9407 100644
--- a/composer.json
+++ b/composer.json
@@ -4,23 +4,14 @@
"symfony/yaml": "^5.4"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "^3.86",
- "friendsoftwig/twigcs": "^6.1",
- "glpi-project/tools": "^0.8.0",
- "php-parallel-lint/php-parallel-lint": "^1.4",
- "phpstan/extension-installer": "^1.4",
- "phpstan/phpstan": "^2.1",
- "phpstan/phpstan-deprecation-rules": "^2.0"
+ "glpi-project/tools": "^0.8"
},
"config": {
"optimize-autoloader": true,
"platform": {
"php": "7.4.0"
},
- "sort-packages": true,
- "allow-plugins": {
- "phpstan/extension-installer": true
- }
+ "sort-packages": true
},
"autoload-dev": {
"psr-4": {
diff --git a/composer.lock b/composer.lock
index 7c1ba7e5..eb35804e 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": "44d06ff8f58689d0eed5370308775f1e",
+ "content-hash": "8fd001d971e6381c8d6d7f4af8e2913c",
"packages": [
{
"name": "symfony/deprecation-contracts",
@@ -234,1926 +234,83 @@
],
"packages-dev": [
{
- "name": "clue/ndjson-react",
- "version": "v1.3.0",
- "source": {
- "type": "git",
- "url": "https://github.com/clue/reactphp-ndjson.git",
- "reference": "392dc165fce93b5bb5c637b67e59619223c931b0"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0",
- "reference": "392dc165fce93b5bb5c637b67e59619223c931b0",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3",
- "react/stream": "^1.2"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35",
- "react/event-loop": "^1.2"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Clue\\React\\NDJson\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering"
- }
- ],
- "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.",
- "homepage": "https://github.com/clue/reactphp-ndjson",
- "keywords": [
- "NDJSON",
- "json",
- "jsonlines",
- "newline",
- "reactphp",
- "streaming"
- ],
- "support": {
- "issues": "https://github.com/clue/reactphp-ndjson/issues",
- "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0"
- },
- "funding": [
- {
- "url": "https://clue.engineering/support",
- "type": "custom"
- },
- {
- "url": "https://github.com/clue",
- "type": "github"
- }
- ],
- "time": "2022-12-23T10:58:28+00:00"
- },
- {
- "name": "composer/pcre",
- "version": "3.3.2",
- "source": {
- "type": "git",
- "url": "https://github.com/composer/pcre.git",
- "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
- "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e",
- "shasum": ""
- },
- "require": {
- "php": "^7.4 || ^8.0"
- },
- "conflict": {
- "phpstan/phpstan": "<1.11.10"
- },
- "require-dev": {
- "phpstan/phpstan": "^1.12 || ^2",
- "phpstan/phpstan-strict-rules": "^1 || ^2",
- "phpunit/phpunit": "^8 || ^9"
- },
- "type": "library",
- "extra": {
- "phpstan": {
- "includes": [
- "extension.neon"
- ]
- },
- "branch-alias": {
- "dev-main": "3.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Composer\\Pcre\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
- }
- ],
- "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
- "keywords": [
- "PCRE",
- "preg",
- "regex",
- "regular expression"
- ],
- "support": {
- "issues": "https://github.com/composer/pcre/issues",
- "source": "https://github.com/composer/pcre/tree/3.3.2"
- },
- "funding": [
- {
- "url": "https://packagist.com",
- "type": "custom"
- },
- {
- "url": "https://github.com/composer",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
- "type": "tidelift"
- }
- ],
- "time": "2024-11-12T16:29:46+00:00"
- },
- {
- "name": "composer/semver",
- "version": "3.4.4",
- "source": {
- "type": "git",
- "url": "https://github.com/composer/semver.git",
- "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95",
- "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95",
- "shasum": ""
- },
- "require": {
- "php": "^5.3.2 || ^7.0 || ^8.0"
- },
- "require-dev": {
- "phpstan/phpstan": "^1.11",
- "symfony/phpunit-bridge": "^3 || ^7"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-main": "3.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Composer\\Semver\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nils Adermann",
- "email": "naderman@naderman.de",
- "homepage": "http://www.naderman.de"
- },
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
- },
- {
- "name": "Rob Bast",
- "email": "rob.bast@gmail.com",
- "homepage": "http://robbast.nl"
- }
- ],
- "description": "Semver library that offers utilities, version constraint parsing and validation.",
- "keywords": [
- "semantic",
- "semver",
- "validation",
- "versioning"
- ],
- "support": {
- "irc": "ircs://irc.libera.chat:6697/composer",
- "issues": "https://github.com/composer/semver/issues",
- "source": "https://github.com/composer/semver/tree/3.4.4"
- },
- "funding": [
- {
- "url": "https://packagist.com",
- "type": "custom"
- },
- {
- "url": "https://github.com/composer",
- "type": "github"
- }
- ],
- "time": "2025-08-20T19:15:30+00:00"
- },
- {
- "name": "composer/xdebug-handler",
- "version": "3.0.5",
- "source": {
- "type": "git",
- "url": "https://github.com/composer/xdebug-handler.git",
- "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef",
- "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef",
- "shasum": ""
- },
- "require": {
- "composer/pcre": "^1 || ^2 || ^3",
- "php": "^7.2.5 || ^8.0",
- "psr/log": "^1 || ^2 || ^3"
- },
- "require-dev": {
- "phpstan/phpstan": "^1.0",
- "phpstan/phpstan-strict-rules": "^1.1",
- "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Composer\\XdebugHandler\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "John Stevenson",
- "email": "john-stevenson@blueyonder.co.uk"
- }
- ],
- "description": "Restarts a process without Xdebug.",
- "keywords": [
- "Xdebug",
- "performance"
- ],
- "support": {
- "irc": "ircs://irc.libera.chat:6697/composer",
- "issues": "https://github.com/composer/xdebug-handler/issues",
- "source": "https://github.com/composer/xdebug-handler/tree/3.0.5"
- },
- "funding": [
- {
- "url": "https://packagist.com",
- "type": "custom"
- },
- {
- "url": "https://github.com/composer",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
- "type": "tidelift"
- }
- ],
- "time": "2024-05-06T16:37:16+00:00"
- },
- {
- "name": "evenement/evenement",
- "version": "v3.0.2",
- "source": {
- "type": "git",
- "url": "https://github.com/igorw/evenement.git",
- "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc",
- "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc",
- "shasum": ""
- },
- "require": {
- "php": ">=7.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^9 || ^6"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Evenement\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Igor Wiedler",
- "email": "igor@wiedler.ch"
- }
- ],
- "description": "Événement is a very simple event dispatching library for PHP",
- "keywords": [
- "event-dispatcher",
- "event-emitter"
- ],
- "support": {
- "issues": "https://github.com/igorw/evenement/issues",
- "source": "https://github.com/igorw/evenement/tree/v3.0.2"
- },
- "time": "2023-08-08T05:53:35+00:00"
- },
- {
- "name": "fidry/cpu-core-counter",
- "version": "1.3.0",
- "source": {
- "type": "git",
- "url": "https://github.com/theofidry/cpu-core-counter.git",
- "reference": "db9508f7b1474469d9d3c53b86f817e344732678"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678",
- "reference": "db9508f7b1474469d9d3c53b86f817e344732678",
- "shasum": ""
- },
- "require": {
- "php": "^7.2 || ^8.0"
- },
- "require-dev": {
- "fidry/makefile": "^0.2.0",
- "fidry/php-cs-fixer-config": "^1.1.2",
- "phpstan/extension-installer": "^1.2.0",
- "phpstan/phpstan": "^2.0",
- "phpstan/phpstan-deprecation-rules": "^2.0.0",
- "phpstan/phpstan-phpunit": "^2.0",
- "phpstan/phpstan-strict-rules": "^2.0",
- "phpunit/phpunit": "^8.5.31 || ^9.5.26",
- "webmozarts/strict-phpunit": "^7.5"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Fidry\\CpuCoreCounter\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Théo FIDRY",
- "email": "theo.fidry@gmail.com"
- }
- ],
- "description": "Tiny utility to get the number of CPU cores.",
- "keywords": [
- "CPU",
- "core"
- ],
- "support": {
- "issues": "https://github.com/theofidry/cpu-core-counter/issues",
- "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0"
- },
- "funding": [
- {
- "url": "https://github.com/theofidry",
- "type": "github"
- }
- ],
- "time": "2025-08-14T07:29:31+00:00"
- },
- {
- "name": "friendsofphp/php-cs-fixer",
- "version": "v3.86.0",
- "source": {
- "type": "git",
- "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
- "reference": "4a952bd19dc97879b0620f495552ef09b55f7d36"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/4a952bd19dc97879b0620f495552ef09b55f7d36",
- "reference": "4a952bd19dc97879b0620f495552ef09b55f7d36",
- "shasum": ""
- },
- "require": {
- "clue/ndjson-react": "^1.3",
- "composer/semver": "^3.4",
- "composer/xdebug-handler": "^3.0.5",
- "ext-filter": "*",
- "ext-hash": "*",
- "ext-json": "*",
- "ext-tokenizer": "*",
- "fidry/cpu-core-counter": "^1.2",
- "php": "^7.4 || ^8.0",
- "react/child-process": "^0.6.6",
- "react/event-loop": "^1.5",
- "react/promise": "^3.2",
- "react/socket": "^1.16",
- "react/stream": "^1.4",
- "sebastian/diff": "^4.0.6 || ^5.1.1 || ^6.0.2 || ^7.0",
- "symfony/console": "^5.4.47 || ^6.4.13 || ^7.0",
- "symfony/event-dispatcher": "^5.4.45 || ^6.4.13 || ^7.0",
- "symfony/filesystem": "^5.4.45 || ^6.4.13 || ^7.0",
- "symfony/finder": "^5.4.45 || ^6.4.17 || ^7.0",
- "symfony/options-resolver": "^5.4.45 || ^6.4.16 || ^7.0",
- "symfony/polyfill-mbstring": "^1.32",
- "symfony/polyfill-php80": "^1.32",
- "symfony/polyfill-php81": "^1.32",
- "symfony/process": "^5.4.47 || ^6.4.20 || ^7.2",
- "symfony/stopwatch": "^5.4.45 || ^6.4.19 || ^7.0"
- },
- "require-dev": {
- "facile-it/paraunit": "^1.3.1 || ^2.6",
- "infection/infection": "^0.29.14",
- "justinrainbow/json-schema": "^5.3 || ^6.4",
- "keradus/cli-executor": "^2.2",
- "mikey179/vfsstream": "^1.6.12",
- "php-coveralls/php-coveralls": "^2.8",
- "php-cs-fixer/accessible-object": "^1.1",
- "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.6",
- "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.6",
- "phpunit/phpunit": "^9.6.23 || ^10.5.47 || ^11.5.25",
- "symfony/polyfill-php84": "^1.32",
- "symfony/var-dumper": "^5.4.48 || ^6.4.23 || ^7.3.1",
- "symfony/yaml": "^5.4.45 || ^6.4.23 || ^7.3.1"
- },
- "suggest": {
- "ext-dom": "For handling output formats in XML",
- "ext-mbstring": "For handling non-UTF8 characters."
- },
- "bin": [
- "php-cs-fixer"
- ],
- "type": "application",
- "autoload": {
- "psr-4": {
- "PhpCsFixer\\": "src/"
- },
- "exclude-from-classmap": [
- "src/Fixer/Internal/*"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Dariusz Rumiński",
- "email": "dariusz.ruminski@gmail.com"
- }
- ],
- "description": "A tool to automatically fix PHP code style",
- "keywords": [
- "Static code analysis",
- "fixer",
- "standards",
- "static analysis"
- ],
- "support": {
- "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
- "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.86.0"
- },
- "funding": [
- {
- "url": "https://github.com/keradus",
- "type": "github"
- }
- ],
- "time": "2025-08-13T22:36:21+00:00"
- },
- {
- "name": "friendsoftwig/twigcs",
- "version": "v6.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/friendsoftwig/twigcs.git",
- "reference": "3c36d606c4f19db0dd2a01b735ec7a8151b7f182"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/friendsoftwig/twigcs/zipball/3c36d606c4f19db0dd2a01b735ec7a8151b7f182",
- "reference": "3c36d606c4f19db0dd2a01b735ec7a8151b7f182",
- "shasum": ""
- },
- "require": {
- "ext-ctype": "*",
- "ext-hash": "*",
- "ext-json": "*",
- "ext-mbstring": "*",
- "ext-simplexml": "*",
- "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0",
- "symfony/console": "^4.4 || ^5.3 || ^6.0",
- "symfony/filesystem": "^4.4 || ^5.3 || ^6.0",
- "symfony/finder": "^4.4 || ^5.3 || ^6.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.5.20",
- "symfony/phpunit-bridge": "^6.2.3"
- },
- "bin": [
- "bin/twigcs"
- ],
- "type": "library",
- "autoload": {
- "psr-4": {
- "FriendsOfTwig\\Twigcs\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Tristan Maindron",
- "email": "tmaindron@gmail.com"
- }
- ],
- "description": "Checkstyle automation for Twig",
- "support": {
- "issues": "https://github.com/friendsoftwig/twigcs/issues",
- "source": "https://github.com/friendsoftwig/twigcs/tree/v6.1.0"
- },
- "time": "2023-01-04T16:01:24+00:00"
- },
- {
- "name": "glpi-project/tools",
- "version": "0.8.0",
- "source": {
- "type": "git",
- "url": "https://github.com/glpi-project/tools.git",
- "reference": "7c2dcec105ed3427183bdfd382d785363aade436"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/glpi-project/tools/zipball/7c2dcec105ed3427183bdfd382d785363aade436",
- "reference": "7c2dcec105ed3427183bdfd382d785363aade436",
- "shasum": ""
- },
- "require": {
- "symfony/console": "^5.4 || ^6.0",
- "twig/twig": "^3.3"
- },
- "require-dev": {
- "nikic/php-parser": "^4.13",
- "phpstan/phpstan-src": "^1.10"
- },
- "bin": [
- "bin/extract-locales",
- "bin/licence-headers-check",
- "tools/plugin-release"
- ],
- "type": "library",
- "autoload": {
- "psr-4": {
- "GlpiProject\\Tools\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "GPL-3.0-or-later"
- ],
- "authors": [
- {
- "name": "Teclib'",
- "email": "glpi@teclib.com",
- "homepage": "http://teclib-group.com"
- }
- ],
- "description": "Various tools for GLPI and its plugins",
- "keywords": [
- "glpi",
- "plugins",
- "tools"
- ],
- "support": {
- "issues": "https://github.com/glpi-project/tools/issues",
- "source": "https://github.com/glpi-project/tools"
- },
- "time": "2025-08-26T10:18:38+00:00"
- },
- {
- "name": "php-parallel-lint/php-parallel-lint",
- "version": "v1.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-parallel-lint/PHP-Parallel-Lint.git",
- "reference": "6db563514f27e19595a19f45a4bf757b6401194e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/6db563514f27e19595a19f45a4bf757b6401194e",
- "reference": "6db563514f27e19595a19f45a4bf757b6401194e",
- "shasum": ""
- },
- "require": {
- "ext-json": "*",
- "php": ">=5.3.0"
- },
- "replace": {
- "grogy/php-parallel-lint": "*",
- "jakub-onderka/php-parallel-lint": "*"
- },
- "require-dev": {
- "nette/tester": "^1.3 || ^2.0",
- "php-parallel-lint/php-console-highlighter": "0.* || ^1.0",
- "squizlabs/php_codesniffer": "^3.6"
- },
- "suggest": {
- "php-parallel-lint/php-console-highlighter": "Highlight syntax in code snippet"
- },
- "bin": [
- "parallel-lint"
- ],
- "type": "library",
- "autoload": {
- "classmap": [
- "./src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-2-Clause"
- ],
- "authors": [
- {
- "name": "Jakub Onderka",
- "email": "ahoj@jakubonderka.cz"
- }
- ],
- "description": "This tool checks the syntax of PHP files about 20x faster than serial check.",
- "homepage": "https://github.com/php-parallel-lint/PHP-Parallel-Lint",
- "keywords": [
- "lint",
- "static analysis"
- ],
- "support": {
- "issues": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues",
- "source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.4.0"
- },
- "time": "2024-03-27T12:14:49+00:00"
- },
- {
- "name": "phpstan/extension-installer",
- "version": "1.4.3",
- "source": {
- "type": "git",
- "url": "https://github.com/phpstan/extension-installer.git",
- "reference": "85e90b3942d06b2326fba0403ec24fe912372936"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936",
- "reference": "85e90b3942d06b2326fba0403ec24fe912372936",
- "shasum": ""
- },
- "require": {
- "composer-plugin-api": "^2.0",
- "php": "^7.2 || ^8.0",
- "phpstan/phpstan": "^1.9.0 || ^2.0"
- },
- "require-dev": {
- "composer/composer": "^2.0",
- "php-parallel-lint/php-parallel-lint": "^1.2.0",
- "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0"
- },
- "type": "composer-plugin",
- "extra": {
- "class": "PHPStan\\ExtensionInstaller\\Plugin"
- },
- "autoload": {
- "psr-4": {
- "PHPStan\\ExtensionInstaller\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Composer plugin for automatic installation of PHPStan extensions",
- "keywords": [
- "dev",
- "static analysis"
- ],
- "support": {
- "issues": "https://github.com/phpstan/extension-installer/issues",
- "source": "https://github.com/phpstan/extension-installer/tree/1.4.3"
- },
- "time": "2024-09-04T20:21:43+00:00"
- },
- {
- "name": "phpstan/phpstan",
- "version": "2.1.22",
- "source": {
- "type": "git",
- "url": "https://github.com/phpstan/phpstan.git",
- "reference": "41600c8379eb5aee63e9413fe9e97273e25d57e4"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/41600c8379eb5aee63e9413fe9e97273e25d57e4",
- "reference": "41600c8379eb5aee63e9413fe9e97273e25d57e4",
- "shasum": ""
- },
- "require": {
- "php": "^7.4|^8.0"
- },
- "conflict": {
- "phpstan/phpstan-shim": "*"
- },
- "bin": [
- "phpstan",
- "phpstan.phar"
- ],
- "type": "library",
- "autoload": {
- "files": [
- "bootstrap.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "PHPStan - PHP Static Analysis Tool",
- "keywords": [
- "dev",
- "static analysis"
- ],
- "support": {
- "docs": "https://phpstan.org/user-guide/getting-started",
- "forum": "https://github.com/phpstan/phpstan/discussions",
- "issues": "https://github.com/phpstan/phpstan/issues",
- "security": "https://github.com/phpstan/phpstan/security/policy",
- "source": "https://github.com/phpstan/phpstan-src"
- },
- "funding": [
- {
- "url": "https://github.com/ondrejmirtes",
- "type": "github"
- },
- {
- "url": "https://github.com/phpstan",
- "type": "github"
- }
- ],
- "time": "2025-08-04T19:17:37+00:00"
- },
- {
- "name": "phpstan/phpstan-deprecation-rules",
- "version": "2.0.3",
- "source": {
- "type": "git",
- "url": "https://github.com/phpstan/phpstan-deprecation-rules.git",
- "reference": "468e02c9176891cc901143da118f09dc9505fc2f"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/468e02c9176891cc901143da118f09dc9505fc2f",
- "reference": "468e02c9176891cc901143da118f09dc9505fc2f",
- "shasum": ""
- },
- "require": {
- "php": "^7.4 || ^8.0",
- "phpstan/phpstan": "^2.1.15"
- },
- "require-dev": {
- "php-parallel-lint/php-parallel-lint": "^1.2",
- "phpstan/phpstan-phpunit": "^2.0",
- "phpunit/phpunit": "^9.6"
- },
- "type": "phpstan-extension",
- "extra": {
- "phpstan": {
- "includes": [
- "rules.neon"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "PHPStan\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.",
- "support": {
- "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues",
- "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.3"
- },
- "time": "2025-05-14T10:56:57+00:00"
- },
- {
- "name": "psr/container",
- "version": "1.1.2",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/container.git",
- "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
- "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
- "shasum": ""
- },
- "require": {
- "php": ">=7.4.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Psr\\Container\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
- }
- ],
- "description": "Common Container Interface (PHP FIG PSR-11)",
- "homepage": "https://github.com/php-fig/container",
- "keywords": [
- "PSR-11",
- "container",
- "container-interface",
- "container-interop",
- "psr"
- ],
- "support": {
- "issues": "https://github.com/php-fig/container/issues",
- "source": "https://github.com/php-fig/container/tree/1.1.2"
- },
- "time": "2021-11-05T16:50:12+00:00"
- },
- {
- "name": "psr/event-dispatcher",
- "version": "1.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/event-dispatcher.git",
- "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
- "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
- "shasum": ""
- },
- "require": {
- "php": ">=7.2.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\EventDispatcher\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "description": "Standard interfaces for event handling.",
- "keywords": [
- "events",
- "psr",
- "psr-14"
- ],
- "support": {
- "issues": "https://github.com/php-fig/event-dispatcher/issues",
- "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
- },
- "time": "2019-01-08T18:20:26+00:00"
- },
- {
- "name": "psr/log",
- "version": "1.1.4",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
- "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.1.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Log\\": "Psr/Log/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
- }
- ],
- "description": "Common interface for logging libraries",
- "homepage": "https://github.com/php-fig/log",
- "keywords": [
- "log",
- "psr",
- "psr-3"
- ],
- "support": {
- "source": "https://github.com/php-fig/log/tree/1.1.4"
- },
- "time": "2021-05-03T11:20:27+00:00"
- },
- {
- "name": "react/cache",
- "version": "v1.2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/cache.git",
- "reference": "d47c472b64aa5608225f47965a484b75c7817d5b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b",
- "reference": "d47c472b64aa5608225f47965a484b75c7817d5b",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0",
- "react/promise": "^3.0 || ^2.0 || ^1.1"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "React\\Cache\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering",
- "homepage": "https://clue.engineering/"
- },
- {
- "name": "Cees-Jan Kiewiet",
- "email": "reactphp@ceesjankiewiet.nl",
- "homepage": "https://wyrihaximus.net/"
- },
- {
- "name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com",
- "homepage": "https://sorgalla.com/"
- },
- {
- "name": "Chris Boden",
- "email": "cboden@gmail.com",
- "homepage": "https://cboden.dev/"
- }
- ],
- "description": "Async, Promise-based cache interface for ReactPHP",
- "keywords": [
- "cache",
- "caching",
- "promise",
- "reactphp"
- ],
- "support": {
- "issues": "https://github.com/reactphp/cache/issues",
- "source": "https://github.com/reactphp/cache/tree/v1.2.0"
- },
- "funding": [
- {
- "url": "https://opencollective.com/reactphp",
- "type": "open_collective"
- }
- ],
- "time": "2022-11-30T15:59:55+00:00"
- },
- {
- "name": "react/child-process",
- "version": "v0.6.6",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/child-process.git",
- "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/child-process/zipball/1721e2b93d89b745664353b9cfc8f155ba8a6159",
- "reference": "1721e2b93d89b745664353b9cfc8f155ba8a6159",
- "shasum": ""
- },
- "require": {
- "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
- "php": ">=5.3.0",
- "react/event-loop": "^1.2",
- "react/stream": "^1.4"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
- "react/socket": "^1.16",
- "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "React\\ChildProcess\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering",
- "homepage": "https://clue.engineering/"
- },
- {
- "name": "Cees-Jan Kiewiet",
- "email": "reactphp@ceesjankiewiet.nl",
- "homepage": "https://wyrihaximus.net/"
- },
- {
- "name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com",
- "homepage": "https://sorgalla.com/"
- },
- {
- "name": "Chris Boden",
- "email": "cboden@gmail.com",
- "homepage": "https://cboden.dev/"
- }
- ],
- "description": "Event-driven library for executing child processes with ReactPHP.",
- "keywords": [
- "event-driven",
- "process",
- "reactphp"
- ],
- "support": {
- "issues": "https://github.com/reactphp/child-process/issues",
- "source": "https://github.com/reactphp/child-process/tree/v0.6.6"
- },
- "funding": [
- {
- "url": "https://opencollective.com/reactphp",
- "type": "open_collective"
- }
- ],
- "time": "2025-01-01T16:37:48+00:00"
- },
- {
- "name": "react/dns",
- "version": "v1.13.0",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/dns.git",
- "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5",
- "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0",
- "react/cache": "^1.0 || ^0.6 || ^0.5",
- "react/event-loop": "^1.2",
- "react/promise": "^3.2 || ^2.7 || ^1.2.1"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
- "react/async": "^4.3 || ^3 || ^2",
- "react/promise-timer": "^1.11"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "React\\Dns\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering",
- "homepage": "https://clue.engineering/"
- },
- {
- "name": "Cees-Jan Kiewiet",
- "email": "reactphp@ceesjankiewiet.nl",
- "homepage": "https://wyrihaximus.net/"
- },
- {
- "name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com",
- "homepage": "https://sorgalla.com/"
- },
- {
- "name": "Chris Boden",
- "email": "cboden@gmail.com",
- "homepage": "https://cboden.dev/"
- }
- ],
- "description": "Async DNS resolver for ReactPHP",
- "keywords": [
- "async",
- "dns",
- "dns-resolver",
- "reactphp"
- ],
- "support": {
- "issues": "https://github.com/reactphp/dns/issues",
- "source": "https://github.com/reactphp/dns/tree/v1.13.0"
- },
- "funding": [
- {
- "url": "https://opencollective.com/reactphp",
- "type": "open_collective"
- }
- ],
- "time": "2024-06-13T14:18:03+00:00"
- },
- {
- "name": "react/event-loop",
- "version": "v1.5.0",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/event-loop.git",
- "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354",
- "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
- },
- "suggest": {
- "ext-pcntl": "For signal handling support when using the StreamSelectLoop"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "React\\EventLoop\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering",
- "homepage": "https://clue.engineering/"
- },
- {
- "name": "Cees-Jan Kiewiet",
- "email": "reactphp@ceesjankiewiet.nl",
- "homepage": "https://wyrihaximus.net/"
- },
- {
- "name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com",
- "homepage": "https://sorgalla.com/"
- },
- {
- "name": "Chris Boden",
- "email": "cboden@gmail.com",
- "homepage": "https://cboden.dev/"
- }
- ],
- "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.",
- "keywords": [
- "asynchronous",
- "event-loop"
- ],
- "support": {
- "issues": "https://github.com/reactphp/event-loop/issues",
- "source": "https://github.com/reactphp/event-loop/tree/v1.5.0"
- },
- "funding": [
- {
- "url": "https://opencollective.com/reactphp",
- "type": "open_collective"
- }
- ],
- "time": "2023-11-13T13:48:05+00:00"
- },
- {
- "name": "react/promise",
- "version": "v3.3.0",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/promise.git",
- "reference": "23444f53a813a3296c1368bb104793ce8d88f04a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/promise/zipball/23444f53a813a3296c1368bb104793ce8d88f04a",
- "reference": "23444f53a813a3296c1368bb104793ce8d88f04a",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1.0"
- },
- "require-dev": {
- "phpstan/phpstan": "1.12.28 || 1.4.10",
- "phpunit/phpunit": "^9.6 || ^7.5"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/functions_include.php"
- ],
- "psr-4": {
- "React\\Promise\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com",
- "homepage": "https://sorgalla.com/"
- },
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering",
- "homepage": "https://clue.engineering/"
- },
- {
- "name": "Cees-Jan Kiewiet",
- "email": "reactphp@ceesjankiewiet.nl",
- "homepage": "https://wyrihaximus.net/"
- },
- {
- "name": "Chris Boden",
- "email": "cboden@gmail.com",
- "homepage": "https://cboden.dev/"
- }
- ],
- "description": "A lightweight implementation of CommonJS Promises/A for PHP",
- "keywords": [
- "promise",
- "promises"
- ],
- "support": {
- "issues": "https://github.com/reactphp/promise/issues",
- "source": "https://github.com/reactphp/promise/tree/v3.3.0"
- },
- "funding": [
- {
- "url": "https://opencollective.com/reactphp",
- "type": "open_collective"
- }
- ],
- "time": "2025-08-19T18:57:03+00:00"
- },
- {
- "name": "react/socket",
- "version": "v1.16.0",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/socket.git",
- "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1",
- "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1",
- "shasum": ""
- },
- "require": {
- "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
- "php": ">=5.3.0",
- "react/dns": "^1.13",
- "react/event-loop": "^1.2",
- "react/promise": "^3.2 || ^2.6 || ^1.2.1",
- "react/stream": "^1.4"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
- "react/async": "^4.3 || ^3.3 || ^2",
- "react/promise-stream": "^1.4",
- "react/promise-timer": "^1.11"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "React\\Socket\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering",
- "homepage": "https://clue.engineering/"
- },
- {
- "name": "Cees-Jan Kiewiet",
- "email": "reactphp@ceesjankiewiet.nl",
- "homepage": "https://wyrihaximus.net/"
- },
- {
- "name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com",
- "homepage": "https://sorgalla.com/"
- },
- {
- "name": "Chris Boden",
- "email": "cboden@gmail.com",
- "homepage": "https://cboden.dev/"
- }
- ],
- "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP",
- "keywords": [
- "Connection",
- "Socket",
- "async",
- "reactphp",
- "stream"
- ],
- "support": {
- "issues": "https://github.com/reactphp/socket/issues",
- "source": "https://github.com/reactphp/socket/tree/v1.16.0"
- },
- "funding": [
- {
- "url": "https://opencollective.com/reactphp",
- "type": "open_collective"
- }
- ],
- "time": "2024-07-26T10:38:09+00:00"
- },
- {
- "name": "react/stream",
- "version": "v1.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/reactphp/stream.git",
- "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d",
- "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d",
- "shasum": ""
- },
- "require": {
- "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
- "php": ">=5.3.8",
- "react/event-loop": "^1.2"
- },
- "require-dev": {
- "clue/stream-filter": "~1.2",
- "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "React\\Stream\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Christian Lück",
- "email": "christian@clue.engineering",
- "homepage": "https://clue.engineering/"
- },
- {
- "name": "Cees-Jan Kiewiet",
- "email": "reactphp@ceesjankiewiet.nl",
- "homepage": "https://wyrihaximus.net/"
- },
- {
- "name": "Jan Sorgalla",
- "email": "jsorgalla@gmail.com",
- "homepage": "https://sorgalla.com/"
- },
- {
- "name": "Chris Boden",
- "email": "cboden@gmail.com",
- "homepage": "https://cboden.dev/"
- }
- ],
- "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP",
- "keywords": [
- "event-driven",
- "io",
- "non-blocking",
- "pipe",
- "reactphp",
- "readable",
- "stream",
- "writable"
- ],
- "support": {
- "issues": "https://github.com/reactphp/stream/issues",
- "source": "https://github.com/reactphp/stream/tree/v1.4.0"
- },
- "funding": [
- {
- "url": "https://opencollective.com/reactphp",
- "type": "open_collective"
- }
- ],
- "time": "2024-06-11T12:45:25+00:00"
- },
- {
- "name": "sebastian/diff",
- "version": "4.0.6",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc",
- "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc",
- "shasum": ""
- },
- "require": {
- "php": ">=7.3"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.3",
- "symfony/process": "^4.2 || ^5"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "4.0-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- },
- {
- "name": "Kore Nordmann",
- "email": "mail@kore-nordmann.de"
- }
- ],
- "description": "Diff implementation",
- "homepage": "https://github.com/sebastianbergmann/diff",
- "keywords": [
- "diff",
- "udiff",
- "unidiff",
- "unified diff"
- ],
- "support": {
- "issues": "https://github.com/sebastianbergmann/diff/issues",
- "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6"
- },
- "funding": [
- {
- "url": "https://github.com/sebastianbergmann",
- "type": "github"
- }
- ],
- "time": "2024-03-02T06:30:58+00:00"
- },
- {
- "name": "symfony/console",
- "version": "v5.4.47",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/console.git",
- "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",
- "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",
- "shasum": ""
- },
- "require": {
- "php": ">=7.2.5",
- "symfony/deprecation-contracts": "^2.1|^3",
- "symfony/polyfill-mbstring": "~1.0",
- "symfony/polyfill-php73": "^1.9",
- "symfony/polyfill-php80": "^1.16",
- "symfony/service-contracts": "^1.1|^2|^3",
- "symfony/string": "^5.1|^6.0"
- },
- "conflict": {
- "psr/log": ">=3",
- "symfony/dependency-injection": "<4.4",
- "symfony/dotenv": "<5.1",
- "symfony/event-dispatcher": "<4.4",
- "symfony/lock": "<4.4",
- "symfony/process": "<4.4"
- },
- "provide": {
- "psr/log-implementation": "1.0|2.0"
- },
- "require-dev": {
- "psr/log": "^1|^2",
- "symfony/config": "^4.4|^5.0|^6.0",
- "symfony/dependency-injection": "^4.4|^5.0|^6.0",
- "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
- "symfony/lock": "^4.4|^5.0|^6.0",
- "symfony/process": "^4.4|^5.0|^6.0",
- "symfony/var-dumper": "^4.4|^5.0|^6.0"
- },
- "suggest": {
- "psr/log": "For using the console logger",
- "symfony/event-dispatcher": "",
- "symfony/lock": "",
- "symfony/process": ""
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Console\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Eases the creation of beautiful and testable command line interfaces",
- "homepage": "https://symfony.com",
- "keywords": [
- "cli",
- "command-line",
- "console",
- "terminal"
- ],
- "support": {
- "source": "https://github.com/symfony/console/tree/v5.4.47"
- },
- "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": "2024-11-06T11:30:55+00:00"
- },
- {
- "name": "symfony/event-dispatcher",
- "version": "v5.4.45",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/72982eb416f61003e9bb6e91f8b3213600dcf9e9",
- "reference": "72982eb416f61003e9bb6e91f8b3213600dcf9e9",
- "shasum": ""
- },
- "require": {
- "php": ">=7.2.5",
- "symfony/deprecation-contracts": "^2.1|^3",
- "symfony/event-dispatcher-contracts": "^2|^3",
- "symfony/polyfill-php80": "^1.16"
- },
- "conflict": {
- "symfony/dependency-injection": "<4.4"
- },
- "provide": {
- "psr/event-dispatcher-implementation": "1.0",
- "symfony/event-dispatcher-implementation": "2.0"
- },
- "require-dev": {
- "psr/log": "^1|^2|^3",
- "symfony/config": "^4.4|^5.0|^6.0",
- "symfony/dependency-injection": "^4.4|^5.0|^6.0",
- "symfony/error-handler": "^4.4|^5.0|^6.0",
- "symfony/expression-language": "^4.4|^5.0|^6.0",
- "symfony/http-foundation": "^4.4|^5.0|^6.0",
- "symfony/service-contracts": "^1.1|^2|^3",
- "symfony/stopwatch": "^4.4|^5.0|^6.0"
- },
- "suggest": {
- "symfony/dependency-injection": "",
- "symfony/http-kernel": ""
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\EventDispatcher\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.45"
- },
- "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": "2024-09-25T14:11:13+00:00"
- },
- {
- "name": "symfony/event-dispatcher-contracts",
- "version": "v2.5.4",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/event-dispatcher-contracts.git",
- "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f",
- "reference": "e0fe3d79b516eb75126ac6fa4cbf19b79b08c99f",
- "shasum": ""
- },
- "require": {
- "php": ">=7.2.5",
- "psr/event-dispatcher": "^1"
- },
- "suggest": {
- "symfony/event-dispatcher-implementation": ""
- },
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/contracts",
- "name": "symfony/contracts"
- },
- "branch-alias": {
- "dev-main": "2.5-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Contracts\\EventDispatcher\\": ""
- }
- },
- "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": "Generic abstractions related to dispatching event",
- "homepage": "https://symfony.com",
- "keywords": [
- "abstractions",
- "contracts",
- "decoupling",
- "interfaces",
- "interoperability",
- "standards"
- ],
- "support": {
- "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.4"
- },
- "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": "2024-09-25T14:11:13+00:00"
- },
- {
- "name": "symfony/filesystem",
- "version": "v5.4.45",
+ "name": "glpi-project/tools",
+ "version": "0.8.3",
"source": {
"type": "git",
- "url": "https://github.com/symfony/filesystem.git",
- "reference": "57c8294ed37d4a055b77057827c67f9558c95c54"
+ "url": "https://github.com/glpi-project/tools.git",
+ "reference": "8ea2a7d4702a858f4b0360ba7d4f1841a5e77026"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/57c8294ed37d4a055b77057827c67f9558c95c54",
- "reference": "57c8294ed37d4a055b77057827c67f9558c95c54",
+ "url": "https://api.github.com/repos/glpi-project/tools/zipball/8ea2a7d4702a858f4b0360ba7d4f1841a5e77026",
+ "reference": "8ea2a7d4702a858f4b0360ba7d4f1841a5e77026",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "symfony/polyfill-ctype": "~1.8",
- "symfony/polyfill-mbstring": "~1.8",
- "symfony/polyfill-php80": "^1.16"
+ "symfony/console": "^5.4 || ^6.0",
+ "twig/twig": "^3.3"
},
"require-dev": {
- "symfony/process": "^5.4|^6.4"
+ "nikic/php-parser": "^4.13",
+ "phpstan/phpstan-src": "^1.10"
},
+ "bin": [
+ "bin/extract-locales",
+ "bin/licence-headers-check",
+ "tools/plugin-release"
+ ],
"type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Component\\Filesystem\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "GlpiProject\\Tools\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "GPL-3.0-or-later"
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "Teclib'",
+ "email": "glpi@teclib.com",
+ "homepage": "http://teclib-group.com"
}
],
- "description": "Provides basic utilities for the filesystem",
- "homepage": "https://symfony.com",
+ "description": "Various tools for GLPI and its plugins",
+ "keywords": [
+ "glpi",
+ "plugins",
+ "tools"
+ ],
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v5.4.45"
+ "issues": "https://github.com/glpi-project/tools/issues",
+ "source": "https://github.com/glpi-project/tools"
},
- "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": "2024-10-22T13:05:35+00:00"
+ "time": "2025-10-14T10:26:06+00:00"
},
{
- "name": "symfony/finder",
- "version": "v5.4.45",
+ "name": "psr/container",
+ "version": "1.1.2",
"source": {
"type": "git",
- "url": "https://github.com/symfony/finder.git",
- "reference": "63741784cd7b9967975eec610b256eed3ede022b"
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b",
- "reference": "63741784cd7b9967975eec610b256eed3ede022b",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
+ "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "symfony/deprecation-contracts": "^2.1|^3",
- "symfony/polyfill-php80": "^1.16"
+ "php": ">=7.4.0"
},
"type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Component\\Finder\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "Psr\\Container\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2161,59 +318,78 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
}
],
- "description": "Finds files and directories via an intuitive fluent interface",
- "homepage": "https://symfony.com",
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
"support": {
- "source": "https://github.com/symfony/finder/tree/v5.4.45"
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/1.1.2"
},
- "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": "2024-09-28T13:32:08+00:00"
+ "time": "2021-11-05T16:50:12+00:00"
},
{
- "name": "symfony/options-resolver",
- "version": "v5.4.45",
+ "name": "symfony/console",
+ "version": "v5.4.47",
"source": {
"type": "git",
- "url": "https://github.com/symfony/options-resolver.git",
- "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6"
+ "url": "https://github.com/symfony/console.git",
+ "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/options-resolver/zipball/74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6",
- "reference": "74e5b6f0db3e8589e6cfd5efb317a1fc2bb52fb6",
+ "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",
+ "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/deprecation-contracts": "^2.1|^3",
- "symfony/polyfill-php73": "~1.0",
- "symfony/polyfill-php80": "^1.16"
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php73": "^1.9",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/string": "^5.1|^6.0"
+ },
+ "conflict": {
+ "psr/log": ">=3",
+ "symfony/dependency-injection": "<4.4",
+ "symfony/dotenv": "<5.1",
+ "symfony/event-dispatcher": "<4.4",
+ "symfony/lock": "<4.4",
+ "symfony/process": "<4.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
+ "symfony/lock": "^4.4|^5.0|^6.0",
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/var-dumper": "^4.4|^5.0|^6.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/lock": "",
+ "symfony/process": ""
},
"type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Component\\OptionsResolver\\": ""
+ "Symfony\\Component\\Console\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -2233,15 +409,16 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Provides an improved replacement for the array_replace PHP function",
+ "description": "Eases the creation of beautiful and testable command line interfaces",
"homepage": "https://symfony.com",
"keywords": [
- "config",
- "configuration",
- "options"
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
],
"support": {
- "source": "https://github.com/symfony/options-resolver/tree/v5.4.45"
+ "source": "https://github.com/symfony/console/tree/v5.4.47"
},
"funding": [
{
@@ -2257,7 +434,7 @@
"type": "tidelift"
}
],
- "time": "2024-09-25T14:11:13+00:00"
+ "time": "2024-11-06T11:30:55+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
@@ -2755,68 +932,6 @@
],
"time": "2024-09-09T11:45:10+00:00"
},
- {
- "name": "symfony/process",
- "version": "v5.4.47",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/process.git",
- "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/5d1662fb32ebc94f17ddb8d635454a776066733d",
- "reference": "5d1662fb32ebc94f17ddb8d635454a776066733d",
- "shasum": ""
- },
- "require": {
- "php": ">=7.2.5",
- "symfony/polyfill-php80": "^1.16"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Process\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Executes commands in sub-processes",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/process/tree/v5.4.47"
- },
- "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": "2024-11-06T11:36:42+00:00"
- },
{
"name": "symfony/service-contracts",
"version": "v2.5.4",
@@ -2900,68 +1015,6 @@
],
"time": "2024-09-25T14:11:13+00:00"
},
- {
- "name": "symfony/stopwatch",
- "version": "v5.4.45",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/stopwatch.git",
- "reference": "fb2c199cf302eb207f8c23e7ee174c1c31a5c004"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/stopwatch/zipball/fb2c199cf302eb207f8c23e7ee174c1c31a5c004",
- "reference": "fb2c199cf302eb207f8c23e7ee174c1c31a5c004",
- "shasum": ""
- },
- "require": {
- "php": ">=7.2.5",
- "symfony/service-contracts": "^1|^2|^3"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Stopwatch\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Provides a way to profile code",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/stopwatch/tree/v5.4.45"
- },
- "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": "2024-09-25T14:11:13+00:00"
- },
{
"name": "symfony/string",
"version": "v5.4.47",
@@ -3141,5 +1194,5 @@
"platform-overrides": {
"php": "7.4.0"
},
- "plugin-api-version": "2.6.0"
+ "plugin-api-version": "2.9.0"
}
diff --git a/inc/container.class.php b/inc/container.class.php
index 7e906230..b2c3f0cd 100644
--- a/inc/container.class.php
+++ b/inc/container.class.php
@@ -654,40 +654,75 @@ public static function create($fields)
public static function generateTemplate($fields)
{
- $itemtypes = strlen($fields['itemtypes']) > 0
- ? json_decode($fields['itemtypes'], true)
- : [];
+ if (!isset($fields['itemtypes'], $fields['name'], $fields['id'], $fields['label'])) {
+ return false;
+ }
+
+ $itemtypes = [];
+ if (strlen((string) $fields['itemtypes']) > 0) {
+ $decoded = PluginFieldsToolbox::decodeJSONItemtypes($fields['itemtypes'], true);
+ if (is_array($decoded)) {
+ $itemtypes = $decoded;
+ }
+ }
+
+ $fields['name'] = PluginFieldsToolbox::sanitizeLabel((string) $fields['name']);
+ $fields['id'] = (int) PluginFieldsToolbox::sanitizeLabel((string) $fields['id']);
+ $fields['label'] = PluginFieldsToolbox::sanitizeLabel((string) $fields['label']);
foreach ($itemtypes as $itemtype) {
// prevent usage of plugin class if not loaded
if (!class_exists($itemtype)) {
continue;
}
- $sysname = self::getSystemName($itemtype, $fields['name']);
+ $sysname = self::getSystemName($itemtype, $fields['name']);
$classname = self::getClassname($itemtype, $fields['name']);
+ if ($sysname === '' || $sysname === '0' || ($classname === '' || $classname === '0')) {
+ continue;
+ }
+
$template_class = file_get_contents(PLUGINFIELDS_DIR . '/templates/container.class.tpl');
- $template_class = str_replace('%%CLASSNAME%%', $classname, $template_class);
- $template_class = str_replace('%%ITEMTYPE%%', $itemtype, $template_class);
- $template_class = str_replace('%%CONTAINER%%', $fields['id'], $template_class);
- $template_class = str_replace('%%ITEMTYPE_RIGHT%%', $itemtype::$rightname, $template_class);
- $class_filename = $sysname . '.class.php';
- if (file_put_contents(PLUGINFIELDS_CLASS_PATH . "/$class_filename", $template_class) === false) {
- Toolbox::logDebug("Error : class file creation - $class_filename");
+ $template_class = str_replace(
+ ['%%CLASSNAME%%', '%%ITEMTYPE%%', '%%CONTAINER%%', '%%ITEMTYPE_RIGHT%%'],
+ [
+ $classname,
+ var_export($itemtype, true),
+ var_export($fields['id'], true),
+ var_export($itemtype::$rightname, true),
+ ],
+ $template_class,
+ );
+ $class_filename = basename($sysname) . '.class.php';
+ $filepath = rtrim(PLUGINFIELDS_CLASS_PATH, '/') . '/' . $class_filename;
+ if (file_put_contents($filepath, $template_class) === false) {
+ Toolbox::logInFile('php-errors', 'Error : class file creation - ' . $class_filename);
return false;
}
// Generate Datainjection files
$template_class = file_get_contents(PLUGINFIELDS_DIR . '/templates/injection.class.tpl');
- $template_class = str_replace('%%CLASSNAME%%', $classname, $template_class);
- $template_class = str_replace('%%ITEMTYPE%%', $itemtype, $template_class);
- $template_class = str_replace('%%CONTAINER_ID%%', $fields['id'], $template_class);
- $template_class = str_replace('%%CONTAINER_NAME%%', $fields['label'], $template_class);
- $class_filename = $sysname . 'injection.class.php';
- if (file_put_contents(PLUGINFIELDS_CLASS_PATH . "/$class_filename", $template_class) === false) {
- Toolbox::logDebug("Error : datainjection class file creation - $class_filename");
+ if ($template_class === false) {
+ Toolbox::logInFile('php-errors', 'Error: unable to load injection.class.tpl template.');
+ return false;
+ }
+
+ $template_class = str_replace(
+ ['%%CLASSNAME%%', '%%ITEMTYPE%%', '%%CONTAINER_ID%%', '%%CONTAINER_NAME%%'],
+ [
+ $classname,
+ var_export($itemtype, true),
+ var_export($fields['id'], true),
+ var_export($fields['label'], true),
+ ],
+ $template_class,
+ );
+ $class_filename = basename($sysname) . 'injection.class.php';
+ $filepath = rtrim(PLUGINFIELDS_CLASS_PATH, '/') . '/' . $class_filename;
+ if (file_put_contents($filepath, $template_class) === false) {
+ Toolbox::logInFile('php-errors', 'Error: datainjection class file creation - ' . $class_filename);
return false;
}
}
@@ -767,8 +802,7 @@ public static function preItemPurge($item)
foreach ($founded_containers as $container) {
$itemtypes = json_decode($container['itemtypes']);
if (in_array($itemtype, $itemtypes)) {
- $classname = 'PluginFields' . $itemtype . getSingular($container['name']);
- $classname = preg_replace('/s{2}$/i', 's', $classname); // in case name ends with 'ss' remove last 's'
+ $classname = self::getClassname($itemtype, $container['name']);
$fields = new $classname();
$fields->deleteByCriteria(['items_id' => $item->fields['id']], true);
}
@@ -1406,7 +1440,7 @@ public static function constructHistory(
//for all change find searchoption
foreach ($updates as $key => $changes) {
foreach ($searchoptions as $id_search_option => $searchoption) {
- if ($searchoption['field'] == $key) {
+ if ($searchoption['field'] == $key || $searchoption['linkfield'] == $key) {
$changes[0] = $id_search_option;
if ($searchoption['datatype'] === 'dropdown') {
diff --git a/inc/dropdown.class.php b/inc/dropdown.class.php
index bc239677..1c66490a 100644
--- a/inc/dropdown.class.php
+++ b/inc/dropdown.class.php
@@ -111,37 +111,31 @@ public static function create($input)
return false;
}
+ $input['name'] = PluginFieldsToolbox::sanitizeLabel((string) $input['name']);
+ $input['id'] = (int) PluginFieldsToolbox::sanitizeLabel((string) $input['id']);
+ $input['label'] = PluginFieldsToolbox::sanitizeLabel((string) $input['label']);
+
$classname = self::getClassname($input['name']);
//create dropdown class file
$template_class = str_replace(
- '%%CLASSNAME%%',
- $classname,
- $template_class,
- );
- $template_class = str_replace(
- '%%FIELDNAME%%',
- $input['name'],
- $template_class,
- );
- $template_class = str_replace(
- '%%FIELDID%%',
- $input['id'],
- $template_class,
- );
- $template_class = str_replace(
- '%%LABEL%%',
- $input['label'],
+ ['%%CLASSNAME%%', '%%FIELDNAME%%', '%%FIELDID%%', '%%LABEL%%'],
+ [
+ $classname,
+ var_export($input['name'], true),
+ var_export($input['id'], true),
+ var_export($input['label'], true),
+ ],
$template_class,
);
- $class_filename = $input['name'] . 'dropdown.class.php';
+ $class_filename = basename((string) $input['name']) . 'dropdown.class.php';
if (
file_put_contents(
PLUGINFIELDS_CLASS_PATH . "/$class_filename",
$template_class,
) === false
) {
- Toolbox::logDebug("Error : dropdown class file creation - $class_filename");
+ Toolbox::logInFile('php-errors', 'Error : dropdown class file creation - ' . $class_filename);
return false;
}
@@ -195,7 +189,7 @@ public static function create($input)
//call install method (create table)
if ($classname::install() === false) {
- Toolbox::logDebug("Error : calling dropdown $classname installation");
+ Toolbox::logInFile('php-errors', sprintf('Error : calling dropdown %s installation', $classname));
return false;
}
@@ -213,7 +207,7 @@ public static function destroy($dropdown_name)
//call uninstall method in dropdown class
if ($classname::uninstall() === false) {
- Toolbox::logDebug("Error : calling dropdown $classname uninstallation");
+ Toolbox::logInFile('php-errors', sprintf('Error : calling dropdown %s uninstallation', $classname));
return false;
}
@@ -221,7 +215,7 @@ public static function destroy($dropdown_name)
//remove class file for this dropdown
if (file_exists($class_filename)) {
if (unlink($class_filename) === false) {
- Toolbox::logDebug('Error : dropdown class file creation - ' . $dropdown_name . 'dropdown.class.php');
+ Toolbox::logInFile('php-errors', 'Error : dropdown class file creation - ' . $dropdown_name . 'dropdown.class.php');
return false;
}
@@ -231,7 +225,7 @@ public static function destroy($dropdown_name)
$front_filename = PLUGINFIELDS_FRONT_PATH . '/' . $dropdown_name . 'dropdown.php';
if (file_exists($front_filename)) {
if (unlink($front_filename) === false) {
- Toolbox::logDebug('Error : dropdown front file removing - ' . $dropdown_name . 'dropdown.php');
+ Toolbox::logInFile('php-errors', 'Error : dropdown front file removing - ' . $dropdown_name . 'dropdown.php');
return false;
}
@@ -241,7 +235,7 @@ public static function destroy($dropdown_name)
$form_filename = PLUGINFIELDS_FRONT_PATH . '/' . $dropdown_name . 'dropdown.form.php';
if (file_exists($form_filename)) {
if (unlink($form_filename) === false) {
- Toolbox::logDebug('Error : dropdown form file removing - ' . $dropdown_name . 'dropdown.form.php');
+ Toolbox::logInFile('php-errors', 'Error : dropdown form file removing - ' . $dropdown_name . 'dropdown.form.php');
return false;
}
diff --git a/inc/field.class.php b/inc/field.class.php
index 7f5383d6..8ac10838 100644
--- a/inc/field.class.php
+++ b/inc/field.class.php
@@ -249,7 +249,7 @@ public function prepareInputForAdd($input)
$input['name'] = $this->prepareName($input);
if ($input['multiple'] ?? false) {
- $input['default_value'] = json_encode($input['default_value'] ?? []);
+ $input['default_value'] = json_encode($input['default_value'] ?: []);
}
//reject adding when field name is too long for mysql
diff --git a/inc/labeltranslation.class.php b/inc/labeltranslation.class.php
index a8b844df..a26c635a 100644
--- a/inc/labeltranslation.class.php
+++ b/inc/labeltranslation.class.php
@@ -61,7 +61,7 @@ public static function installBaseData(Migration $migration, $version)
`id` INT {$default_key_sign} NOT NULL auto_increment,
`itemtype` VARCHAR(30) NOT NULL,
`items_id` INT {$default_key_sign} NOT NULL,
- `language` VARCHAR(5) NOT NULL,
+ `language` VARCHAR(10) NOT NULL,
`label` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `itemtype` (`itemtype`),
@@ -86,6 +86,10 @@ public static function installBaseData(Migration $migration, $version)
$migration->addKey($table, 'items_id');
}
+ if ($DB->fieldExists($table, 'language')) {
+ $migration->changeField($table, 'language', 'language', "VARCHAR(10) NOT NULL");
+ }
+
return true;
}
diff --git a/inc/toolbox.class.php b/inc/toolbox.class.php
index 91c412d0..9dc4b32b 100644
--- a/inc/toolbox.class.php
+++ b/inc/toolbox.class.php
@@ -130,14 +130,14 @@ public function fixFieldsNames(Migration $migration, $condition)
$new_name = $field_obj->prepareName($field);
if ($new_name > 64) {
// limit fields names to 64 chars (MySQL limit)
- $new_name = substr($new_name, 0, 64);
+ $new_name = substr((string) $new_name, 0, 64);
}
while (
'dropdown' === $field['type']
&& strlen(getTableForItemType(PluginFieldsDropdown::getClassname($new_name))) > 64
) {
// limit tables names to 64 chars (MySQL limit)
- $new_name = substr($new_name, 0, -1);
+ $new_name = substr((string) $new_name, 0, -1);
}
$DB->update(
PluginFieldsField::getTable(),
@@ -361,4 +361,20 @@ public static function getGlpiItemtypes(): array
return $all_itemtypes;
}
+
+ public static function sanitizeLabel(string $label): string
+ {
+ return preg_replace('/[^\p{L}\p{N}\s\-\_\.]/u', '', $label);
+ }
+
+ public static function decodeJSONItemtypes(string $itemtypes, ?bool $associative = null)
+ {
+ $jsonitemtype = json_decode($itemtypes, $associative);
+ if ($jsonitemtype === null && json_last_error() !== JSON_ERROR_NONE) {
+ $fixed_json = str_replace('\\', '\\\\', $itemtypes);
+ $jsonitemtype = json_decode($fixed_json, $associative);
+ }
+
+ return $jsonitemtype;
+ }
}
diff --git a/plugin.xml b/plugin.xml
index 38e82b8d..a883048e 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -98,15 +98,30 @@ Il existe un [script de migration](https://github.com/pluginsGLPI/customfields/b
Olivier Moron
+
+ 1.21.26
+ ~10.0.11
+ https://github.com/pluginsGLPI/fields/releases/download/1.21.26/glpi-fields-1.21.26.tar.bz2
+
+
+ 1.21.25
+ ~10.0.11
+ https://github.com/pluginsGLPI/fields/releases/download/1.21.25/glpi-fields-1.21.25.tar.bz2
+
+
+ 1.21.24
+ ~10.0.11
+ https://github.com/pluginsGLPI/fields/releases/download/1.21.24/glpi-fields-1.21.24.tar.bz2
+
1.21.23
~10.0.11
https://github.com/pluginsGLPI/fields/releases/download/1.21.23/glpi-fields-1.21.23.tar.bz2
- 1.22.0-beta3
+ 1.22.0
~11.0.0
- https://github.com/pluginsGLPI/fields/releases/download/1.22.0-beta3/glpi-fields-1.22.0-beta3.tar.bz2
+ https://github.com/pluginsGLPI/fields/releases/download/1.22.0/glpi-fields-1.22.0.tar.bz2
1.21.22
diff --git a/setup.php b/setup.php
index 619c27dc..1b02c436 100644
--- a/setup.php
+++ b/setup.php
@@ -28,7 +28,7 @@
* -------------------------------------------------------------------------
*/
-define('PLUGIN_FIELDS_VERSION', '1.21.23');
+define('PLUGIN_FIELDS_VERSION', '1.21.26');
// Minimal GLPI version, inclusive
define('PLUGIN_FIELDS_MIN_GLPI', '10.0.11');
diff --git a/templates/container.class.tpl b/templates/container.class.tpl
index 58bd527f..0e6f36e4 100644
--- a/templates/container.class.tpl
+++ b/templates/container.class.tpl
@@ -2,7 +2,7 @@
class %%CLASSNAME%% extends PluginFieldsAbstractContainerInstance
{
- static $rightname = '%%ITEMTYPE_RIGHT%%';
+ static $rightname = %%ITEMTYPE_RIGHT%%;
static function install() {
global $DB;
@@ -20,8 +20,8 @@ class %%CLASSNAME%% extends PluginFieldsAbstractContainerInstance
$query = "CREATE TABLE IF NOT EXISTS `$table` (
`id` INT {$default_key_sign} NOT NULL auto_increment,
`items_id` INT {$default_key_sign} NOT NULL,
- `itemtype` VARCHAR(255) DEFAULT '%%ITEMTYPE%%',
- `plugin_fields_containers_id` INT {$default_key_sign} NOT NULL DEFAULT '%%CONTAINER%%',
+ `itemtype` VARCHAR(255) DEFAULT " . var_export(%%ITEMTYPE%%, true) . ",
+ `plugin_fields_containers_id` INT {$default_key_sign} NOT NULL DEFAULT " . var_export(%%CONTAINER%%, true) . ",
PRIMARY KEY (`id`),
UNIQUE INDEX `itemtype_item_container`
(`itemtype`, `items_id`, `plugin_fields_containers_id`)
diff --git a/templates/dropdown.class.tpl b/templates/dropdown.class.tpl
index 77929514..9feb1211 100644
--- a/templates/dropdown.class.tpl
+++ b/templates/dropdown.class.tpl
@@ -24,13 +24,15 @@ class %%CLASSNAME%% extends CommonTreeDropdown {
$obj = new self();
$table = $obj->getTable();
+ $plugin_fields_fieldname_dropdowns_id = 'plugin_fields_' . preg_replace('/[^a-zA-Z0-9_]/', '', %%FIELDNAME%%) . 'dropdowns_id';
+
if (!$DB->tableExists($table)) {
$query = "CREATE TABLE IF NOT EXISTS `$table` (
`id` INT {$default_key_sign} NOT NULL auto_increment,
`name` VARCHAR(255) DEFAULT NULL,
`completename` TEXT DEFAULT NULL,
`comment` TEXT DEFAULT NULL,
- `plugin_fields_%%FIELDNAME%%dropdowns_id` INT {$default_key_sign} DEFAULT NULL,
+ `{$plugin_fields_fieldname_dropdowns_id}` INT {$default_key_sign} DEFAULT NULL,
`level` INT DEFAULT NULL,
`ancestors_cache` TEXT DEFAULT NULL,
`sons_cache` TEXT DEFAULT NULL,
@@ -39,8 +41,8 @@ class %%CLASSNAME%% extends CommonTreeDropdown {
PRIMARY KEY (`id`),
KEY `entities_id` (`entities_id`),
KEY `is_recursive` (`is_recursive`),
- KEY `plugin_fields_%%FIELDNAME%%dropdowns_id`
- (`plugin_fields_%%FIELDNAME%%dropdowns_id`)
+ KEY `{$plugin_fields_fieldname_dropdowns_id}`
+ (`{$plugin_fields_fieldname_dropdowns_id}`)
) ENGINE=InnoDB DEFAULT CHARSET={$default_charset} COLLATE={$default_collation} ROW_FORMAT=DYNAMIC;";
$DB->query($query) or die ($DB->error());
}
diff --git a/templates/injection.class.tpl b/templates/injection.class.tpl
index eb5e28b5..9568df20 100644
--- a/templates/injection.class.tpl
+++ b/templates/injection.class.tpl
@@ -5,7 +5,7 @@ class %%CLASSNAME%%Injection extends %%CLASSNAME%% implements PluginDatainjectio
static $rightname = 'plugin_datainjection_model';
/**
- * Return the table used to stor this object
+ * Return the table used to store this object
*
* @see CommonDBTM::getTable()
*
@@ -16,36 +16,40 @@ class %%CLASSNAME%%Injection extends %%CLASSNAME%% implements PluginDatainjectio
}
static function getTypeName($nb = 0) {
- return %%ITEMTYPE%%::getTypeName() . " - %%CONTAINER_NAME%%";
+ $itemtype = %%ITEMTYPE%%;
+ $container_name = %%CONTAINER_NAME%%;
+ return $itemtype::getTypeName($nb) . " - " . $container_name;
}
/**
- * Tells datainjection is the type is a primary type or not
+ * Tells datainjection if the type is a primary type or not
*
- * @return iboolean
+ * @return boolean
**/
function isPrimaryType() {
return false;
}
/**
- * Indicates to with other types it can be connected
+ * Indicates with which other types it can be connected
*
* @return an array of GLPI types
**/
function connectedTo() {
- return array('%%ITEMTYPE%%');
+ return [%%ITEMTYPE%%];
}
/**
- * Function which calls getSearchOptions and add more parameters specific to display
+ * Function which calls getSearchOptions and adds more parameters specific to display
*
* @param string $primary_type (default '')
*
* @return array of search options, as defined in each commondbtm object
**/
function getOptions($primary_type='') {
- $searchoptions = PluginFieldsContainer::getAddSearchOptions('%%ITEMTYPE%%', %%CONTAINER_ID%%);
+ $container_id = (int) %%CONTAINER_ID%%;
+
+ $searchoptions = PluginFieldsContainer::getAddSearchOptions(%%ITEMTYPE%%, $container_id);
foreach ($searchoptions as $id => $data) {
$searchoptions[$id]['injectable'] = PluginDatainjectionCommonInjectionLib::FIELD_INJECTABLE;
@@ -62,9 +66,9 @@ class %%CLASSNAME%%Injection extends %%CLASSNAME%% implements PluginDatainjectio
}
/**
- * Standard method to add an object into glpi
+ * Standard method to add an object into GLPI
*
- * @param $values array fields to add into glpi
+ * @param $values array fields to add into GLPI
* @param $options array options used during creation
*
* @return array of IDs of newly created objects: