From f5ba98d412ebbbd6e8aef1be7e092b4459098fdd Mon Sep 17 00:00:00 2001 From: julius Date: Fri, 3 Dec 2021 15:08:19 -0800 Subject: [PATCH 1/2] tweak validation rules --- bson/json_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bson/json_util.py b/bson/json_util.py index 0644874b44..ed67d9a36c 100644 --- a/bson/json_util.py +++ b/bson/json_util.py @@ -508,7 +508,7 @@ def object_hook(dct, json_options=DEFAULT_JSON_OPTIONS): def _parse_legacy_regex(doc): pattern = doc["$regex"] # Check if this is the $regex query operator. - if isinstance(pattern, Regex): + if not isinstance(pattern, (str, bytes)): return doc flags = 0 # PyMongo always adds $options but some other tools may not. From 2cbb533e4d7827bb2bc3ad638b09ea9632494e50 Mon Sep 17 00:00:00 2001 From: julius Date: Fri, 3 Dec 2021 16:52:28 -0800 Subject: [PATCH 2/2] add tests --- test/test_json_util.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/test/test_json_util.py b/test/test_json_util.py index f28b75c9be..dbf4f1c26a 100644 --- a/test/test_json_util.py +++ b/test/test_json_util.py @@ -270,6 +270,15 @@ def test_regex(self): json_util.dumps(Regex('.*', re.M | re.X), json_options=LEGACY_JSON_OPTIONS)) + def test_regex_validation(self): + non_str_types = [10, {}, []] + docs = [{"$regex": i} for i in non_str_types] + for doc in docs: + self.assertEqual(doc, json_util.loads(json.dumps(doc))) + + doc = {"$regex": ""} + self.assertIsInstance(json_util.loads(json.dumps(doc)), Regex) + def test_minkey(self): self.round_trip({"m": MinKey()})