ISSUE TYPE
Bug Report
OS
Ubuntu 24.04
VERSION
define( 'APPLICATION_VERSION', '7.2.0' );
define( 'APPLICATION_VERDATE', '2026051200' );
ENVIRONMENT
php -v
PHP 8.4.20 (cli) (built: Apr 11 2026 07:43:26) (NTS)
Copyright (c) The PHP Group
Built by Debian
Zend Engine v4.4.20, Copyright (c) Zend Technologies
with Zend OPcache v8.4.20, Copyright (c), by Zend Technologies
dpkg -l | grep php
ii libapache2-mod-php8.4 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 amd64 server-side, HTML-embedded scripting language (Apache 2 module)
ii php-common 2:101~+ubuntu24.04.1+deb.sury.org+1 all Common files for PHP packages
ii php8.4 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 all server-side, HTML-embedded scripting language (metapackage)
ii php8.4-bcmath 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 amd64 Bcmath module for PHP
ii php8.4-cgi 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 amd64 server-side, HTML-embedded scripting language (CGI binary)
ii php8.4-cli 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 amd64 command-line interpreter for the PHP scripting language
ii php8.4-common 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 amd64 documentation, examples and common module for PHP
ii php8.4-curl 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 amd64 CURL module for PHP
ii php8.4-ds 1.6.0-2+ubuntu24.04.1+deb.sury.org+1 amd64 PHP extension providing efficient data structures for PHP 7
ii php8.4-gd 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 amd64 GD module for PHP
ii php8.4-igbinary 3.2.16-6+ubuntu24.04.1+deb.sury.org+1 amd64 igbinary PHP serializer
ii php8.4-intl 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 amd64 Internationalisation module for PHP
ii php8.4-mbstring 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 amd64 MBSTRING module for PHP
ii php8.4-memcache 8.2-5+ubuntu24.04.1+deb.sury.org+1 amd64 memcache extension module for PHP
ii php8.4-memcached 3.4.0-1+ubuntu24.04.1+deb.sury.org+1 amd64 memcached extension module for PHP, uses libmemcached
ii php8.4-msgpack 1:3.0.0-2+ubuntu24.04.1+deb.sury.org+1 amd64 PHP extension for interfacing with MessagePack
ii php8.4-mysql 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 amd64 MySQL module for PHP
ii php8.4-opcache 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 amd64 Zend OpCache module for PHP
ii php8.4-readline 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 amd64 readline module for PHP
ii php8.4-rrd 2.0.3++-4+ubuntu24.04.1+deb.sury.org+1 amd64 PHP bindings to rrd tool system
ii php8.4-snmp 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 amd64 SNMP module for PHP
ii php8.4-xml 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 amd64 DOM, SimpleXML, XML, and XSL module for PHP
ii php8.4-yaml 2.3.0-2+ubuntu24.04.1+deb.sury.org+1 amd64 YAML-1.1 parser and emitter for PHP
ii php8.4-zip 8.4.20-1+ubuntu24.04.1+deb.sury.org+1 amd64 Zip module for PHP
SUMMARY
A customer reported that upon login ixp manager, ixp manager shows errors.
The "Your Top Peers" table breaks while generating the links to the p2p statistics pages.
We think that the code
[ 'srcVli' => $t->c->virtualInterfaces[0]->vlanInterfaces[0]->id, 'dstVli' => $p2p->peer->virtualInterfaces[0]->vlanInterfaces[0]->id ]
is to blame as virtualInterfaces[0] is not guaranteed to be an interface used for peering.
We have a customer with a reseller uplink port and peering, where the reseller uplink port was created prior to the creation of the peering interface (reseller uplink port virtualinterface has a lower database ID than the virtual interface that has peering).
To temporarily fix the issue we have altered the code as follows:
[ 'srcVli' => $t->c->virtualInterfaces[ $t->c->abbreviatedName == '<affected_customer>' ? 1 : 0]->vlanInterfaces[0]->id, 'dstVli' => $p2p->peer->virtualInterfaces[ ($t->ee( $p2p->peer->abbreviatedName ) == '<affected_customer>') ? 1 : 0 ]->vlanInterfaces[0]->id ]
which will use virtualInterface at index 1 when rendering the link containing the affected customer.
STEPS TO REPRODUCE
create a customer, create the reseller uplink port first, then create a peering port.
EXPECTED RESULTS
A "Your Top Peers" table without errors.
ACTUAL RESULTS
A broken "Your Top Peers" table.
IMPORTANCE
We are affected in production. We have identified at least one customer that is affected from the "Your Top Peers" getting rendered with issues when they are on said table for other customers.
RELEVANT LOGS
laravel.log
[2026-05-27 21:06:18] production.ERROR: Undefined array key 0 {"userId":542,"exception":"[object] (ErrorException(code: 0): Undefined array key 0 at /srv/ixpmanager
/vendor/laravel/framework/src/Illuminate/Collections/Collection.php:1971)
[stacktrace]
#0 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(258): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->hand
leError()
#1 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Collections/Collection.php(1971): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->{closure:Illuminat
e\\Foundation\\Bootstrap\\HandleExceptions::forwardsTo():257}()
#2 /srv/ixpmanager/resources/views/dashboard/dashboard-tabs/overview.foil.php(109): Illuminate\\Support\\Collection->offsetGet()
#3 /srv/ixpmanager/vendor/opensolutions/foil/src/Template/Template.php(287): require('...')
#4 /srv/ixpmanager/vendor/opensolutions/foil/src/Template/Template.php(231): Foil\\Template\\Template->collect()
#5 /srv/ixpmanager/vendor/opensolutions/foil/src/Engine.php(307): Foil\\Template\\Template->render()
#6 /srv/ixpmanager/vendor/opensolutions/foil/src/Engine.php(211): Foil\\Engine->doRender()
#7 /srv/ixpmanager/vendor/opensolutions/foil/src/Template/Template.php(188): Foil\\Engine->render()
#8 /srv/ixpmanager/resources/views/dashboard/index.foil.php(123): Foil\\Template\\Template->insert()
#9 /srv/ixpmanager/vendor/opensolutions/foil/src/Template/Template.php(287): require('...')
#10 /srv/ixpmanager/vendor/opensolutions/foil/src/Template/Template.php(231): Foil\\Template\\Template->collect()
#11 /srv/ixpmanager/vendor/opensolutions/foil/src/Engine.php(307): Foil\\Template\\Template->render()
#12 /srv/ixpmanager/vendor/opensolutions/foil/src/Engine.php(231): Foil\\Engine->doRender()
#13 /srv/ixpmanager/vendor/opensolutions/foil/src/Engine.php(204): Foil\\Engine->renderTemplate()
#14 /srv/ixpmanager/app/Services/FoilEngine.php(54): Foil\\Engine->render()
#15 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/View/View.php(208): IXP\\Services\\FoilEngine->get()
#16 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/View/View.php(191): Illuminate\\View\\View->getContents()
#17 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/View/View.php(160): Illuminate\\View\\View->renderContents()
#18 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Http/Response.php(78): Illuminate\\View\\View->render()
#19 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Http/Response.php(34): Illuminate\\Http\\Response->setContent()
#20 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Router.php(939): Illuminate\\Http\\Response->__construct()
#21 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Router.php(906): Illuminate\\Routing\\Router::toResponse()
#22 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Router.php(821): Illuminate\\Routing\\Router->prepareResponse()
#23 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Routing\\Router->{closure:Illuminate\\Routing\\Router::runRouteWithinStack():821}()
#24 /srv/ixpmanager/app/Http/Middleware/Google2FA.php(81): Illuminate\\Pipeline\\Pipeline->{closure:Illuminate\\Pipeline\\Pipeline::prepareDestination():178}()
#25 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): IXP\\Http\\Middleware\\Google2FA->handle()
#26 /srv/ixpmanager/app/Http/Middleware/ControllerEnabled.php(103): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#27 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): IXP\\Http\\Middleware\\ControllerEnabled->handle()
#28 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#29 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()
#30 /srv/ixpmanager/app/Http/Middleware/Authenticate.php(106): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#31 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): IXP\\Http\\Middleware\\Authenticate->handle()
#32 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(87): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#33 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle()
#34 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(48): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#35 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle()
#36 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(120): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#37 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(63): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest()
#38 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Session\\Middleware\\StartSession->handle()
#39 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(36): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#40 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle()
#41 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(74): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#42 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle()
#43 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#44 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Router.php(821): Illuminate\\Pipeline\\Pipeline->then()
#45 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Router.php(800): Illuminate\\Routing\\Router->runRouteWithinStack()
#46 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Router.php(764): Illuminate\\Routing\\Router->runRoute()
#47 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Routing/Router.php(753): Illuminate\\Routing\\Router->dispatchToRoute()
#48 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch()
#49 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Kernel->{closure:Illuminate\\Foundation\\Http\\Kernel::dispatchToRouter():197}()
#50 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->{closure:Illuminate\\Pipeline\\Pipeline::prepareDestination():178}()
#51 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#52 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()
#53 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#54 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(51): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#55 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()
#56 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#57 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Http\\Middleware\\ValidatePostSize->handle()
#58 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(109): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#59 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()
#60 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(61): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#61 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Http\\Middleware\\HandleCors->handle()
#62 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(58): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#63 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(219): Illuminate\\Http\\Middleware\\TrustProxies->handle()
#64 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(137): Illuminate\\Pipeline\\Pipeline->{closure:{closure:Illuminate\\Pipeline\\Pipeline::carry():194}:195}()
#65 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then()
#66 /srv/ixpmanager/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()
#67 /srv/ixpmanager/public/index.php(88): Illuminate\\Foundation\\Http\\Kernel->handle()
#68 {main}
"}
ISSUE TYPE
Bug Report
OS
Ubuntu 24.04
VERSION
ENVIRONMENT
SUMMARY
A customer reported that upon login ixp manager, ixp manager shows errors.
The "Your Top Peers" table breaks while generating the links to the p2p statistics pages.
We think that the code
[ 'srcVli' => $t->c->virtualInterfaces[0]->vlanInterfaces[0]->id, 'dstVli' => $p2p->peer->virtualInterfaces[0]->vlanInterfaces[0]->id ]is to blame as virtualInterfaces[0] is not guaranteed to be an interface used for peering.
We have a customer with a reseller uplink port and peering, where the reseller uplink port was created prior to the creation of the peering interface (reseller uplink port virtualinterface has a lower database ID than the virtual interface that has peering).
To temporarily fix the issue we have altered the code as follows:
[ 'srcVli' => $t->c->virtualInterfaces[ $t->c->abbreviatedName == '<affected_customer>' ? 1 : 0]->vlanInterfaces[0]->id, 'dstVli' => $p2p->peer->virtualInterfaces[ ($t->ee( $p2p->peer->abbreviatedName ) == '<affected_customer>') ? 1 : 0 ]->vlanInterfaces[0]->id ]which will use virtualInterface at index 1 when rendering the link containing the affected customer.
STEPS TO REPRODUCE
create a customer, create the reseller uplink port first, then create a peering port.
EXPECTED RESULTS
A "Your Top Peers" table without errors.
ACTUAL RESULTS
A broken "Your Top Peers" table.
IMPORTANCE
We are affected in production. We have identified at least one customer that is affected from the "Your Top Peers" getting rendered with issues when they are on said table for other customers.
RELEVANT LOGS