Commit 8f5d949d by Jesse Shapiro

Restrict block ID comparison slightly to avoid false positives

parent b8befaf7
...@@ -57,6 +57,7 @@ import copy ...@@ -57,6 +57,7 @@ import copy
import datetime import datetime
import hashlib import hashlib
import logging import logging
import six
from contracts import contract, new_contract from contracts import contract, new_contract
from importlib import import_module from importlib import import_module
from mongodb_proxy import autoretry_read from mongodb_proxy import autoretry_read
...@@ -1202,9 +1203,14 @@ class SplitMongoModuleStore(SplitBulkWriteMixin, ModuleStoreWriteBase): ...@@ -1202,9 +1203,14 @@ class SplitMongoModuleStore(SplitBulkWriteMixin, ModuleStoreWriteBase):
block_name = qualifiers.pop('name') block_name = qualifiers.pop('name')
block_ids = [] block_ids = []
for block_id, block in course.structure['blocks'].iteritems(): for block_id, block in course.structure['blocks'].iteritems():
# Do an in comparison on the name qualifier # Don't do an in comparison blindly; first check to make sure
# so that a list can be used to filter on block_id # that the name qualifier we're looking at isn't a plain string;
if block_id.id in block_name and _block_matches_all(block): # if it is a string, then it should match exactly.
if isinstance(block_name, six.string_types):
name_matches = block_id.id == block_name
else:
name_matches = block_id.id in block_name
if name_matches and _block_matches_all(block):
block_ids.append(block_id) block_ids.append(block_id)
return self._load_items(course, block_ids, **kwargs) return self._load_items(course, block_ids, **kwargs)
......
...@@ -267,6 +267,15 @@ class SplitModuleTest(unittest.TestCase): ...@@ -267,6 +267,15 @@ class SplitModuleTest(unittest.TestCase):
}, },
}, },
{ {
"id": "chap",
"parent": "head12345",
"parent_type": "course",
"category": "chapter",
"fields": {
"display_name": "Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo"
},
},
{
"id": "chapter2", "id": "chapter2",
"parent": "head12345", "parent": "head12345",
"parent_type": "course", "parent_type": "course",
...@@ -1189,13 +1198,14 @@ class SplitModuleItemTests(SplitModuleTest): ...@@ -1189,13 +1198,14 @@ class SplitModuleItemTests(SplitModuleTest):
locator = CourseLocator(org='testx', course='GreekHero', run="run", branch=BRANCH_NAME_DRAFT) locator = CourseLocator(org='testx', course='GreekHero', run="run", branch=BRANCH_NAME_DRAFT)
# get all modules # get all modules
matches = modulestore().get_items(locator) matches = modulestore().get_items(locator)
self.assertEqual(len(matches), 7) self.assertEqual(len(matches), 8)
matches = modulestore().get_items(locator) matches = modulestore().get_items(locator)
self.assertEqual(len(matches), 7) self.assertEqual(len(matches), 8)
matches = modulestore().get_items(locator, qualifiers={'category': 'chapter'}) matches = modulestore().get_items(locator, qualifiers={'category': 'chapter'})
self.assertEqual(len(matches), 3) self.assertEqual(len(matches), 4)
matches = modulestore().get_items(locator, qualifiers={'category': 'garbage'}) matches = modulestore().get_items(locator, qualifiers={'category': 'garbage'})
self.assertEqual(len(matches), 0) self.assertEqual(len(matches), 0)
# Test that we don't accidentally get an item with a similar name.
matches = modulestore().get_items(locator, qualifiers={'name': 'chapter1'}) matches = modulestore().get_items(locator, qualifiers={'name': 'chapter1'})
self.assertEqual(len(matches), 1) self.assertEqual(len(matches), 1)
matches = modulestore().get_items(locator, qualifiers={'name': ['chapter1', 'chapter2']}) matches = modulestore().get_items(locator, qualifiers={'name': ['chapter1', 'chapter2']})
...@@ -1209,7 +1219,7 @@ class SplitModuleItemTests(SplitModuleTest): ...@@ -1209,7 +1219,7 @@ class SplitModuleItemTests(SplitModuleTest):
matches = modulestore().get_items(locator, settings={'group_access': {'$exists': True}}) matches = modulestore().get_items(locator, settings={'group_access': {'$exists': True}})
self.assertEqual(len(matches), 1) self.assertEqual(len(matches), 1)
matches = modulestore().get_items(locator, settings={'group_access': {'$exists': False}}) matches = modulestore().get_items(locator, settings={'group_access': {'$exists': False}})
self.assertEqual(len(matches), 6) self.assertEqual(len(matches), 7)
def test_get_parents(self): def test_get_parents(self):
''' '''
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment