Skip to content

Commit 82ea199

Browse files
committed
Add regexes to check keys and values
Fixes open-telemetry#2010
1 parent 65670cf commit 82ea199

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

opentelemetry-api/src/opentelemetry/baggage/propagation/__init__.py

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,19 @@
1414
#
1515
import typing
1616
import urllib.parse
17+
from re import compile as compile_
1718

1819
from opentelemetry import baggage
1920
from opentelemetry.context import get_current
2021
from opentelemetry.context.context import Context
2122
from opentelemetry.propagators import textmap
2223

24+
_key = r"[!#-'*+-.0-9A-Z^-z|~]+"
25+
_key_regex = compile_(_key)
26+
_value = r"[!#-+.-:<-\[\]-~-]*"
27+
_value_regex = compile_(_value)
28+
_key_value_regex = compile_(r"\s*{}\s*=\s*{}\s*".format(_key, _value))
29+
2330

2431
class W3CBaggagePropagator(textmap.TextMapPropagator):
2532
"""Extracts and injects Baggage which is used to annotate telemetry."""
@@ -54,7 +61,10 @@ def extract(
5461
baggage_entries = header.split(",")
5562
total_baggage_entries = self._MAX_PAIRS
5663
for entry in baggage_entries:
57-
if total_baggage_entries <= 0:
64+
65+
if _key_value_regex.match(entry) is None or (
66+
total_baggage_entries <= 0
67+
):
5868
return context
5969
total_baggage_entries -= 1
6070
if len(entry) > self._MAX_PAIR_LENGTH:
@@ -95,11 +105,18 @@ def fields(self) -> typing.Set[str]:
95105
return {self._BAGGAGE_HEADER_NAME}
96106

97107

98-
def _format_baggage(baggage_entries: typing.Mapping[str, object]) -> str:
99-
return ",".join(
100-
key + "=" + urllib.parse.quote_plus(str(value))
101-
for key, value in baggage_entries.items()
102-
)
108+
def _format_baggage(baggage_entries: typing.Mapping[str, str]) -> str:
109+
110+
key_values = []
111+
112+
for key, value in baggage_entries.items():
113+
114+
if _key_regex.match(key) is None or _value_regex.match(value) is None:
115+
continue
116+
117+
key_values.append(key + "=" + urllib.parse.quote(str(value)))
118+
119+
return ",".join(key_values)
103120

104121

105122
def _extract_first_element(

opentelemetry-api/tests/baggage/test_baggage_propagation.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,8 @@ def test_valid_header_with_empty_value(self):
7979
self.assertEqual(self._extract(header), expected)
8080

8181
def test_invalid_header(self):
82-
header = "header1"
83-
expected = {}
84-
self.assertEqual(self._extract(header), expected)
82+
self.assertEqual(self._extract("header1"), {})
83+
self.assertEqual(self._extract(" = "), {})
8584

8685
def test_header_too_long(self):
8786
long_value = "s" * (W3CBaggagePropagator._MAX_HEADER_LENGTH + 1)
@@ -111,6 +110,9 @@ def test_inject_no_baggage_entries(self):
111110
output = self._inject(values)
112111
self.assertEqual(None, output)
113112

113+
def test_inject_invalid_entries(self):
114+
self.assertEqual(None, self._inject({"key": "val ue"}))
115+
114116
def test_inject(self):
115117
values = {
116118
"key1": "val1",

0 commit comments

Comments
 (0)