OPNSense/core 9f90b66src/opnsense/mvc/app/models/OPNsense/Firewall DNat.xml DNat.php, src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes DNatSequenceField.php NetworkMappedField.php

Firewall: NAT: Port Forward - refactor to MVC (work in progress) for https://github.com/opnsense/core/issues/8401

Add a model wrapper around nat/rule and align filter code to generate the same output when using the model.
To test this part, make a copy of /tmp/rules.debug, run migrations (/usr/local/opnsense/mvc/script/run_migrations.php) and execute rule generation via /usr/local/etc/rc.filter_configure

A diff between the newly generated rules.debug and the backup created earlier should show no differences.

The following notes apply:

o ipprotocol and protocol have no defaults set as old frontend code didn't enforce this, we should likely set defaults (inet, any) knowing this will show a small diff in the output
o registerForwardRule() replaces the array_merge with an !empty() compare per field as our defaults are empty instead of missing
o legacyMoveAddressFields() in Rule.php assumes any when network and address are not set, which should comply with frontend logic as "any" is set in these cases anyway
o source/destinations are converted inline, using a volatile field to trigger the initial load (as only one is used, we prefer network)
DeltaFile
+112-0src/opnsense/mvc/app/models/OPNsense/Firewall/DNat.xml
+69-0src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/DNatSequenceField.php
+59-0src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/NetworkMappedField.php
+50-0src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/CategoryField.php
+50-0src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/PortMappedField.php
+41-0src/opnsense/mvc/app/models/OPNsense/Firewall/DNat.php
+381-04 files not shown
+398-1910 files

OPNSense/core 75e6764src/opnsense/mvc/app/library/OPNsense/Firewall Plugin.php, src/opnsense/mvc/app/models/OPNsense/Routing Gateways.php

System: Gateways: Group - a bit of an experiment for https://github.com/opnsense/core/issues/9442

Since 2023 we have refactored the gateways to MVC, which made ipprotocol part of the output, this eases validation a bit.
The route-to statement can either contain multiple `(if gwip)` entries or multiple `if` entries, but not combined.
This change keeps track of which entries are being added to the route-to statement and ignores the ones that can't be combined.

Let's put this to a test on master for a while.

In the long run the gateway group page should validate these situations to decrease the chance of gateways being silently ignored, but not before a migration to MVC.
DeltaFile
+17-11src/opnsense/mvc/app/library/OPNsense/Firewall/Plugin.php
+4-3src/opnsense/mvc/app/models/OPNsense/Routing/Gateways.php
+21-142 files

OPNSense/core 740de6dsrc/opnsense/mvc/app/models/OPNsense/Firewall DNat.xml DNat.php, src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes DNatSequenceField.php NetworkMappedField.php

Firewall: NAT: Port Forward - refactor to MVC (work in progress) for https://github.com/opnsense/core/issues/8401

Add a model wrapper around nat/rule and align filter code to generate the same output when using the model.
To test this part, make a copy of /tmp/rules.debug, run migrations (/usr/local/opnsense/mvc/script/run_migrations.php) and execute rule generation via /usr/local/etc/rc.filter_configure

A diff between the newly generated rules.debug and the backup created earlier should show no differences.

The following notes apply:

o ipprotocol and protocol have no defaults set as old frontend code didn't enforce this, we should likely set defaults (inet, any) knowing this will show a small diff in the output
o registerForwardRule() replaces the array_merge with an !empty() compare per field as our defaults are empty instead of missing
o legacyMoveAddressFields() in Rule.php assumes any when network and address are not set, which should comply with frontend logic as "any" is set in these cases anyway
o source/destinations are converted inline, using a volatile field to trigger the initial load (as only one is used, we prefer network)
DeltaFile
+112-0src/opnsense/mvc/app/models/OPNsense/Firewall/DNat.xml
+69-0src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/DNatSequenceField.php
+59-0src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/NetworkMappedField.php
+50-0src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/CategoryField.php
+50-0src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/PortMappedField.php
+41-0src/opnsense/mvc/app/models/OPNsense/Firewall/DNat.php
+381-04 files not shown
+398-1910 files

OPNSense/core 41f9b32src/opnsense/mvc/app/library/OPNsense/System/Status UnboundBlocklistStatus.php, src/opnsense/scripts/unbound-dnsbl/lib dnsbl.py

unbound: notify user if a blocklist reset is required

This isn't perfect, as it can potentially take a while
for unbound to notice the change, keeping the notification
around longer than necessary. Additionally, this should be
a banner as well, but the banner isn't clickable in the current
state and the banner scope should ideally be separated from the
notification scope. To be continued.
DeltaFile
+53-0src/opnsense/mvc/app/library/OPNsense/System/Status/UnboundBlocklistStatus.php
+5-0src/opnsense/scripts/unbound-dnsbl/lib/dnsbl.py
+58-02 files

OPNSense/core d40bfc8src/opnsense/mvc/tests/app/models/OPNsense/Kea KeaDhcpv6Test.php, src/opnsense/mvc/tests/app/models/OPNsense/Kea/Snapshots KeaDhcpv6Test.json config.xml

Add KeaDhcpv6Test
DeltaFile
+146-0src/opnsense/mvc/tests/app/models/OPNsense/Kea/Snapshots/KeaDhcpv6Test.json
+98-2src/opnsense/mvc/tests/app/models/OPNsense/Kea/Snapshots/config.xml
+30-0src/opnsense/mvc/tests/app/models/OPNsense/Kea/KeaDhcpv6Test.php
+2-2src/opnsense/mvc/tests/app/models/OPNsense/Kea/Snapshots/KeaDhcpv4Test.json
+276-44 files

OPNSense/core f330182src/opnsense/mvc/tests/app/models/OPNsense/Kea KeaCtrlAgentTest.php, src/opnsense/mvc/tests/app/models/OPNsense/Kea/Snapshots KeaCtrlAgentTest.json

Add KeaCtrlAgentTest to check if this unit test is easily expandable with the same config.xml
DeltaFile
+32-0src/opnsense/mvc/tests/app/models/OPNsense/Kea/Snapshots/KeaCtrlAgentTest.json
+30-0src/opnsense/mvc/tests/app/models/OPNsense/Kea/KeaCtrlAgentTest.php
+62-02 files

OPNSense/core ee0fb3asrc/opnsense/mvc/tests/app/models/OPNsense/Kea KeaDhcpv4Test.php, src/opnsense/mvc/tests/app/models/OPNsense/Kea/Base JsonSampleTestCase.php

Refactor so every test can use the same config.xml
DeltaFile
+219-0src/opnsense/mvc/tests/app/models/OPNsense/Kea/Snapshots/KeaDhcpv4Test.json
+0-219src/opnsense/mvc/tests/app/models/OPNsense/Kea/KeaDhcpv4Test/expected.json
+151-0src/opnsense/mvc/tests/app/models/OPNsense/Kea/Snapshots/config.xml
+0-151src/opnsense/mvc/tests/app/models/OPNsense/Kea/KeaDhcpv4Test/config.xml
+28-41src/opnsense/mvc/tests/app/models/OPNsense/Kea/Base/JsonSampleTestCase.php
+2-2src/opnsense/mvc/tests/app/models/OPNsense/Kea/KeaDhcpv4Test.php
+400-4136 files

OPNSense/core 8c21a6csrc/opnsense/mvc/tests/app/models/OPNsense/Kea/Base JsonSampleTestCase.php

Change tmp directory
DeltaFile
+1-1src/opnsense/mvc/tests/app/models/OPNsense/Kea/Base/JsonSampleTestCase.php
+1-11 files

OPNSense/core 23ea1e1src/opnsense/mvc/tests/app/models/OPNsense/Kea KeaDhcpv4Test.php, src/opnsense/mvc/tests/app/models/OPNsense/Kea/Base JsonSampleTestCase.php

Refine test approach a bit by using a shared JsonSampleTestCase helper base
DeltaFile
+219-0src/opnsense/mvc/tests/app/models/OPNsense/Kea/KeaDhcpv4Test/expected.json
+0-219src/opnsense/mvc/tests/app/models/OPNsense/Kea/KeaDhcpv4Test/enabled/expected.json
+151-0src/opnsense/mvc/tests/app/models/OPNsense/Kea/KeaDhcpv4Test/config.xml
+0-151src/opnsense/mvc/tests/app/models/OPNsense/Kea/KeaDhcpv4Test/enabled/config.xml
+94-0src/opnsense/mvc/tests/app/models/OPNsense/Kea/Base/JsonSampleTestCase.php
+13-69src/opnsense/mvc/tests/app/models/OPNsense/Kea/KeaDhcpv4Test.php
+477-4396 files

