Skip to content

[BUG] ClassNotFoundError on plugin installation/activation for custom asset class #1042

@coca-mann

Description

@coca-mann

Code of Conduct

  • I agree to follow this project's Code of Conduct

Is there an existing issue for this?

  • I have searched the existing issues

GLPI Version

11.0.1

Plugin version

1.22.1

Bug description

When trying to install or activate the Fields plugin on GLPI 11.0.1, a fatal PHP error occurs: ClassNotFoundError. The error seems related to the plugin trying to load a dynamically generated class for a custom asset type that was previously managed by the genericobject plugin.

The error happens during the plugin_fields_install() process, which suggests it fails to correctly handle or generate classes for existing custom asset types.

Relevant log output

glpi.WARNING:   *** Warning: foreach() argument must be of type array|object, null given at container.class.php line 244
  Backtrace :
  ./marketplace/fields/inc/container.class.php:244   
  ./marketplace/fields/hook.php:87                   PluginFieldsContainer::installUserData()
  ./src/Plugin.php:1160                              plugin_fields_install()
  :                                                  Plugin->install()
  ./src/Glpi/Marketplace/Controller.php:655          call_user_func()
  ./src/Glpi/Marketplace/Controller.php:545          Glpi\Marketplace\Controller->setPluginState()
  ./ajax/marketplace.php:63                          Glpi\Marketplace\Controller->installPlugin()
  ...Glpi/Controller/LegacyFileLoadController.php:64 require()
  ./vendor/symfony/http-kernel/HttpKernel.php:181    Glpi\Controller\LegacyFileLoadController->__invoke()
  ./vendor/symfony/http-kernel/HttpKernel.php:76     Symfony\Component\HttpKernel\HttpKernel->handleRaw()
  ./vendor/symfony/http-kernel/Kernel.php:197        Symfony\Component\HttpKernel\HttpKernel->handle()
  ./public/index.php:70                              Symfony\Component\HttpKernel\Kernel->handle()
glpi.WARNING:   *** Warning: foreach() argument must be of type array|object, null given at container.class.php line 244
  Backtrace :
  ./marketplace/fields/inc/container.class.php:244   
  ./marketplace/fields/hook.php:87                   PluginFieldsContainer::installUserData()
  ./src/Plugin.php:1160                              plugin_fields_install()
  :                                                  Plugin->install()
  ./src/Glpi/Marketplace/Controller.php:655          call_user_func()
  ./src/Glpi/Marketplace/Controller.php:545          Glpi\Marketplace\Controller->setPluginState()
  ./ajax/marketplace.php:63                          Glpi\Marketplace\Controller->installPlugin()
  ...Glpi/Controller/LegacyFileLoadController.php:64 require()
  ./vendor/symfony/http-kernel/HttpKernel.php:181    Glpi\Controller\LegacyFileLoadController->__invoke()
  ./vendor/symfony/http-kernel/HttpKernel.php:76     Symfony\Component\HttpKernel\HttpKernel->handleRaw()
  ./vendor/symfony/http-kernel/Kernel.php:197        Symfony\Component\HttpKernel\HttpKernel->handle()
  ./public/index.php:70                              Symfony\Component\HttpKernel\Kernel->handle()
glpi.WARNING:   *** Warning: foreach() argument must be of type array|object, null given at container.class.php line 244
  Backtrace :
  ./marketplace/fields/inc/container.class.php:244   
  ./marketplace/fields/hook.php:87                   PluginFieldsContainer::installUserData()
  ./src/Plugin.php:1160                              plugin_fields_install()
  :                                                  Plugin->install()
  ./src/Glpi/Marketplace/Controller.php:655          call_user_func()
  ./src/Glpi/Marketplace/Controller.php:545          Glpi\Marketplace\Controller->setPluginState()
  ./ajax/marketplace.php:63                          Glpi\Marketplace\Controller->installPlugin()
  ...Glpi/Controller/LegacyFileLoadController.php:64 require()
  ./vendor/symfony/http-kernel/HttpKernel.php:181    Glpi\Controller\LegacyFileLoadController->__invoke()
  ./vendor/symfony/http-kernel/HttpKernel.php:76     Symfony\Component\HttpKernel\HttpKernel->handleRaw()
  ./vendor/symfony/http-kernel/Kernel.php:197        Symfony\Component\HttpKernel\HttpKernel->handle()
  ./public/index.php:70                              Symfony\Component\HttpKernel\Kernel->handle()
