OPNSense/core 3086a70src/etc/inc filter.lib.inc filter.inc, src/etc/inc/plugins.inc.d pf.inc openvpn.inc

firewall: pluginify filter_core_get_default_nat_outbound_networks()

With this we can collect all networks eligible for outbound/source
NAT.  The issue, however, is two-fold:

1. On the one hand we need all the internal networks to NAT.
2. On the other hand we need all the external interfaces to NAT over.

The first part is relatively easy, but the second part overloads
the function output.  It would probably be nicer to return a rule
structure, but that would imply moving the rules generation around
a bit, likely inside $fw and then we still have to offer it to
MVC and fix the legacy page to use the same data feed.
DeltaFile
+0-31src/etc/inc/filter.lib.inc
+24-0src/etc/inc/plugins.inc.d/pf.inc
+24-0src/etc/inc/plugins.inc.d/openvpn.inc
+21-0src/etc/inc/plugins.inc.d/ipsec.inc
+2-10src/etc/inc/filter.inc
+2-5src/www/firewall_nat_out.php
+73-466 files

OPNSense/core 8bd56bbsrc/opnsense/mvc/app/controllers/OPNsense/Routing/forms dialogEditGateway.xml

System: Gateways: add formatter to Disable HA sync and hide it from the grid by default
DeltaFile
+5-0src/opnsense/mvc/app/controllers/OPNsense/Routing/forms/dialogEditGateway.xml
+5-01 files

OPNSense/core 17b6f5csrc/opnsense/mvc/app/models/OPNsense/Interfaces/FieldTypes VlanInterfaceField.php

interfaces: permit a vlan device as bridge member
DeltaFile
+0-1src/opnsense/mvc/app/models/OPNsense/Interfaces/FieldTypes/VlanInterfaceField.php
+0-11 files

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

kea: bump copyright in IPv6 file too
DeltaFile
+1-1src/opnsense/mvc/app/models/OPNsense/Kea/KeaDhcpv6.php
+1-11 files

OPNSense/core ffaf0casrc/etc/inc/plugins.inc.d captiveportal.inc

firewall: captive portal block rule should be evaluated after the anti-lockout rule

(cherry picked from commit 6b5a3a28f40af72a914a3277264ceded6879e7c7)
DeltaFile
+1-1src/etc/inc/plugins.inc.d/captiveportal.inc
+1-11 files

OPNSense/core 7b6b636src/opnsense/mvc/app/controllers/OPNsense/Base ControllerBase.php

MVC:ui - form labels could be empty, make sure to add them to avoid warnings in forms.

spotted at Services: Unbound DNS: Query Forwarding

(cherry picked from commit 06936c6af5bfcd8e1248e478dd496b9988156f2e)
DeltaFile
+2-0src/opnsense/mvc/app/controllers/OPNsense/Base/ControllerBase.php
+2-01 files

OPNSense/core c2f19f0src/etc/inc filter.inc

firewall: fix PHP warning when scrub yields no interfaces

While here decrease indent and safe config iteration and simplify.

(cherry picked from commit 206a646a9a32c2b68e1964de8c1ec9102810c30d)
DeltaFile
+69-67src/etc/inc/filter.inc
+69-671 files

OPNSense/core 7f02dadsrc/opnsense/mvc/app/controllers/OPNsense/Trust/Api CrlController.php

trust: use serialNumberHex for CRL so high-bit serials aren't dropped (#10559)

CrlController::setAction() built the CRL from
openssl_x509_parse()['serialNumber'], a signed decimal that is unreliable
for serials with the high bit set (first byte >= 0x80). Those serials were
passed to phpseclib as an invalid/zero value and collapsed into a single
"Serial Number: 00" entry, so the affected certificates were effectively
not revoked (e.g. OpenVPN clients could still connect). With random 128-bit
serials this silently affects roughly half of all revocations.

Use the canonical unsigned serialNumberHex via a phpseclib BigInteger,
matching the index.txt export already present in the same controller.

(cherry picked from commit 6223abb249661b22b05087481205a164e666e4e1)
DeltaFile
+5-2src/opnsense/mvc/app/controllers/OPNsense/Trust/Api/CrlController.php
+5-21 files

