Skip to content

Commit 170cfde

Browse files
committed
Add more test cases
1 parent 4765c7b commit 170cfde

File tree

2 files changed

+48
-10
lines changed

2 files changed

+48
-10
lines changed

django_pymodsecurity/middleware.py

+21-10
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55

66
import ModSecurity
77

8-
logger = logging.getLogger(__name__)
9-
108
SETTINGS_NAMES = {
119
'rule_files': 'MODSECURITY_RULE_FILES',
1210
'rule_lines': 'MODSECURITY_RULES',
@@ -22,6 +20,8 @@ def __init__(self, get_response):
2220
2321
:param callable get_response
2422
'''
23+
self.logger = logging.getLogger(__name__)
24+
2525
self.get_response = get_response
2626

2727
self.modsecurity = ModSecurity.ModSecurity()
@@ -44,7 +44,7 @@ def __init__(self, get_response):
4444
self.load_rules(self.rule_lines)
4545

4646
def modsecurity_log_callback(self, data, msg):
47-
logger.info(msg)
47+
self.logger.info(msg)
4848

4949
@property
5050
def rules_count(self):
@@ -54,34 +54,43 @@ def load_rule_files(self, rule_files):
5454
'''
5555
Process a list of files (can be a list of globs) and loads into modsecurity
5656
:param list(str) rule_files
57+
:rtype: int
58+
:return the total rules that were loaded
5759
'''
60+
before_count = self.rules_count
5861
import glob
5962
for pattern in rule_files:
6063
for rule_file in glob.glob(pattern, recursive=True):
6164
rules_count = self.rules.loadFromUri(rule_file)
6265
if rules_count < 0:
6366
msg = '[ModSecurity] Error trying to load rule file %s. %s' % (
6467
rule_file, self.rules.getParserError())
65-
logger.warning(msg)
68+
self.logger.warning(msg)
6669
else:
6770
self._rules_count += rules_count
6871

72+
return self.rules_count - before_count
73+
6974
def load_rules(self, rules):
7075
'''
7176
Process rules
7277
:param str: rules
78+
:rtype: int
79+
:return the total rules that were loaded
7380
'''
7481
if rules is None or not len(rules) > 0:
75-
return
82+
return 0
7683

7784
rules_count = self.rules.load(rules)
7885
if rules_count < 0:
7986
msg = '[ModSecurity] Error trying to load rules: %s' % self.rules.getParserError(
8087
)
81-
logger.warning(msg)
88+
self.logger.warning(msg)
8289
else:
8390
self._rules_count += rules_count
8491

92+
return rules_count
93+
8594
def __call__(self, request):
8695
transaction = ModSecurity.Transaction(self.modsecurity, self.rules)
8796
response = self.process_request(request, transaction)
@@ -168,15 +177,17 @@ def process_intervention(self, transaction):
168177
:rtype HttpResponse:
169178
'''
170179
intervention = ModSecurity.ModSecurityIntervention()
180+
181+
if intervention is None:
182+
return None
183+
171184
if transaction.intervention(intervention):
172-
if intervention is None:
173-
return None
185+
if intervention.log is not None:
186+
self.logger.info(intervention.log)
174187

175188
if not intervention.disruptive:
176189
return None
177190

178-
# TODO process intervention logs
179-
180191
if intervention.url is not None:
181192
response = HttpResponseRedirect(intervention.url)
182193
else:

tests/test_main.py

+27
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,30 @@ def test_log(get_response, request_factory, mocker):
117117
assert obj == middleware
118118
assert data is None
119119
assert 'log test ok' in msg
120+
121+
122+
def test_log_when_load_rule_files_fail(middleware, mocker):
123+
mocker.spy(middleware.logger, 'warning')
124+
125+
assert middleware.load_rule_files('tests/data/invalid-conf.conf') == 0
126+
127+
assert middleware.logger.warning.call_count > 0
128+
msg = middleware.logger.warning.call_args_list[0][0][0]
129+
130+
assert '[ModSecurity] Error trying to load rule file' in msg
131+
132+
133+
def test_log_when_load_rules_fail(middleware, mocker):
134+
mocker.spy(middleware.logger, 'warning')
135+
136+
assert middleware.load_rules('invalid sec rule here') < 0
137+
138+
assert middleware.logger.warning.call_count > 0
139+
msg = middleware.logger.warning.call_args_list[0][0][0]
140+
141+
assert '[ModSecurity] Error trying to load rules' in msg
142+
143+
144+
@pytest.mark.parametrize('rules', [None, ''])
145+
def test_load_rules_params(middleware, rules):
146+
assert middleware.load_rules(rules) == 0

0 commit comments

Comments
 (0)