Skip to content

Commit 97ba6cc

Browse files
author
Felipe Zimmerle
committed
ModSecurity Python bindings first commit
0 parents  commit 97ba6cc

File tree

5 files changed

+244
-0
lines changed

5 files changed

+244
-0
lines changed

Makefile

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
all:
2+
swig -I/usr/local/modsecurity/include/ -python -builtin -Wall -Wextra -c++ modsecurity/modsecurity.i
3+
python setup.py build_ext --inplace
4+
5+
test:
6+
tests/t.py
7+
8+
install:
9+
python setup.py install --prefix=/usr
10+
11+
clean:
12+
@rm modsecurity/modsecurity_wrap.cxx
13+
@rm -rf build
14+
@rm _modsecurity.so
15+
@rm modsecurity/modsecurity.py
16+
@rm *.pyc tests/*.pyc modsecurity/*.pyc
17+
18+
19+

modsecurity/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from modsecurity import *

modsecurity/modsecurity.i

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*
2+
* ModSecurity, http://www.modsecurity.org/
3+
* Copyright (c) 2015 Trustwave Holdings, Inc. (http://www.trustwave.com/)
4+
*
5+
* You may not use this file except in compliance with
6+
* the License. You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* If any of the files related to licensing are missing or if you have any
11+
* other questions related to licensing please contact Trustwave Holdings, Inc.
12+
* directly using the email address security@modsecurity.org.
13+
*
14+
* Author: Felipe "Zimmerle" Costa <fcosta at trustwave dot com>
15+
*
16+
*/
17+
18+
%module modsecurity
19+
20+
%include "std_string.i"
21+
%include "std_vector.i"
22+
%include "std_sstream.i"
23+
%include "attribute.i"
24+
%include "carrays.i"
25+
%include "typemaps.i"
26+
27+
#%ignore RulesProperties::parserError;
28+
29+
%{
30+
#include "modsecurity/intervention.h"
31+
#include "modsecurity/transaction/variable.h"
32+
#include "modsecurity/transaction/variables.h"
33+
#include "modsecurity/transaction/collection.h"
34+
#include "modsecurity/transaction/collections.h"
35+
#include "modsecurity/assay.h"
36+
#include "modsecurity/debug_log.h"
37+
#include "modsecurity/modsecurity.h"
38+
#include "modsecurity/rules_properties.h"
39+
#include "modsecurity/rules.h"
40+
#include "modsecurity/rule.h"
41+
42+
using std::basic_string;
43+
%}
44+
45+
%ignore modsecurity::RulesProperties::parserError const;
46+
47+
%include "modsecurity/intervention.h"
48+
%include "modsecurity/transaction/variable.h"
49+
%include "modsecurity/transaction/variables.h"
50+
%include "modsecurity/transaction/collection.h"
51+
%include "modsecurity/transaction/collections.h"
52+
%include "modsecurity/assay.h"
53+
%include "modsecurity/debug_log.h"
54+
%include "modsecurity/modsecurity.h"
55+
%include "modsecurity/rules_properties.h"
56+
%include "modsecurity/rules.h"
57+
%include "modsecurity/rule.h"
58+
59+
60+
%template(RuleVector) std::vector<modsecurity::Rule *>;
61+
%template(VectorOfRuleVector) std::vector<std::vector<modsecurity::Rule *> >;
62+
%template(StringVector) std::vector<std::string>;
63+

setup.py