OPNSense/core eaa6ccbsrc/etc rc.newwanip, src/etc/inc interfaces.inc

php8.5 - fix some warnings:

[16-Jul-2026 11:51:52 Europe/Amsterdam] PHP Warning:  Undefined array key "dhcphostname" in /usr/local/etc/inc/interfaces.inc on line 3330
[16-Jul-2026 11:51:52 Europe/Amsterdam] PHP Warning:  Undefined array key "dhcphostname" in /usr/local/etc/inc/interfaces.inc on line 3331
[16-Jul-2026 11:51:48 Europe/Amsterdam] PHP Deprecated:  Using null as an array offset is deprecated, use an empty string instead in /usr/local/opnsense/mvc/app/library/OPNsense/Firewall/ForwardRule.php on line 168
[16-Jul-2026 11:52:05 Europe/Amsterdam] PHP Deprecated:  Using null as an array offset is deprecated, use an empty string instead in /usr/local/etc/rc.newwanip on line 57
[16-Jul-2026 11:51:49 Europe/Amsterdam] PHP Deprecated:  Using null as an array offset is deprecated, use an empty string instead in /usr/local/etc/inc/interfaces.inc on line 2292

(cherry picked from commit 3dc1759c8fc06edf68700b23bf543c21c59d1e3d)
DeltaFile
+4-3src/etc/inc/interfaces.inc
+1-1src/etc/rc.newwanip
+1-0src/opnsense/mvc/app/library/OPNsense/Firewall/ForwardRule.php
+6-43 files

OPNSense/core 536dafbsrc/opnsense/mvc/app/views/OPNsense/Firewall filter_rule.volt

firewall: skip message banner if searchPhrase set

(cherry picked from commit 3a1912eafebb3756163f6fa1bdae272d187a3d94)
DeltaFile
+5-1src/opnsense/mvc/app/views/OPNsense/Firewall/filter_rule.volt
+5-11 files

OPNSense/core 91a727asrc/opnsense/mvc/app/views/layout_partials form_input_tr.volt

mvc: fix default labels in selectpickers

PR: https://github.com/opnsense/core/issues/10533
PR: https://github.com/opnsense/core/issues/10555

(cherry picked from commit 2b0575c57d66c2181e80c0edc6ade83e8f3edd9c)
(cherry picked from commit f1cbec3670c7df7232036c23c128712f8c707f19)
DeltaFile
+3-3src/opnsense/mvc/app/views/layout_partials/form_input_tr.volt
+3-31 files

OPNSense/core a9f2ba3src/opnsense/scripts/firmware connection.sh

firmware: split ping into min and max size ones for #10540

(cherry picked from commit 78a6f9db3f5a9c5343a18cbe0aa480a44c9e90ea)
(cherry picked from commit 35a3d79b8e879affe44530af5fb66ad2f369a5b9)
DeltaFile
+12-3src/opnsense/scripts/firmware/connection.sh
+12-31 files

OPNSense/core 35a3d79src/opnsense/scripts/firmware connection.sh

firmware: logic twist
DeltaFile
+2-2src/opnsense/scripts/firmware/connection.sh
+2-21 files

OPNSense/core 3ef4389src/opnsense/www/js/widgets Services.js

system: use btn styles in services widget #10553

This damps the colors a bit and auto-decides on the
text color to use.  Hover will still use the previous
color.  People will not like this either, but this is
entirely in the scope of the theme to make it look
nice.

(cherry picked from commit ace8f12f51e35e9bdb60b7039381dfd4158aaf73)
DeltaFile
+3-4src/opnsense/www/js/widgets/Services.js
+3-41 files

OPNSense/core 5003057. plist, src/opnsense/mvc/app/models/OPNsense/Trust General.xml Ca.xml

system: DTLSv1.1 is rejected by OpenSSL 3.5, migrate to DTLSv1.2

Which appears to break HTTPS too since the SSL context is not created at all.

PR: https://forum.opnsense.org/index.php?topic=52445.0

