Refactor event and session column names to camelCase

- Updated test cases to reflect new column names (eve_MAC -> eveMac, eve_DateTime -> eveDateTime, etc.) across various test files.
- Modified SQL table definitions in the database cleanup and migration tests to use camelCase naming conventions.
- Implemented migration tests to ensure legacy column names are correctly renamed to camelCase equivalents.
- Ensured that existing data is preserved during the migration process and that views referencing old column names are dropped before renaming.
- Verified that the migration function is idempotent, allowing for safe re-execution without data loss.
This commit is contained in:
Jokob @NetAlertX
2026-03-16 10:11:22 +00:00
parent 0bb6db155b
commit c7399215ec
109 changed files with 2403 additions and 1967 deletions

View File

@@ -20,10 +20,10 @@ class SafeConditionBuilder:
# Whitelist of allowed column names for filtering
ALLOWED_COLUMNS = {
"eve_MAC",
"eve_DateTime",
"eve_IP",
"eve_EventType",
"eveMac",
"eveDateTime",
"eveIp",
"eveEventType",
"devName",
"devComments",
"devLastIP",
@@ -34,15 +34,15 @@ class SafeConditionBuilder:
"devPresentLastScan",
"devFavorite",
"devIsNew",
"Plugin",
"Object_PrimaryId",
"Object_SecondaryId",
"DateTimeChanged",
"Watched_Value1",
"Watched_Value2",
"Watched_Value3",
"Watched_Value4",
"Status",
"plugin",
"objectPrimaryId",
"objectSecondaryId",
"dateTimeChanged",
"watchedValue1",
"watchedValue2",
"watchedValue3",
"watchedValue4",
"status",
}
# Whitelist of allowed comparison operators
@@ -403,7 +403,7 @@ class SafeConditionBuilder:
This method handles basic patterns like:
- devName = 'value' (with optional AND/OR prefix)
- devComments LIKE '%value%'
- eve_EventType IN ('type1', 'type2')
- eveEventType IN ('type1', 'type2')
Args:
condition: Single condition string to parse
@@ -633,7 +633,7 @@ class SafeConditionBuilder:
self.parameters[param_name] = event_type
param_names.append(f":{param_name}")
sql_snippet = f"AND eve_EventType IN ({', '.join(param_names)})"
sql_snippet = f"AND eveEventType IN ({', '.join(param_names)})"
return sql_snippet, self.parameters
def get_safe_condition_legacy(

View File

@@ -174,7 +174,7 @@ def test_compound_with_like_patterns(builder):
def test_compound_with_inequality_operators(builder):
"""Test compound conditions with various inequality operators."""
condition = "AND eve_DateTime > '2024-01-01' AND eve_DateTime < '2024-12-31'"
condition = "AND eveDateTime > '2024-01-01' AND eveDateTime < '2024-12-31'"
sql, params = builder.build_safe_condition(condition)

View File

@@ -32,25 +32,25 @@ def _make_json(section, devices, column_names, title="Test Section"):
SAMPLE_NEW_DEVICES = [
{
"devName": "MyPhone",
"eve_MAC": "aa:bb:cc:dd:ee:ff",
"eveMac": "aa:bb:cc:dd:ee:ff",
"devVendor": "",
"eve_IP": "192.168.1.42",
"eve_DateTime": "2025-01-15 10:30:00",
"eve_EventType": "New Device",
"eveIp": "192.168.1.42",
"eveDateTime": "2025-01-15 10:30:00",
"eveEventType": "New Device",
"devComments": "",
},
{
"devName": "Laptop",
"eve_MAC": "11:22:33:44:55:66",
"eveMac": "11:22:33:44:55:66",
"devVendor": "Dell",
"eve_IP": "192.168.1.99",
"eve_DateTime": "2025-01-15 11:00:00",
"eve_EventType": "New Device",
"eveIp": "192.168.1.99",
"eveDateTime": "2025-01-15 11:00:00",
"eveEventType": "New Device",
"devComments": "Office",
},
]
NEW_DEVICE_COLUMNS = ["devName", "eve_MAC", "devVendor", "eve_IP", "eve_DateTime", "eve_EventType", "devComments"]
NEW_DEVICE_COLUMNS = ["devName", "eveMac", "devVendor", "eveIp", "eveDateTime", "eveEventType", "devComments"]
class TestConstructNotificationsTemplates(unittest.TestCase):
@@ -100,7 +100,7 @@ class TestConstructNotificationsTemplates(unittest.TestCase):
self.assertIn("---------", text)
# Legacy format: each header appears as "Header: \tValue"
self.assertIn("eve_MAC:", text)
self.assertIn("eveMac:", text)
self.assertIn("aa:bb:cc:dd:ee:ff", text)
self.assertIn("devName:", text)
self.assertIn("MyPhone", text)
@@ -117,7 +117,7 @@ class TestConstructNotificationsTemplates(unittest.TestCase):
mock_setting.side_effect = self._setting_factory({
"NTFPRCS_TEXT_SECTION_HEADERS": True,
"NTFPRCS_TEXT_TEMPLATE_new_devices": "{devName} ({eve_MAC}) - {eve_IP}",
"NTFPRCS_TEXT_TEMPLATE_new_devices": "{devName} ({eveMac}) - {eveIp}",
})
json_data = _make_json(
@@ -157,7 +157,7 @@ class TestConstructNotificationsTemplates(unittest.TestCase):
mock_setting.side_effect = self._setting_factory({
"NTFPRCS_TEXT_SECTION_HEADERS": False,
"NTFPRCS_TEXT_TEMPLATE_new_devices": "{devName} ({eve_MAC})",
"NTFPRCS_TEXT_TEMPLATE_new_devices": "{devName} ({eveMac})",
})
json_data = _make_json(
@@ -198,7 +198,7 @@ class TestConstructNotificationsTemplates(unittest.TestCase):
mock_setting.side_effect = self._setting_factory({
"NTFPRCS_TEXT_SECTION_HEADERS": True,
"NTFPRCS_TEXT_TEMPLATE_new_devices": "{devName} ({BadField}) - {eve_IP}",
"NTFPRCS_TEXT_TEMPLATE_new_devices": "{devName} ({BadField}) - {eveIp}",
})
json_data = _make_json(
@@ -217,21 +217,21 @@ class TestConstructNotificationsTemplates(unittest.TestCase):
mock_setting.side_effect = self._setting_factory({
"NTFPRCS_TEXT_SECTION_HEADERS": True,
"NTFPRCS_TEXT_TEMPLATE_down_devices": "{devName} ({eve_MAC}) down since {eve_DateTime}",
"NTFPRCS_TEXT_TEMPLATE_down_devices": "{devName} ({eveMac}) down since {eveDateTime}",
})
down_devices = [
{
"devName": "Router",
"eve_MAC": "ff:ee:dd:cc:bb:aa",
"eveMac": "ff:ee:dd:cc:bb:aa",
"devVendor": "Cisco",
"eve_IP": "10.0.0.1",
"eve_DateTime": "2025-01-15 08:00:00",
"eve_EventType": "Device Down",
"eveIp": "10.0.0.1",
"eveDateTime": "2025-01-15 08:00:00",
"eveEventType": "Device Down",
"devComments": "",
}
]
columns = ["devName", "eve_MAC", "devVendor", "eve_IP", "eve_DateTime", "eve_EventType", "devComments"]
columns = ["devName", "eveMac", "devVendor", "eveIp", "eveDateTime", "eveEventType", "devComments"]
json_data = _make_json("down_devices", down_devices, columns, "🔴 Down devices")
_, text = construct_notifications(json_data, "down_devices")

View File

@@ -15,7 +15,7 @@ sys.modules['logger'] = Mock()
class SafeConditionBuilderForTesting:
"""Minimal SafeConditionBuilder implementation for tests."""
ALLOWED_COLUMNS = {'devName', 'eve_MAC', 'eve_EventType'}
ALLOWED_COLUMNS = {'devName', 'eveMac', 'eveEventType'}
ALLOWED_OPERATORS = {'=', '!=', '<', '>', '<=', '>=', 'LIKE', 'NOT LIKE'}
ALLOWED_LOGICAL_OPERATORS = {'AND', 'OR'}

View File

@@ -174,13 +174,13 @@ def test_null_byte_injection(builder):
def test_build_condition_with_allowed_values(builder):
"""Test building condition with specific allowed values."""
conditions = [
{"column": "eve_EventType", "operator": "=", "value": "Connected"},
{"column": "eveEventType", "operator": "=", "value": "Connected"},
{"column": "devName", "operator": "LIKE", "value": "%test%"}
]
condition, params = builder.build_condition(conditions, "AND")
# Should create valid parameterized condition
assert "eve_EventType = :" in condition
assert "eveEventType = :" in condition
assert "devName LIKE :" in condition
assert len(params) == 2

View File

@@ -58,9 +58,9 @@ class TestSafeConditionBuilder(unittest.TestCase):
def test_validate_column_name(self):
"""Test column name validation against whitelist."""
# Valid columns
self.assertTrue(self.builder._validate_column_name('eve_MAC'))
self.assertTrue(self.builder._validate_column_name('eveMac'))
self.assertTrue(self.builder._validate_column_name('devName'))
self.assertTrue(self.builder._validate_column_name('eve_EventType'))
self.assertTrue(self.builder._validate_column_name('eveEventType'))
# Invalid columns
self.assertFalse(self.builder._validate_column_name('malicious_column'))
@@ -103,9 +103,9 @@ class TestSafeConditionBuilder(unittest.TestCase):
def test_build_in_condition_valid(self):
"""Test building valid IN conditions."""
sql, params = self.builder._build_in_condition('AND', 'eve_EventType', 'IN', "'Connected', 'Disconnected'")
sql, params = self.builder._build_in_condition('AND', 'eveEventType', 'IN', "'Connected', 'Disconnected'")
self.assertIn('AND eve_EventType IN', sql)
self.assertIn('AND eveEventType IN', sql)
self.assertEqual(len(params), 2)
self.assertIn('Connected', params.values())
self.assertIn('Disconnected', params.values())
@@ -162,7 +162,7 @@ class TestSafeConditionBuilder(unittest.TestCase):
event_types = ['Connected', 'Disconnected']
sql, params = self.builder.build_event_type_filter(event_types)
self.assertIn('AND eve_EventType IN', sql)
self.assertIn('AND eveEventType IN', sql)
self.assertEqual(len(params), 2)
self.assertIn('Connected', params.values())
self.assertIn('Disconnected', params.values())
@@ -354,9 +354,9 @@ class TestSecurityBenchmarks(unittest.TestCase):
"""Test coverage of condition patterns."""
patterns_tested = [
"AND devName = 'value'",
"OR eve_EventType LIKE '%test%'",
"OR eveEventType LIKE '%test%'",
"AND devComments IS NULL",
"AND eve_EventType IN ('Connected', 'Disconnected')",
"AND eveEventType IN ('Connected', 'Disconnected')",
]
for pattern in patterns_tested: