Skip to content

Commit 3cb7eb1

Browse files
committed
Add test for regex sanitisation in item search
1 parent b8d56fe commit 3cb7eb1

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

pydatalab/src/pydatalab/routes/v0_1/items.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import datetime
22
import json
3+
import re
34

45
from bson import ObjectId
56
from flask import Blueprint, jsonify, redirect, request
@@ -327,6 +328,8 @@ def search_items():
327328
pipeline.append({"$match": match_obj})
328329
pipeline.append({"$sort": {"score": {"$meta": "textScore"}}})
329330
else:
331+
query = re.escape(query)
332+
LOGGER.debug("Performing regex search for %s", query)
330333
match_obj = {
331334
"$or": [{field: {"$regex": query, "$options": "i"}} for field in ITEMS_FTS_FIELDS]
332335
}

pydatalab/tests/server/conftest.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,7 @@ def example_items(user_id, admin_user_id):
494494
Sample(
495495
**{
496496
"item_id": "sample_2",
497+
"chemform": "vanadium (II) oxide",
497498
"name": "other_sample",
498499
"date": "1970-02-01",
499500
"refcode": "grey:TEST3",
@@ -515,7 +516,7 @@ def example_items(user_id, admin_user_id):
515516
**{
516517
"item_id": "test",
517518
"chemform": "NaNiO2",
518-
"name": "NaNiO2",
519+
"name": "NaNiO2-v",
519520
"date": "1970-02-01",
520521
"description": "magic",
521522
"refcode": "grey:TEST5",

pydatalab/tests/server/test_samples.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,24 @@ def test_item_search(client, admin_client, real_mongo_client, example_items):
242242
assert "test" in item_ids
243243
assert "sample_admin" in item_ids
244244

245+
# Search for string with brackets
246+
response = admin_client.get("/search-items/?query='vanadium('")
247+
248+
assert response.status_code == 200
249+
assert response.json["status"] == "success"
250+
item_ids = {item["item_id"] for item in response.json["items"]}
251+
assert len(item_ids) == 1
252+
assert "sample_2" in item_ids
253+
254+
# Search for single char at start of word
255+
response = admin_client.get("/search-items/?query='v'")
256+
257+
assert response.status_code == 200
258+
assert response.json["status"] == "success"
259+
item_ids = {item["item_id"] for item in response.json["items"]}
260+
assert len(item_ids) == 1
261+
assert "sample_2" in item_ids
262+
245263

246264
@pytest.mark.dependency(depends=["test_delete_sample"])
247265
def test_new_sample_with_relationships(client, complicated_sample):

0 commit comments

Comments
 (0)