(cherry picked from commit 0b7d29bad4213a718f511ad8dcc3bad7c9f82085)
(cherry picked from commit ce022dd1e239db0a118fc83b0766c6b610377f4b)
(cherry picked from commit e7292dc24add8a4f5952b9683c598e9d1d77f121)
DeltaFile
+50-0src/opnsense/mvc/app/models/OPNsense/Trust/Migrations/M1_0_2.php
+2-2src/opnsense/mvc/app/models/OPNsense/Trust/General.xml
+1-1src/opnsense/mvc/app/models/OPNsense/Trust/Ca.xml
+1-1src/opnsense/mvc/app/models/OPNsense/Trust/Cert.xml
+1-0plist
+55-45 files

OPNSense/core e7292dc. plist, src/opnsense/mvc/app/models/OPNsense/Trust General.xml Ca.xml

system: migrate faulty DTLSv1.1 to DTLSv1.2

While here fix format of validation message in Ca/Cert.
DeltaFile
+50-0src/opnsense/mvc/app/models/OPNsense/Trust/Migrations/M1_0_2.php
+1-1src/opnsense/mvc/app/models/OPNsense/Trust/General.xml
+1-1src/opnsense/mvc/app/models/OPNsense/Trust/Ca.xml
+1-1src/opnsense/mvc/app/models/OPNsense/Trust/Cert.xml
+1-0plist
+54-35 files

OPNSense/core 06936c6src/opnsense/mvc/app/controllers/OPNsense/Base ControllerBase.php

MVC:ui - form labels could be empty, make sure to add them to avoid warnings in forms.

spotted at Services: Unbound DNS: Query Forwarding
DeltaFile
+2-0src/opnsense/mvc/app/controllers/OPNsense/Base/ControllerBase.php
+2-01 files

OPNSense/core f1cbec3src/opnsense/mvc/app/views/layout_partials form_input_tr.volt

mvc: base templates, define and empty are, well, not the same... closes https://github.com/opnsense/core/issues/10555
DeltaFile
+2-2src/opnsense/mvc/app/views/layout_partials/form_input_tr.volt
+2-21 files

OPNSense/core ce022ddsrc/opnsense/mvc/app/models/OPNsense/Trust General.xml

system: DTLSv1.3 does not work either
DeltaFile
+0-1src/opnsense/mvc/app/models/OPNsense/Trust/General.xml
+0-11 files

OPNSense/core 0b7d29bsrc/opnsense/mvc/app/models/OPNsense/Trust General.xml

system: DTLSv1.1 is rejected by OpenSSL 3.5

Which appears to break HTTPS too since the SSL context is not created at all.

PR: https://forum.opnsense.org/index.php?topic=52445.0
DeltaFile
+2-1src/opnsense/mvc/app/models/OPNsense/Trust/General.xml
+2-11 files

OPNSense/core 6223abbsrc/opnsense/mvc/app/controllers/OPNsense/Trust/Api CrlController.php

trust: use serialNumberHex for CRL so high-bit serials aren't dropped (#10559)

CrlController::setAction() built the CRL from
openssl_x509_parse()['serialNumber'], a signed decimal that is unreliable
for serials with the high bit set (first byte >= 0x80). Those serials were
passed to phpseclib as an invalid/zero value and collapsed into a single
"Serial Number: 00" entry, so the affected certificates were effectively
not revoked (e.g. OpenVPN clients could still connect). With random 128-bit
serials this silently affects roughly half of all revocations.

Use the canonical unsigned serialNumberHex via a phpseclib BigInteger,
matching the index.txt export already present in the same controller.
DeltaFile
+5-2src/opnsense/mvc/app/controllers/OPNsense/Trust/Api/CrlController.php
+5-21 files

OPNSense/core ace8f12src/opnsense/www/js/widgets Services.js

system: use btn styles in services widget #10553

This damps the colors a bit and auto-decides on the
text color to use.  Hover will still use the previous
color.  People will not like this either, but this is
entirely in the scope of the theme to make it look
nice.
DeltaFile
+3-4src/opnsense/www/js/widgets/Services.js
+3-41 files

OPNSense/core d5baa1asrc/opnsense/www/css dashboard.css, src/opnsense/www/js opnsense_widget_manager.js

