From d2a47d4703ce5c6e11fb94828489076ca2c1403a Mon Sep 17 00:00:00 2001 From: Q-Feeds Date: Sat, 22 Nov 2025 16:00:28 +0100 Subject: [PATCH] security/q-feeds-connector - Add license expiry date + name to widget (#5040) --- .../OPNsense/QFeeds/Api/SettingsController.php | 7 +++++++ .../src/opnsense/www/js/widgets/QFeeds.js | 16 +++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/security/q-feeds-connector/src/opnsense/mvc/app/controllers/OPNsense/QFeeds/Api/SettingsController.php b/security/q-feeds-connector/src/opnsense/mvc/app/controllers/OPNsense/QFeeds/Api/SettingsController.php index b65b7b1a6..2a1b9ab52 100644 --- a/security/q-feeds-connector/src/opnsense/mvc/app/controllers/OPNsense/QFeeds/Api/SettingsController.php +++ b/security/q-feeds-connector/src/opnsense/mvc/app/controllers/OPNsense/QFeeds/Api/SettingsController.php @@ -110,6 +110,13 @@ class SettingsController extends ApiMutableModelControllerBase } } } + // Add license information from company_info if available + if (!empty($info['company_info'])) { + $stats['license'] = [ + 'name' => $info['company_info']['license_name'] ?? null, + 'expiry_date' => $info['company_info']['license_expiry_date'] ?? null + ]; + } } return $stats; } diff --git a/security/q-feeds-connector/src/opnsense/www/js/widgets/QFeeds.js b/security/q-feeds-connector/src/opnsense/www/js/widgets/QFeeds.js index bf5acbcb1..aa13fb5e8 100644 --- a/security/q-feeds-connector/src/opnsense/www/js/widgets/QFeeds.js +++ b/security/q-feeds-connector/src/opnsense/www/js/widgets/QFeeds.js @@ -71,6 +71,8 @@ export default class QFeeds extends BaseTableWidget { } let rows = []; let feeds = []; + let licenseInfoShown = false; + for (let feed of data.feeds) { feeds.push( ` ${feed.name}`, @@ -78,7 +80,19 @@ export default class QFeeds extends BaseTableWidget { `
  ${this.translations.next_update}: ${feed.next_update}
` ); if (feed.licensed) { - feeds.push(`
  ${this.translations.licensed}
`); + let licenseText = this.translations.licensed; + if (data.license && data.license.name) { + licenseText += ` (${data.license.name})`; + } + feeds.push(`
  ${licenseText}
`); + if (!licenseInfoShown && data.license && data.license.expiry_date) { + const expiryDate = new Date(data.license.expiry_date); + if (!isNaN(expiryDate.getTime())) { + const formattedDate = expiryDate.toLocaleDateString(); + feeds.push(`
  Expires: ${formattedDate}
`); + } + licenseInfoShown = true; + } } else { feeds.push(`
  ${this.translations.unlicensed}
`); }