OPNSense/core 7249312src/opnsense/mvc/tests/app/models/OPNsense/Kea KeaDhcpv4Test.php

Improve error throw by telling exact spots that failed in the generated json file
DeltaFile
+59-6src/opnsense/mvc/tests/app/models/OPNsense/Kea/KeaDhcpv4Test.php
+59-61 files

OPNSense/core 697c1d3src/opnsense/mvc/tests/app/models/OPNsense/Kea KeaDhcpv4Test.php, src/opnsense/mvc/tests/app/models/OPNsense/Kea/KeaDhcpv4Test/enabled expected.json config.xml

dhcp/kea: Add golden sample unit test for DHCPv4 when all features are enabled
DeltaFile
+219-0src/opnsense/mvc/tests/app/models/OPNsense/Kea/KeaDhcpv4Test/enabled/expected.json
+151-0src/opnsense/mvc/tests/app/models/OPNsense/Kea/KeaDhcpv4Test/enabled/config.xml
+33-0src/opnsense/mvc/tests/app/models/OPNsense/Kea/KeaDhcpv4Test.php
+403-03 files

OPNSense/core 274c965src/opnsense/mvc/app/views/OPNsense/IPsec sessions.volt

VPN: IPsec: Sessions: Fix missing commands translation (#9453)

DeltaFile
+1-1src/opnsense/mvc/app/views/OPNsense/IPsec/sessions.volt
+1-11 files

OPNSense/core 64423a4src/opnsense/mvc/app/views/OPNsense/IPsec sessions.volt

VPN: IPsec: Sessions: Fix missing commands translation
DeltaFile
+1-1src/opnsense/mvc/app/views/OPNsense/IPsec/sessions.volt
+1-11 files

OPNSense/core 9933ccbsrc/opnsense/mvc/app/models/OPNsense/Firewall DNat.php DNat.xml

Firewall: NAT: Port Forward - refactor to MVC (work in progress) for https://github.com/opnsense/core/issues/8401
DeltaFile
+41-0src/opnsense/mvc/app/models/OPNsense/Firewall/DNat.php
+29-0src/opnsense/mvc/app/models/OPNsense/Firewall/DNat.xml
+70-02 files

OPNSense/ports f98c778security/vuxml/vuln 2025.xml

security/vuxml: sync with upstream

Taken from: FreeBSD
DeltaFile
+28-0security/vuxml/vuln/2025.xml
+28-01 files

OPNSense/ports 73e367csecurity/netbird Makefile

security/netbird: sync with upstream

Taken from: FreeBSD
DeltaFile
+1-1security/netbird/Makefile
+1-11 files

OPNSense/ports 4300781security/gnutls pkg-plist distinfo

security/gnutls: sync with upstream

Taken from: FreeBSD
DeltaFile
+8-1security/gnutls/pkg-plist
+3-3security/gnutls/distinfo
+1-1security/gnutls/Makefile
+12-53 files

OPNSense/ports 8124dbfnet/ntp Makefile, net/ntp/files patch-ntpd_ntp__io.c

net/ntp: sync with upstream

Taken from: FreeBSD
DeltaFile
+15-1net/ntp/files/patch-ntpd_ntp__io.c
+1-1net/ntp/Makefile
+16-22 files

OPNSense/ports 3f5d71acad/freecad-devel pkg-plist, math/lean4 pkg-plist

*/*: sync with upstream

Taken from: FreeBSD
DeltaFile
+13,650-4,891www/librewolf/files/patch-libwebrtc-generated
+6,379-0misc/gemini-cli/files/package-lock.json
+3,537-0cad/freecad-devel/pkg-plist
+2,520-48misc/gemini-cli/pkg-plist
+2,368-40misc/nanocoder/pkg-plist
+1,525-288math/lean4/pkg-plist
+29,979-5,267918 files not shown
+39,783-13,692924 files

OPNSense/ports c85a177opnsense/update distinfo Makefile

opnsense/update: new bootstrap additions plus base and kernel
DeltaFile
+3-3opnsense/update/distinfo
+2-3opnsense/update/Makefile
+5-62 files

OPNSense/plugins 094a8fcsecurity/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms dialogValidation.xml, security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation DnsHetznercloud.php

Merge pull request #5020 from flortsch/feature/hetzner-cloud-dns

security/acme-client: add support for Hetzner Cloud DNS API
DeltaFile
+44-0security/acme-client/src/opnsense/mvc/app/library/OPNsense/AcmeClient/LeValidation/DnsHetznercloud.php
+10-0security/acme-client/src/opnsense/mvc/app/controllers/OPNsense/AcmeClient/forms/dialogValidation.xml
+4-0security/acme-client/src/opnsense/mvc/app/models/OPNsense/AcmeClient/AcmeClient.xml
+58-03 files

OPNSense/core b0ee41bsrc/etc/inc filter.inc

firewall: run filterlog directly after rules apply for #9449

(cherry picked from commit c6eaefc1e26550085b09abf1cca73fdc8f76db13)
DeltaFile
+10-10src/etc/inc/filter.inc
+10-101 files

OPNSense/core c6eaefcsrc/etc/inc filter.inc

firewall: run filterlog directly after rules apply for #9449
DeltaFile
+10-10src/etc/inc/filter.inc
+10-101 files

OPNSense/core 843970dsrc/opnsense/mvc/app/models/OPNsense/Kea KeaDhcpv6.php

dhcp/kea: Refactor KeaDhcpv6.php to use BaseField helper methods
DeltaFile
+25-26src/opnsense/mvc/app/models/OPNsense/Kea/KeaDhcpv6.php
+25-261 files

OPNSense/core 29ee25dsrc/opnsense/mvc/app/models/OPNsense/Kea KeaDhcpv4.php

dhcp/kea: Refactor KeaDhcpv4.php to use BaseField helper methods
DeltaFile
+25-25src/opnsense/mvc/app/models/OPNsense/Kea/KeaDhcpv4.php
+25-251 files

OPNSense/plugins 61931aesecurity/q-feeds-connector pkg-descr Makefile, security/q-feeds-connector/src/opnsense/mvc/app/controllers/OPNsense/QFeeds/Api SettingsController.php

security/q-feeds-connector: sync with master
DeltaFile
+40-3security/q-feeds-connector/src/opnsense/mvc/app/views/OPNsense/QFeeds/index.volt
+15-1security/q-feeds-connector/src/opnsense/www/js/widgets/QFeeds.js
+7-2security/q-feeds-connector/src/opnsense/scripts/qfeeds/lib/log.py
+9-0security/q-feeds-connector/src/opnsense/mvc/app/controllers/OPNsense/QFeeds/Api/SettingsController.php
+6-0security/q-feeds-connector/pkg-descr
+1-1security/q-feeds-connector/Makefile
+78-76 files

OPNSense/core f070f17src/opnsense/mvc/app/models/OPNsense/OpenVPN OpenVPN.php

opevpn: style sweep

(cherry picked from commit bb6f59542e61a7c246d2b44dd08f8d6d4aee9322)
DeltaFile
+2-1src/opnsense/mvc/app/models/OPNsense/OpenVPN/OpenVPN.php
+2-11 files

OPNSense/plugins 73bc813. Makefile

make: expand on plain target or target with argument

(cherry picked from commit a696ef090fae8654cbfc5f28a27009857b30edee)
DeltaFile
+10-7Makefile
+10-71 files

OPNSense/plugins 020847abenchmarks/iperf/src/opnsense/mvc/app/models/OPNsense/iperf FakeInstance.xml, databases/redis/src/opnsense/mvc/app/models/OPNsense/Redis Redis.xml

[bd]*: minimal style sweep (whitespace only)

(cherry picked from commit b8b276326b90f5a4442fc082c46fab290b05ace3)
DeltaFile
+105-105databases/redis/src/opnsense/mvc/app/models/OPNsense/Redis/Redis.xml
+9-9benchmarks/iperf/src/opnsense/mvc/app/models/OPNsense/iperf/FakeInstance.xml
+1-1dns/bind/src/opnsense/mvc/app/models/OPNsense/Bind/Acl.xml
+115-1153 files

OPNSense/plugins b8b2763benchmarks/iperf/src/opnsense/mvc/app/models/OPNsense/iperf FakeInstance.xml, databases/redis/src/opnsense/mvc/app/models/OPNsense/Redis Redis.xml

[bd]*: minimal style sweep (whitespace only)
DeltaFile
+105-105databases/redis/src/opnsense/mvc/app/models/OPNsense/Redis/Redis.xml
+9-9benchmarks/iperf/src/opnsense/mvc/app/models/OPNsense/iperf/FakeInstance.xml
+1-1dns/bind/src/opnsense/mvc/app/models/OPNsense/Bind/Acl.xml
+115-1153 files