+107
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
#!/usr/bin/env python
2+
"""
3+
4+
ModSecurity, http://www.modsecurity.org/
5+
Copyright (c) 2015 Trustwave Holdings, Inc. (http://www.trustwave.com/)
6+
7+
You may not use this file except in compliance with
8+
the License. You may obtain a copy of the License at
9+
10+
http://www.apache.org/licenses/LICENSE-2.0
11+
12+
If any of the files related to licensing are missing or if you have any
13+
other questions related to licensing please contact Trustwave Holdings, Inc.
14+
directly using the email address security@modsecurity.org.
15+
16+
Author: Felipe "Zimmerle" Costa <fcosta at trustwave dot com>
17+
18+
"""
19+
20+
from distutils.core import setup, Extension
21+
import os
22+
import sys
23+
24+
possible_modsecurity_dirs = [
25+
"/usr/local/modsecurity/",
26+
"/usr/",
27+
"/usr/local/"
28+
]
29+
30+
libraries_dir = [
31+
"lib/",
32+
"lib64/"
33+
]
34+
35+
headers_dir = [
36+
"include/",
37+
"headers/",
38+
"./"
39+
]
40+
41+
def find_modsec():
42+
for i in possible_modsecurity_dirs:
43+
lib = None
44+
inc = None
45+
46+
for j in libraries_dir:
47+
p = os.path.join(i, j, "libmodsecurity.so")
48+
if os.path.isfile(p) or os.path.islink(p):
49+
lib = os.path.join(i, j)
50+
51+
for x in headers_dir:
52+
p = os.path.join(i, x, os.path.join("modsecurity", "modsecurity.h"))
53+
if os.path.isfile(p) or os.path.islink(p):
54+
inc = os.path.join(i, x)
55+
56+
if inc != None and lib != None:
57+
return (inc, lib)
58+
59+
return (None, None)
60+
61+
inc_dir, lib_dir = find_modsec()
62+
63+
64+
print "*** found modsecurity at:"
65+
print " headers: " + str(inc_dir)
66+
print " library: " + str(lib_dir)
67+
68+
69+
if inc_dir == None or lib_dir == None:
70+
print "libModSecurity was not found in your system."
71+
print "Make sure you have libModSecurity correctly installed in your system."
72+
sys.exit(1)
73+
74+
75+
#if os.path.isfile("modsecurity/_modsecurity_module.cc") == False:
76+
# print "Swig generated code was not found. Please run `make' first"
77+
# sys.exit(1)
78+
79+
80+
extension_mod = Extension(
81+
"_modsecurity", [
82+
"modsecurity/modsecurity_wrap.cxx"
83+
],
84+
libraries=["modsecurity"],
85+
swig_opts=['-Wextra', '-builtin'],
86+
library_dirs=[lib_dir],
87+
runtime_library_dirs=[lib_dir],
88+
include_dirs=[inc_dir, "."],
89+
extra_compile_args=["-std=c++11"]
90+
)
91+
92+
93+
setup(
94+
name = "modsecurity",
95+
description = 'Python Bindings for libModSecurity',
96+
author = 'Felipe Zimmerle',
97+
author_email = 'felipe@zimmerle.org',
98+
url = 'https://github.com/SpiderLabs/ModSecurity-Python-bindings',
99+
ext_modules = [extension_mod],
100+
packages = ['modsecurity'],
101+
classifiers = [
102+
'Topic :: Security',
103+
'Topic :: Internet :: WWW/HTTP'
104+
]
105+
)
106+
107+

tests/t.py

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#!/usr/bin/env python
2+
"""
3+
4+
ModSecurity, http://www.modsecurity.org/
5+
Copyright (c) 2015 Trustwave Holdings, Inc. (http://www.trustwave.com/)
6+
7+
You may not use this file except in compliance with
8+
the License. You may obtain a copy of the License at
9+
10+
http://www.apache.org/licenses/LICENSE-2.0
11+
12+
If any of the files related to licensing are missing or if you have any
13+
other questions related to licensing please contact Trustwave Holdings, Inc.
14+
directly using the email address security@modsecurity.org.
15+
16+
Author: Felipe "Zimmerle" Costa <fcosta at trustwave dot com>
17+
18+
"""
19+
20+
import sys
21+
import unittest
22+
23+
sys.path.append("..")
24+
sys.path.append(".")
25+
import modsecurity
26+
27+
28+
class TestStringMethods(unittest.TestCase):
29+
30+
def test_version(self):
31+
self.assertRegexpMatches(str(modsecurity.ModSecurity().whoAmI()), ".*ModSecurity.*")
32+
33+
def test_load_rules(self):
34+
rules = modsecurity.Rules()
35+
ret = rules.load('SecRule ARGS_POST|XML:/* "(\n|\r)" "id:1,deny,phase:2"')
36+
self.assertEqual(ret, 1)
37+
ret = rules.load("""
38+
SecRule ARGS_POST|XML:/* "(\n|\r)" "id:1,deny,phase:2"
39+
SecRule ARGS_POST|XML:/* "(\n|\r)" "id:2,deny,phase:2"
40+
""")
41+
self.assertEqual(ret, 2)
42+
ret = rules.getRulesForPhase(3)
43+
self.assertEqual(ret.size(), 3)
44+
45+
def test_load_bad_rules(self):
46+
rules = modsecurity.Rules()
47+
ret = rules.load('SecRule ARGS_POST|XML:/* "(\n|\r)" "deny,phase:2"')
48+
self.assertEqual(ret, -1)
49+
ret = rules.getParserError()
50+
self.assertRegexpMatches(ret, "Rules must have an ID.*")
51+
52+
if __name__ == '__main__':
53+
unittest.main()
54+

0 commit comments

Comments
 (0)