From 369badc6c27e1135a3e6bad8d0ea54995b74376a Mon Sep 17 00:00:00 2001 From: YueGuobin Date: Mon, 13 Jul 2026 15:23:27 +0800 Subject: [PATCH] fix(marker): reserve "global" name prefix for future marker inheritance --- gns3server/compute/base_node.py | 2 +- gns3server/schemas/controller/links.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gns3server/compute/base_node.py b/gns3server/compute/base_node.py index 4b6deff10..02d4ce0e3 100644 --- a/gns3server/compute/base_node.py +++ b/gns3server/compute/base_node.py @@ -1093,7 +1093,7 @@ class BaseNode: # mark [tag ] [pcap ] — tag/pcap keyword pairs, any order. # name travels from the controller REST layer (MarkerCreate schema) but is # validated here too as defense-in-depth against hand-edited topology files. - _MARKER_NAME_RE = re.compile(r"^[A-Za-z0-9][A-Za-z0-9_.-]*$") + _MARKER_NAME_RE = re.compile(r"^(?i)(?!global)[A-Za-z0-9][A-Za-z0-9_.-]*$") if not _MARKER_NAME_RE.match(name): raise UbridgeError(f"Invalid marker name: {name!r}") cmd = 'bridge add_packet_filter {bridge} {name} mark "{bpf}"'.format( diff --git a/gns3server/schemas/controller/links.py b/gns3server/schemas/controller/links.py index 2deae4fb2..a3733c9ea 100644 --- a/gns3server/schemas/controller/links.py +++ b/gns3server/schemas/controller/links.py @@ -151,9 +151,9 @@ class MarkerCreate(BaseModel): name: Optional[str] = Field( None, - pattern=r"^[A-Za-z0-9][A-Za-z0-9_.-]*$", + pattern=r"^(?i)(?!global)[A-Za-z0-9][A-Za-z0-9_.-]*$", max_length=128, - description="Unique marker name on the link. Auto-generated when absent.", + description='Unique marker name on the link. Auto-generated when absent. Names starting with "global" are reserved.', ) bpf: str tag: Optional[int] = None