From 46e06d8fd1f1dd378c128fe87549bdba165f640a Mon Sep 17 00:00:00 2001 From: Ruben Herold Date: Fri, 4 Sep 2026 11:17:26 +0200 Subject: dhcp-server: T9267: make client-class substring matching contains-anywhere The Mikrotik configuration referenced by T9267 uses matching-type=substring, documented to match the value anywhere within the option string. This PR's "substring" match instead compared a fixed-length slice at a fixed byte offset (default 0) for exact equality - effectively an anchored prefix match, not a substring search - which does not reliably reproduce the ticket's own use case of picking a device model string (e.g. "T42S") out of a longer, variably-formatted hostname. Rebuild "hostname substring"/"vendor-class-id substring" on Kea's match()+lcase() instead of substring()==, so a configured value now matches anywhere in the option content and case-insensitively (options like vendor-class-id are not guaranteed to arrive in a fixed case). Drop the "offset" leaf together with it, since it has no remaining purpose once matching is no longer anchored to a fixed position, and there is no released behavior to preserve. Raw hex input and values containing a literal single quote are rejected for substring matching in verify(), since neither can be safely embedded into the generated Kea regular expression; exact "value" matching is unaffected and still accepts both. Reported by alexk37 in review of PR #5436. --- .../include/dhcp/dhcp-server-common-config.xml.i | 44 +++------------------- 1 file changed, 6 insertions(+), 38 deletions(-) (limited to 'interface-definitions/include') diff --git a/interface-definitions/include/dhcp/dhcp-server-common-config.xml.i b/interface-definitions/include/dhcp/dhcp-server-common-config.xml.i index e909adca3..f49f69856 100644 --- a/interface-definitions/include/dhcp/dhcp-server-common-config.xml.i +++ b/interface-definitions/include/dhcp/dhcp-server-common-config.xml.i @@ -62,31 +62,15 @@ - Filters on part of the option contents + Filters on whether the option contents contain this text (case-insensitive) - - - Byte offset from the start of the option value (default: 0) - - u32:0-255 - Byte offset - - - - - - - Filters on part of the option contents - - hex - Values that start with 0x are interpreted as raw hex. This must only be hexadecimal characters e.g. 0x1234567890ABCDEF - + Text that must appear anywhere in the option contents (case-insensitive) txt - Any other text string is interpreted as ASCII text + ASCII text to search for; must not contain a single quote (') @@ -114,31 +98,15 @@ - Filters on part of the option contents + Filters on whether the option contents contain this text (case-insensitive) - - - Byte offset from the start of the option value (default: 0) - - u32:0-255 - Byte offset - - - - - - - Filters on part of the option contents - - hex - Values that start with 0x are interpreted as raw hex. This must only be hexadecimal characters e.g. 0x1234567890ABCDEF - + Text that must appear anywhere in the option contents (case-insensitive) txt - Any other text string is interpreted as ASCII text + ASCII text to search for; must not contain a single quote (') -- cgit v1.2.3