glpi.CRITICAL:   *** Uncaught PHP Exception Symfony\Component\ErrorHandler\Error\ClassNotFoundError: "Attempted to load class "PluginFieldsGlpicustomassetprojetorassetadicionai" from the global namespace.
Did you forget a "use" statement?" at container.class.php line 725
  Backtrace :
  ./marketplace/fields/inc/container.class.php:725   
  ./marketplace/fields/inc/container.class.php:428   PluginFieldsContainer::create()
  ./marketplace/fields/hook.php:87                   PluginFieldsContainer::installUserData()
  ./src/Plugin.php:1160                              plugin_fields_install()
  :                                                  Plugin->install()
  ./src/Glpi/Marketplace/Controller.php:655          call_user_func()
  ./src/Glpi/Marketplace/Controller.php:545          Glpi\Marketplace\Controller->setPluginState()
  ./ajax/marketplace.php:63                          Glpi\Marketplace\Controller->installPlugin()
  ...Glpi/Controller/LegacyFileLoadController.php:64 require()
  ./vendor/symfony/http-kernel/HttpKernel.php:181    Glpi\Controller\LegacyFileLoadController->__invoke()
  ./vendor/symfony/http-kernel/HttpKernel.php:76     Symfony\Component\HttpKernel\HttpKernel->handleRaw()
  ./vendor/symfony/http-kernel/Kernel.php:197        Symfony\Component\HttpKernel\HttpKernel->handle()
  ./public/index.php:70                              Symfony\Component\HttpKernel\Kernel->handle()

Page URL

No response

Steps To reproduce

  1. Set up an environment with GLPI 11.0.1.
  2. Have existing asset types and objects created with the genericobject plugin (in my case, "projetor" / projector).
  3. Attempt to install the Fields plugin via the marketplace.
  4. The installation fails, and the error is logged.

Your GLPI setup information

GLPI information
GLPI: 11.0.1 ( => /var/www/glpi/glpi)
Installation mode: TARBALL
Current language: pt_BR
Source Integrity: N/A
Server
Operating system: Linux centraldeservicos 5.10.0-31-amd64 #​1 SMP Debian 5.10.221-1 (2024-07-14) x86_64

PHP: 8.3.26 fpm-fcgi

PHP extensions: Core, date, libxml, openssl, pcre, zlib, filter, hash, json, random, Reflection, SPL, session, standard, sodium,
cgi-fcgi, mysqlnd, PDO, xml, apcu, bcmath, bz2, calendar, ctype, curl, dom, mbstring, FFI, fileinfo, ftp, gd, gettext, iconv,
igbinary, imap, intl, ldap, exif, mysqli, pdo_mysql, Phar, posix, readline, shmop, SimpleXML, soap, sockets, sysvmsg, sysvsem,
sysvshm, tokenizer, xmlreader, xmlrpc, xmlwriter, xsl, zip, redis, Zend OPcache

Setup: disable_functions="" max_execution_time="30" max_input_vars="1000" memory_limit="128M" post_max_size="8M"
session.cookie_secure="1" session.cookie_httponly="1" session.cookie_samesite="Lax" session.save_handler="files"
upload_max_filesize="2M"

Web server: nginx/1.18.0 ()

User agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36

Database:

Server Software: mariadb.org binary distribution

Server Version: 10.11.14-MariaDB-deb11

Server SQL Mode: STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Parameters: userglpi@localhost/glpidb

Host info: Localhost via UNIX socket

Requirements:
PHP version (8.3.26) is supported.
OS and PHP are relying on 64 bits integers.
Sessions configuration is OK.
Allocated memory is sufficient.
Following extensions are installed: dom, fileinfo, filter, libxml, simplexml, tokenizer, xmlreader,
xmlwriter.
mysqli extension is installed
curl extension is installed
gd extension is installed
intl extension is installed
mbstring extension is installed
zlib extension is installed
bcmath extension is installed
The constant
SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES is present.
openssl extension is installed
Database engine version (10.11.14) is
supported.
The log file has been created successfully.
Write access
to /var/lib/glpi/files/_cache has been validated.
Write access to /var/lib/glpi/files/_cron has been validated.
Write access to /var/lib/glpi/files has been validated.
Write access to /var/lib/glpi/files/_graphs has been validated.
Write access to /var/lib/glpi/files/_lock has been validated.
Write access to /var/lib/glpi/files/_pictures has been validated.
Write access to /var/lib/glpi/files/_plugins has been validated.
Write access to /var/lib/glpi/files/_rss has been validated.
Write access to /var/lib/glpi/files/_sessions has been validated.
Write access to /var/lib/glpi/files/_tmp has been validated.
Write access to /var/lib/glpi/files/_uploads has been validated.

