Skip to content

Commit ce5094d

Browse files
tpellissierclaude
andcommitted
Fix Copilot review: wrap user filter in parens to prevent OData or-precedence bypass, update test docstring
- Wrap user-provided filter in parentheses when combining with IsPrivate guard to prevent `or` operator from bypassing the privacy check - Update TestListTables class docstring to mention both filter and select params - Update test assertions to match new parenthesized filter format Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 3dbab73 commit ce5094d

2 files changed

Lines changed: 4 additions & 4 deletions

File tree

src/PowerPlatform/Dataverse/data/_odata.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1452,7 +1452,7 @@ def _list_tables(
14521452
url = f"{self.api}/EntityDefinitions"
14531453
base_filter = "IsPrivate eq false"
14541454
if filter:
1455-
combined_filter = f"{base_filter} and {filter}"
1455+
combined_filter = f"{base_filter} and ({filter})"
14561456
else:
14571457
combined_filter = base_filter
14581458
params: Dict[str, str] = {"$filter": combined_filter}

tests/unit/data/test_odata_internal.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ def test_non_string_key_raises_type_error(self):
126126

127127

128128
class TestListTables(unittest.TestCase):
129-
"""Unit tests for _ODataClient._list_tables filter parameter."""
129+
"""Unit tests for _ODataClient._list_tables filter and select parameters."""
130130

131131
def setUp(self):
132132
self.od = _make_odata_client()
@@ -157,7 +157,7 @@ def test_filter_combined_with_default(self):
157157
params = call_kwargs.kwargs.get("params") or call_kwargs[1].get("params", {})
158158
self.assertEqual(
159159
params["$filter"],
160-
"IsPrivate eq false and SchemaName eq 'Account'",
160+
"IsPrivate eq false and (SchemaName eq 'Account')",
161161
)
162162

163163
def test_filter_none_same_as_no_filter(self):
@@ -229,7 +229,7 @@ def test_select_with_filter(self):
229229
params = call_kwargs.kwargs.get("params") or call_kwargs[1].get("params", {})
230230
self.assertEqual(
231231
params["$filter"],
232-
"IsPrivate eq false and SchemaName eq 'Account'",
232+
"IsPrivate eq false and (SchemaName eq 'Account')",
233233
)
234234
self.assertEqual(params["$select"], "LogicalName,SchemaName")
235235

0 commit comments

Comments
 (0)