glpi-project / glpi

GLPI is a Free Asset and IT Management Software package, Data center management, ITIL Service Desk, licenses tracking and software auditing.
https://glpi-project.org
GNU General Public License v3.0
4.3k stars 1.29k forks source link

Browser notifications stuck in notifications queue #17684

Open Berlinst opened 3 months ago

Berlinst commented 3 months ago

Code of Conduct

Is there an existing issue for this?

Version

10.0.16

Bug description

I created a browser notification for new tickets. Upon creating a new ticket, I receive the notification in my browser as expected. However, when checking the notification queue, I notice that the notification remains in the queue; it does not clear after being sent.

I tested by forcing the notification to be sent, but it still remains in the queue, and I receive the following message:

image

I have also executed the 'queuednotificationclean' automatic action both through GLPI and the CLI, but the notification still does not clear from the queue.

The notification only clears from the queue if I manually select it and move it to the trash bin. However, this approach is obviously not feasible for managing notifications.

Relevant log output

No response

Page URL

https://yourglpi.com/front/queuednotification.php

Steps To reproduce

  1. Create a browser notification for new tickets.
  2. Create a new ticket and observe that the browser notification is received.
  3. Check the notification queue and observe that the notification remains in the queue.
  4. Attempt to force the sending of notifications and observe that the notification still does not clear from the queue.

Your GLPI setup information

Information about system installation & configuration
GLPI 10.0.16 ( => /usr/share/glpiteste)
Installation mode: TARBALL
Current language:en_US

Server
 
Operating system: Linux servicetic-server 5.15.0-208.159.3.2.el8uek.x86_64 #​2 SMP Wed Jul 17 12:11:35 PDT 2024 x86_64
PHP 8.1.29 fpm-fcgi (Core, PDO, Phar, Reflection, SPL, SimpleXML, Zend OPcache, apcu, bcmath, bz2, calendar, cgi-fcgi, ctype,
    curl, date, dom, exif, fileinfo, filter, ftp, gd, gettext, hash, iconv, imap, intl, json, krb5, ldap, libxml, mbstring, mysql,
    mysqli, mysqlnd, openssl, pcre, pdo_mysql, pdo_sqlite, posix, selinux, session, shmop, snmp, soap, sockets, sodium, sqlite3,
    standard, sysvmsg, sysvsem, sysvshm, tokenizer, xml, xmlreader, xmlrpc, xmlwriter, xsl, zip, zlib)
Setup: max_execution_time="30" memory_limit="512M" post_max_size="512M" safe_mode="" session.save_handler="files"
    upload_max_filesize="100M" disable_functions="" 
Software: Apache/2.4.37 (Oracle Linux Server) OpenSSL/1.1.1k ()
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36 Edg/127.0.0.0
Server Software: Percona Server (GPL), Release 29, Revision 30dc4e71
    Server Version: 8.0.37-29
    Server SQL Mode: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    Parameters: glpiteste@localhost/glpiteste
    Host info: Localhost via UNIX socket

PHP version (8.1.29) is supported.
Sessions configuration is OK.
Allocated memory is sufficient.
mysqli extension is installed.
Following extensions are installed: dom, fileinfo, filter, libxml, json, simplexml, xmlreader, xmlwriter.
curl extension is installed.
gd extension is installed.
intl extension is installed.
zlib extension is installed.
The constant SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES is present.
Database engine version (8.0.37) is supported.
No files from previous GLPI version detected.
The log file has been created successfully.
Write access to /var/lib/glpiteste/files/_cache has been validated.
Write access to /var/lib/glpiteste/files/_cron has been validated.
Write access to /var/lib/glpiteste/files/_documents has been validated.
Write access to /var/lib/glpiteste/files/_dumps has been validated.
Write access to /var/lib/glpiteste/files/_graphs has been validated.
Write access to /var/lib/glpiteste/files/_lock has been validated.
Write access to /var/lib/glpiteste/files/_pictures has been validated.
Write access to /var/lib/glpiteste/files/_plugins has been validated.
Write access to /var/lib/glpiteste/files/_rss has been validated.
Write access to /var/lib/glpiteste/files/_sessions has been validated.
Write access to /var/lib/glpiteste/files/_tmp has been validated.
Write access to /var/lib/glpiteste/files/_uploads has been validated.
For security reasons, SELinux mode should be Enforcing.

Web server root directory configuration seems safe.
Sessions configuration is secured.
OS and PHP are relying on 64 bits integers.
exif extension is installed.
ldap extension is installed.
openssl extension is installed.
Following extensions are installed: bz2, Phar, zip.
Zend OPcache extension is installed.
Following extensions are installed: ctype, iconv, mbstring, sodium.
Write access to /usr/share/glpiteste/marketplace has been validated.
Timezones seems loaded in database.

GLPI constants
 
GLPI_ROOT: "/usr/share/glpiteste"
GLPI_CONFIG_DIR: "/etc/glpiteste"
GLPI_MARKETPLACE_ALLOW_OVERRIDE: false
GLPI_VAR_DIR: "/var/lib/glpiteste/files"
GLPI_DOC_DIR: "/var/lib/glpiteste/files/_documents"
GLPI_CRON_DIR: "/var/lib/glpiteste/files/_cron"
GLPI_DUMP_DIR: "/var/lib/glpiteste/files/_dumps"
GLPI_GRAPH_DIR: "/var/lib/glpiteste/files/_graphs"
GLPI_LOCK_DIR: "/var/lib/glpiteste/files/_lock"
GLPI_PICTURE_DIR: "/var/lib/glpiteste/files/_pictures"
GLPI_PLUGIN_DOC_DIR: "/var/lib/glpiteste/files/_plugins"
GLPI_RSS_DIR: "/var/lib/glpiteste/files/_rss"
GLPI_SESSION_DIR: "/var/lib/glpiteste/files/_sessions"
GLPI_TMP_DIR: "/var/lib/glpiteste/files/_tmp"
GLPI_UPLOAD_DIR: "/var/lib/glpiteste/files/_uploads"
GLPI_CACHE_DIR: "/var/lib/glpiteste/files/_cache"
GLPI_LOG_DIR: "/var/log/glpiteste"
GLPI_SYSTEM_CRON: true
GLPI_MARKETPLACE_DIR: "/usr/share/glpiteste/marketplace"
GLPI_USE_CSRF_CHECK: "1"
GLPI_CSRF_EXPIRES: "7200"
GLPI_CSRF_MAX_TOKENS: "100"
GLPI_USE_IDOR_CHECK: "1"
GLPI_IDOR_EXPIRES: "7200"
GLPI_ALLOW_IFRAME_IN_RICH_TEXT: false
GLPI_SERVERSIDE_URL_ALLOWLIST: ["/^(https?|feed):\\/\\/[^@:]+(\\/.*)?$/"]
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_MANUAL_DOWNLOADS: true
GLPI_USER_AGENT_EXTRA_COMMENTS: ""
GLPI_DISABLE_ONLY_FULL_GROUP_BY_SQL_MODE: "1"
GLPI_AJAX_DASHBOARD: "1"
GLPI_CALDAV_IMPORT_STATE: 0
GLPI_DEMO_MODE: "0"
GLPI_CENTRAL_WARNINGS: "1"
GLPI_TEXT_MAXSIZE: "4000"
GLPI_LOCAL_I18N_DIR: "/var/lib/glpiteste/files/_locales"
GLPI_INVENTORY_DIR: "/var/lib/glpiteste/files/_inventories"
GLPI_NETWORK_REGISTRATION_API_URL: "https://services.glpi-network.com/api/registration/"
GLPI_MARKETPLACE_PLUGINS_API_URI: "https://services.glpi-network.com/api/marketplace/"
GLPI_I18N_DIR: "/usr/share/glpiteste/locales"
GLPI_VERSION: "10.0.16"
GLPI_SCHEMA_VERSION: "10.0.16"
GLPI_MARKETPLACE_PRERELEASES: false
GLPI_MIN_PHP: "7.4.0"
GLPI_MAX_PHP: "8.4.0"
GLPI_YEAR: "2024"

Libraries
 
htmlawed/htmlawed version 1.2.14 in (/usr/share/glpiteste/vendor/htmlawed/htmlawed)
phpmailer/phpmailer version 6.8.0 in (/usr/share/glpiteste/vendor/phpmailer/phpmailer/src)
simplepie/simplepie version 1.5.8 in (/usr/share/glpiteste/vendor/simplepie/simplepie/library)
tecnickcom/tcpdf version 6.4.4 in (/usr/share/glpiteste/plugins/pdf/vendor/tecnickcom/tcpdf)
michelf/php-markdown in (/usr/share/glpiteste/vendor/michelf/php-markdown/Michelf)
true/punycode in (/usr/share/glpiteste/vendor/true/punycode/src)
iamcal/lib_autolink in (/usr/share/glpiteste/vendor/iamcal/lib_autolink)
sabre/dav in (/usr/share/glpiteste/vendor/sabre/dav/lib/DAV)
sabre/http in (/usr/share/glpiteste/vendor/sabre/http/lib)
sabre/uri in (/usr/share/glpiteste/vendor/sabre/uri/lib)
sabre/vobject in (/usr/share/glpiteste/vendor/sabre/vobject/lib)
laminas/laminas-i18n in (/usr/share/glpiteste/vendor/laminas/laminas-i18n/src)
laminas/laminas-servicemanager in (/usr/share/glpiteste/vendor/laminas/laminas-servicemanager/src)
monolog/monolog in (/usr/share/glpiteste/vendor/monolog/monolog/src/Monolog)
sebastian/diff in (/usr/share/glpiteste/vendor/sebastian/diff/src)
donatj/phpuseragentparser in (/usr/share/glpiteste/vendor/donatj/phpuseragentparser/src/UserAgent)
elvanto/litemoji in (/usr/share/glpiteste/vendor/elvanto/litemoji/src)
symfony/console in (/usr/share/glpiteste/vendor/symfony/console)
scssphp/scssphp in (/usr/share/glpiteste/vendor/scssphp/scssphp/src)
laminas/laminas-mail in (/usr/share/glpiteste/vendor/laminas/laminas-mail/src/Protocol)
laminas/laminas-mime in (/usr/share/glpiteste/vendor/laminas/laminas-mime/src)
rlanvin/php-rrule in (/usr/share/glpiteste/vendor/rlanvin/php-rrule/src)
ramsey/uuid in (/usr/share/glpiteste/vendor/ramsey/uuid/src)
psr/log in (/usr/share/glpiteste/vendor/psr/log/Psr/Log)
psr/simple-cache in (/usr/share/glpiteste/vendor/psr/simple-cache/src)
psr/cache in (/usr/share/glpiteste/vendor/psr/cache/src)
league/csv in (/usr/share/glpiteste/vendor/league/csv/src)
mexitek/phpcolors in (/usr/share/glpiteste/vendor/mexitek/phpcolors/src/Mexitek/PHPColors)
guzzlehttp/guzzle in (/usr/share/glpiteste/vendor/guzzlehttp/guzzle/src)
guzzlehttp/psr7 in (/usr/share/glpiteste/vendor/guzzlehttp/psr7/src)
glpi-project/inventory_format in (/usr/share/glpiteste/vendor/glpi-project/inventory_format/lib/php)
wapmorgan/unified-archive in (/usr/share/glpiteste/vendor/wapmorgan/unified-archive/src)
paragonie/sodium_compat in (/usr/share/glpiteste/vendor/paragonie/sodium_compat/src)
symfony/cache in (/usr/share/glpiteste/vendor/symfony/cache)
html2text/html2text in (/usr/share/glpiteste/vendor/html2text/html2text/src)
symfony/css-selector in (/usr/share/glpiteste/vendor/symfony/css-selector)
symfony/dom-crawler in (/usr/share/glpiteste/vendor/symfony/dom-crawler)
twig/twig in (/usr/share/glpiteste/vendor/twig/twig/src)
twig/string-extra in (/usr/share/glpiteste/vendor/twig/string-extra)
symfony/polyfill-ctype not found
symfony/polyfill-iconv not found
symfony/polyfill-mbstring not found
symfony/polyfill-php80 not found
symfony/polyfill-php81 not found
symfony/polyfill-php82 in (/usr/share/glpiteste/vendor/symfony/polyfill-php82)
league/oauth2-client in (/usr/share/glpiteste/vendor/league/oauth2-client/src/Provider)
league/oauth2-google in (/usr/share/glpiteste/vendor/league/oauth2-google/src/Provider)
thenetworg/oauth2-azure in (/usr/share/glpiteste/vendor/thenetworg/oauth2-azure/src/Provider)

LDAP directories
 
Server: '127.0.0.1', Port: '389', BaseDN: none, Connection filter:
        '(&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))', RootDN: none, Use TLS:
        none

SQL replicas
 
Not active

Notifications
 
Way of sending emails: SMTP+TLS (teste@servicetic.com.br@mail.servicetic.com.br)

Plugins list
 
    actualtime           Name: ActualTime                     Version: 2.1.0      State: Error / to clean                        
        Install Method: Manual
    news                 Name: Alertas                        Version: 1.12.2     State: To update                               
        Install Method: Manual
    fields               Name: Campos adicionais              Version: 1.20.6     State: Error / to clean                        
        Install Method: Manual
    screenshot           Name: Captura de tela                Version: 2.0.3      State: Not installed                           
        Install Method: Manual
    behaviors            Name: Comportamentos                 Version: 2.7.3      State: To update                               
        Install Method: Manual
    costs                Name: Costs                          Version: 3.0.1      State: Error / to clean                        
        Install Method: Manual
    customlogin          Name: Custom Login                   Version: 1.0.6      State: Installed / not activated               
        Install Method: Manual
    formcreator          Name: Form Creator                   Version: 2.13.9     State: To update                               
        Install Method: Manual
    tag                  Name: Gerenciamento de Etiquetas     Version: 2.11.2     State: Error / to clean                        
        Install Method: Manual
    genericobject        Name: Gerenciamento de objetos       Version: 2.14.3     State: Error / to clean                        
        Install Method: Manual
    glpiinventory        Name: GLPI Inventory                 Version: 1.3.5      State: Installed / not activated               
        Install Method: Manual
    holiday              Name: Holidays                       Version: 1.2        State: Not installed                           
        Install Method: Manual
    datainjection        Name: Importação de dados            Version: 2.13.1     State: Error / to clean                        
        Install Method: Manual
    pdf                  Name: Imprimir em PDF                Version: 3.0.0      State: Enabled                                 
        Install Method: Manual
    releases             Name: Liberações                     Version: 2.0.3      State: Enabled                                 
        Install Method: Manual
    timelineticket       Name: Linha do tempo dos chamados    Version: 10.0+1.2   State: Installed / not activated               
        Install Method: Manual
    mailanalyzer         Name: Mail Analyzer                  Version: 3.2.0      State: To update                               
        Install Method: Manual
    moreticket           Name: Mais Chamados                  Version: 1.7.1      State: Error / to clean                        
        Install Method: Manual
    satisfaction         Name: Mais satisfação                Version: 1.6.1      State: Error / to clean                        
        Install Method: Manual
    metabase             Name: Metabase                       Version: 1.3.3      State: Not installed                           
        Install Method: Manual
    mydashboard          Name: Meu Painel                     Version: 2.1.5      State: Error / to clean                        
        Install Method: Manual
    oauthimap            Name: Oauth IMAP                     Version: 1.4.3      State: Not installed                           
        Install Method: Manual
    dashboard            Name: Painel                         Version: 1.0.3      State: Not installed                           
        Install Method: Manual
    phpsaml              Name: PHP SAML                       Version: 1.3.0      State: Error / to clean                        
        Install Method: Manual
    example              Name: Plugin Example                 Version: 0.0.1      State: Error / to clean                        
        Install Method: Manual
    singlesignon         Name: Single Sign-on                 Version: 1.3.3      State: Enabled                                 
        Install Method: Manual
    stsync               Name: ST-Sync                        Version: 1.0.0      State: Error / to clean                        
        Install Method: Manual
    tasklists            Name: Tasks list                     Version: 2.0.3      State: Installed / not activated               
        Install Method: Manual
    ticketcleaner        Name: Ticket Cleaner                 Version: 4.0.3      State: Error / to clean                        
        Install Method: Manual

Anything else?

No response

cconard96 commented 3 months ago

I cannot recreate the issue consistently, but there is definitely an issue with browser notification management. Possibly a race condition where the client-side script that checks for notifications gets a notification and displays it and the user navigates away from the page before the second request to GLPI to delete the notification is made.

cconard96 commented 2 months ago

Also, forcing a browser notification to send won't do anything. There is a client-side script that asks GLPI for the user's notifications to display rather than this being a push notification system, so GLPI can't send the notifications on demand like that.

Berlinst commented 2 months ago

Also, forcing a browser notification to send won't do anything. There is a client-side script that asks GLPI for the user's notifications to display rather than this being a push notification system, so GLPI can't send the notifications on demand like that.

Ok, I understand. However, do you agree that it’s not ideal for the GLPI notification queue to keep filling up? Is there any solution to prevent this from happening? Would this script be able to clear the notification queue? If so, where is this script located, and can it be adjusted to address the issue?