system: compact and align dashboard style for #10553

This started with the service widget but the current style is a
bit constrained in what we can show and what not.  Divider layout
changes have consequences in gauge widgets too. CSS changes
are bit too intrusive but it's impossible to move out of them
without it.
DeltaFile
+4-5src/opnsense/www/js/widgets/Services.js
+4-3src/opnsense/www/js/opnsense_widget_manager.js
+3-2src/opnsense/www/themes/opnsense-dark/assets/stylesheets/dashboard.scss
+3-2src/opnsense/www/css/dashboard.css
+5-0src/opnsense/www/js/widgets/BaseWidget.js
+3-2src/opnsense/www/themes/opnsense-dark/build/css/dashboard.css
+22-146 files not shown
+32-1812 files

OPNSense/core 3a1912esrc/opnsense/mvc/app/views/OPNsense/Firewall filter_rule.volt

firewall: skip message banner if searchPhrase set
DeltaFile
+5-1src/opnsense/mvc/app/views/OPNsense/Firewall/filter_rule.volt
+5-11 files

OPNSense/core 6b5a3a2src/etc/inc/plugins.inc.d captiveportal.inc

firewall: captive portal block rule should be evaluated after the anti-lockout rule
DeltaFile
+1-1src/etc/inc/plugins.inc.d/captiveportal.inc
+1-11 files

OPNSense/core 8405bc6src/opnsense/mvc/app/views/OPNsense/Core defaults.volt

system: do not let the selectpicker grow on selection; closes #10547

(cherry picked from commit 8690ebe551b0f3105447a9f0e907b9d7509d3f3c)
DeltaFile
+3-3src/opnsense/mvc/app/views/OPNsense/Core/defaults.volt
+3-31 files

OPNSense/core 17a4f28src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes FilterRuleField.php, src/opnsense/mvc/app/views/OPNsense/Firewall filter_rule.volt

Collapse defunct bucket per default
DeltaFile
+1-1src/opnsense/mvc/app/views/OPNsense/Firewall/filter_rule.volt
+0-1src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/FilterRuleField.php
+1-22 files

OPNSense/core 25d341csrc/opnsense/mvc/app/controllers/OPNsense/Firewall/Api DNatController.php, src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes FilterRuleField.php

Fix previous
DeltaFile
+0-5src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/DNatController.php
+1-1src/opnsense/mvc/app/views/OPNsense/Firewall/nat_rule.volt
+1-1src/opnsense/mvc/app/views/OPNsense/Firewall/filter_rule.volt
+1-0src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/FilterRuleField.php
+3-74 files

OPNSense/core 8c5f1aesrc/opnsense/mvc/app/controllers/OPNsense/Firewall/Api DNatController.php, src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes SourceNatRuleField.php FilterRuleField.php

Firewall: Rules and NAT: Group invalid rules to the end of the ruleset. These rules are skipped by PF processing because they do not have a valid interface.
DeltaFile
+30-2src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/SourceNatRuleField.php
+26-2src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/DNatController.php
+13-0src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/FilterRuleField.php
+1-0src/opnsense/mvc/app/views/OPNsense/Firewall/filter_rule.volt
+1-0src/opnsense/mvc/app/views/OPNsense/Firewall/nat_rule.volt
+71-45 files

OPNSense/core e9cc08bsrc/opnsense/mvc/app/controllers/OPNsense/Base ControllerBase.php, src/opnsense/mvc/app/views/layout_partials base_tabs_header.volt base_tabs_content.volt

mvc: tab/subtab form generation align with what base_form expects, closes https://github.com/opnsense/core/issues/10535

As these are hardly used, we missed these during our testing.
While here, cleanup the code a bit further and stop using index assignments to refer to content [0],[1],..

(cherry picked from commit 14710e7751870e2b4daed920b9ef3af5604dbc62)
DeltaFile
+12-12src/opnsense/mvc/app/views/layout_partials/base_tabs_header.volt
+10-9src/opnsense/mvc/app/controllers/OPNsense/Base/ControllerBase.php
+4-4src/opnsense/mvc/app/views/layout_partials/base_tabs_content.volt
+26-253 files