Sessions configuration is secured.
exif extension is installed
ldap extension is installed
Following extensions are installed: bz2,
Phar, zip.
Zend OPcache extension is installed
Following extensions are installed:
ctype, iconv, sodium.
Write access to
/var/www/glpi/glpi/marketplace has been validated.
Timezones seems loaded in database.

GLPI constants
GLPI_ROOT: "/var/www/glpi/glpi"
GLPI_VERSION: "11.0.1"
GLPI_SCHEMA_VERSION: "11.0.1"
GLPI_FILES_VERSION: "11.0.1-3a9929cf"
GLPI_MIN_PHP: "8.2"
GLPI_MAX_PHP: "8.5"
GLPI_YEAR: "2025"
GLPI_I18N_DIR: "/var/www/glpi/glpi/locales"
GLPI_CONFIG_DIR: "/etc/glpi/config"
GLPI_VAR_DIR: "/var/lib/glpi/files"
GLPI_LOG_DIR: "/var/log/glpi"
GLPI_ENVIRONMENT_TYPE: "production"
GLPI_MARKETPLACE_DIR: "/var/www/glpi/glpi/marketplace"
GLPI_ALLOW_IFRAME_IN_RICH_TEXT: false
GLPI_SERVERSIDE_URL_ALLOWLIST: ["^\n (http|https|feed)://
# protocol\n (\n (?:\n
(?:xn--[a-z0-9-]++\.)*+xn--[a-z0-9-]++ # a domain name using punycode\n
|\n (?:[\pL\pN\pS\pM\-\]++\.)+[\pL\pN\pM]++ # a multi-level domain
name\n |\n [a-z0-9\-\
]++
# a single-level domain name\n )\.?\n |
# or\n \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
# an IP address\n | #
or\n \[\n
(?:(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-f]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,1}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,2}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,3}(?:(?:[0-9a-f]{1,4})))?::(?:(?:[0-9a-f]{1,4})):)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,4}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,5}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,6}(?:(?:[0-9a-f]{1,4})))?::))))\n
\] # an IPv6 address\n
)\n (?:/ (?:[\pL\pN\pS\pM\-._\
!$&'()+,;=:@]|%[0-9A-Fa-f]{2}) )* # a path\n
(?:\? (?:[\pL\pN\-._\~!$&'\\+,;=:@/?]|%[0-9A-Fa-f]{2}) )? # a query (optional)\n
$~ixuD"]
GLPI_DISALLOWED_UPLOADS_PATTERN: "/\.(php\d*|phar)$/i"
GLPI_TELEMETRY_URI: "https://telemetry.glpi-project.org"
GLPI_INSTALL_MODE: "TARBALL"
GLPI_NETWORK_MAIL: "glpi@teclib.com"
GLPI_NETWORK_SERVICES: "https://services.glpi-network.com"
GLPI_MARKETPLACE_ENABLE: 3
GLPI_MARKETPLACE_PRERELEASES: false
GLPI_MARKETPLACE_ALLOW_OVERRIDE: true
GLPI_MARKETPLACE_MANUAL_DOWNLOADS: true
GLPI_USER_AGENT_EXTRA_COMMENTS: ""
GLPI_DOCUMENTATION_ROOT_URL: "https://links.glpi-project.org"
GLPI_DISABLE_ONLY_FULL_GROUP_BY_SQL_MODE: "1"
GLPI_LOG_LVL: "warning"
GLPI_SKIP_UPDATES: false
GLPI_STRICT_ENV: false
GLPI_AJAX_DASHBOARD: "1"
GLPI_CALDAV_IMPORT_STATE: 0
GLPI_CENTRAL_WARNINGS: "1"
GLPI_SYSTEM_CRON: false
GLPI_TEXT_MAXSIZE: "4000"
GLPI_WEBHOOK_ALLOW_RESPONSE_SAVING: "0"
GLPI_WEBHOOK_CRA_MANDATORY: false
GLPI_ALTCHA_MODE: "interactive"
GLPI_ALTCHA_MAX_NUMBER: 50000
GLPI_ALTCHA_EXPIRATION_INTERVAL: "PT20M"
GLPI_DOC_DIR: "/var/lib/glpi/files"
GLPI_CACHE_DIR: "/var/lib/glpi/files/_cache"
GLPI_CRON_DIR: "/var/lib/glpi/files/_cron"
GLPI_GRAPH_DIR: "/var/lib/glpi/files/_graphs"
GLPI_LOCAL_I18N_DIR: "/var/lib/glpi/files/_locales"
GLPI_LOCK_DIR: "/var/lib/glpi/files/_lock"
GLPI_PICTURE_DIR: "/var/lib/glpi/files/_pictures"
GLPI_PLUGIN_DOC_DIR: "/var/lib/glpi/files/_plugins"
GLPI_RSS_DIR: "/var/lib/glpi/files/_rss"
GLPI_SESSION_DIR: "/var/lib/glpi/files/_sessions"
GLPI_TMP_DIR: "/var/lib/glpi/files/_tmp"
GLPI_UPLOAD_DIR: "/var/lib/glpi/files/_uploads"
GLPI_INVENTORY_DIR: "/var/lib/glpi/files/_inventories"
GLPI_THEMES_DIR: "/var/lib/glpi/files/_themes"
GLPI_PLUGINS_DIRECTORIES: ["/var/www/glpi/glpi/marketplace","/var/www/glpi/glpi/plugins"]
GLPI_NETWORK_REGISTRATION_API_URL: "https://services.glpi-network.com/api/registration/"
GLPI_MARKETPLACE_PLUGINS_API_URI: "https://services.glpi-network.com/api/marketplace/"
Diretórios LDAP
Server: 'gac.local',
Port: '389',
BaseDN: 'DC=gac,DC=local',
Connection filter: '(&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))',
RootDN: 'GAC\glpi',
Use TLS: none

Server: '127.0.0.1',
Port: '1636',
BaseDN: 'ou=Users,dc=fimca,dc=com,dc=br',
Connection filter: none,
RootDN: 'ElaborateS',
Use TLS: none

Server: '127.0.0.1',
Port: '1637',
BaseDN: 'ou=Users,dc=metropolitana-ro,dc=com,dc=br',
Connection filter: none,
RootDN: 'Extra-Larg',
Use TLS: none

Réplicas SQL
Not active
Notifications
Way of sending emails: SMTP(smtp://nao-responda%40grupoapariciocarvalho.com.br:********@smtp.gmail.com:465)
Name: 'chamado@fimca.com.br'
Active: No
Server: '{pop.gmail.com/pop/ssl}'
Login: 'chamado@fimca.com.br'
Password: Yes
Plugins list
fields               Name: Additional fields              Version: 1.22.1     State: Não instalado
Install Method: Marketplace
advancedforms Name: advancedforms Version: 1.0.0 State: Habilitado
Install Method: Marketplace
news Name: Alerts Version: 1.13.0 State: Habilitado
Install Method: Marketplace
behaviors Name: Behaviours Version: 3.0.1 State: Habilitado
Install Method: Marketplace
escalade Name: Escalation Version: 2.10.0 State: Habilitado
Install Method: Marketplace
formcreator Name: Formcreator End-of-Life Update Version: 3.0.0 State: Habilitado
Install Method: Marketplace
gappessentials Name: Gapp Essentials Version: 2.3.0 State: Instalado / não ativado
Install Method: Marketplace
genericobject Name: Generic Objects End-of-Life Up Version: 3.0.0 State: Habilitado
Install Method: Marketplace
metademands Name: Meta-Demands Version: 3.3.28 State: Não instalado
Install Method: Marketplace
satisfaction Name: More satisfaction Version: 1.7.0 State: Habilitado
Install Method: Marketplace
dashboard Name: Painel Version: 1.0.3 State: Habilitado
Install Method: Manual
releases Name: Releases Version: 2.1.1 State: Instalado / não ativado
Install Method: Marketplace
reservation Name: Reservation Version: 2.5.0 State: Instalado / não ativado
Install Method: Manual
sdbmailaction Name: Servicedesk Brasil - E-Mail Aç Version: 2.0.0 State: Habilitado
Install Method: Manual

Anything else?

No response

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions