Passed
Push — master ( 15105e...92a3e4 )
by -
01:34
created

FlaskrTestCase.__delete_rule()   A

Complexity

Conditions 3

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 3.3332
Metric Value
cc 3
dl 0
loc 6
ccs 4
cts 6
cp 0.6667
crap 3.3332
rs 9.4285
1 1
from time import strftime, localtime
2 1
import re
3
4 1
from sqlalchemy.orm.exc import UnmappedInstanceError
0 ignored issues
show
Configuration introduced by
The import sqlalchemy.orm.exc could not be resolved.

This can be caused by one of the following:

1. Missing Dependencies

This error could indicate a configuration issue of Pylint. Make sure that your libraries are available by adding the necessary commands.

# .scrutinizer.yml
before_commands:
    - sudo pip install abc # Python2
    - sudo pip3 install abc # Python3
Tip: We are currently not using virtualenv to run pylint, when installing your modules make sure to use the command for the correct version.

2. Missing __init__.py files

This error could also result from missing __init__.py files in your module folders. Make sure that you place one file in each sub-folder.

Loading history...
5
6 1
from spike import create_app
7 1
from spike.model import db
8 1
from spike.model.naxsi_rules import NaxsiRules
9 1
import unittest
10
11
12 1
class FlaskrTestCase(unittest.TestCase):
13 1
    def setUp(self):
14 1
        app = create_app()
15 1
        db.init_app(app)
16 1
        app.config['TESTING'] = True
17 1
        self.app = app.test_client()
18
19 1
    def tearDown(self):
20 1
        pass
21
22 1
    def __create_rule(self):
23
        """
24
25
        :return int: The id of the new rule
26
        """
27 1
        current_sid = NaxsiRules.query.order_by(NaxsiRules.sid.desc()).first()
28 1
        current_sid = 1337 if current_sid is None else current_sid.sid + 1
29
30 1
        db.session.add(NaxsiRules(u'POUET', 'str:test', u'BODY', u'$SQL:8', current_sid, u'web_server.rules',
31
                                  u'f hqewifueiwf hueiwhf uiewh fiewh fhw', '1', True, 1457101045))
32 1
        self.sid_to_delete = current_sid
0 ignored issues
show
Coding Style introduced by
The attribute sid_to_delete was defined outside __init__.

It is generally a good practice to initialize all attributes to default values in the __init__ method:

class Foo:
    def __init__(self, x=None):
        self.x = x
Loading history...
33 1
        return current_sid
34
35 1
    def __delete_rule(self, sid=None):
36 1
        sid = self.sid_to_delete if sid is None else sid
37 1
        try:
38 1
            db.session.delete(NaxsiRules.query.filter(sid == NaxsiRules.sid).first())
39
        except UnmappedInstanceError:  # who cares ?
0 ignored issues
show
Unused Code introduced by
This except handler seems to be unused and could be removed.

Except handlers which only contain pass and do not have an else clause can usually simply be removed:

try:
    raises_exception()
except:  # Could be removed
    pass
Loading history...
40
            pass
41
42 1
    def test_index(self):
43 1
        rv = self.app.get('/', follow_redirects=True)
44 1
        self.assertEqual(rv.status_code, 200)
45 1
        self.assertIn('<title>SPIKE! - WAF Rules Builder</title>', rv.data)
46 1
        self.assertTrue(re.search(r'<h2>Naxsi - Rules \( \d+ \)</h2>', rv.data) is not None)
47
48 1
    def test_new_rule(self):
49 1
        data = {
50
            'msg': 'this is a test message',
51
            'detection': 'DETECTION',
52
            'mz': 'BODY',
53
            'custom_mz_val': '',
54
            'negative': 'checked',
55
            'score_$SQL': 8,
56
            'score': '$SQL',
57
            'rmks': 'this is a test remark',
58
            'ruleset': 'scanner.rules'
59
        }
60 1
        rv = self.app.post('/rules/new', data=data, follow_redirects=True)
61 1
        _rule = NaxsiRules.query.order_by(NaxsiRules.sid.desc()).first()
62
63 1
        self.assertIn(('<li> - OK: created %d : %s</li>' % (_rule.sid, _rule.msg)), rv.data)
64 1
        self.assertEqual(_rule.msg, data['msg'])
65 1
        self.assertEqual(_rule.detection, 'str:' + data['detection'])
66 1
        self.assertEqual(_rule.mz, data['mz'])
67 1
        self.assertEqual(_rule.score, data['score'] + ':' + str(data['score_$SQL']))
68 1
        self.assertEqual(_rule.rmks, data['rmks'])
69 1
        self.assertEqual(_rule.ruleset, data['ruleset'])
70
71 1
        rv = self.app.get('/rules/new')
72 1
        self.assertEqual(rv.status_code, 200)
73
74 1
        self.__delete_rule(_rule.sid)
75
76 1
    def test_del_rule(self):
77 1
        old_sid = self.__create_rule()
78
79 1
        db.session.add(NaxsiRules(u'POUET', 'str:test', u'BODY', u'$SQL:8', old_sid + 1, u'web_server.rules',
80
                                  u'f hqewifueiwf hueiwhf uiewh fiewh fhw', '1', True, 1457101045))
81 1
        rv = self.app.get('/rules/del/%d' % (old_sid + 1))
82 1
        self.assertEqual(rv.status_code, 302)
83
84 1
        _rule = NaxsiRules.query.order_by(NaxsiRules.sid.desc()).first()
85 1
        self.assertEqual(_rule.sid, old_sid)
86
87 1
        rv = self.app.get('/rules/del/%d' % (_rule.sid + 1))
88 1
        self.assertEqual(rv.status_code, 302)
89
90 1
        self.__delete_rule()
91
92 1
    def test_plain_rule(self):
93 1
        self.__create_rule()
94
95 1
        _rule = NaxsiRules.query.order_by(NaxsiRules.sid.desc()).first()
96 1
        rv = self.app.get('/rules/plain/%d' % _rule.sid)
97 1
        self.assertEqual(rv.status_code, 200)
98 1
        rdate = strftime("%F - %H:%M", localtime(float(str(_rule.timestamp))))
99 1
        rmks = "# ".join(_rule.rmks.strip().split("\n"))
100 1
        detect = _rule.detection.lower() if _rule.detection.startswith("str:") else _rule.detection
101 1
        negate = 'negative' if _rule.negative == 1 else ''
102 1
        expected = """
103
#
104
# sid: %s | date: %s
105
#
106
# %s
107
#
108
MainRule %s "%s" "msg:%s" "mz:%s" "s:%s" id:%s ;
109
110
""" % (_rule.sid, rdate, rmks, negate, detect, _rule.msg, _rule.mz, _rule.score, _rule.sid)
111 1
        self.assertEqual(expected, rv.data)
112
113 1
        rv = self.app.get('/rules/plain/%d' % (_rule.sid + 1))
114 1
        self.assertEqual(rv.status_code, 302)
115
116 1
        self.__delete_rule()
117
118 1
    def test_deact_rule(self):
119 1
        rv = self.app.get('/rules/deact/')
120 1
        self.assertEqual(rv.status_code, 404)
121
122 1
        last_insert = self.__create_rule()
123 1
        non_existent_sid = last_insert + 1
124
125 1
        rv = self.app.get('/rules/deact/%d' % last_insert)  # deactivate
126 1
        self.assertEqual(rv.status_code, 200)
127 1
        _rule = NaxsiRules.query.filter(NaxsiRules.sid == last_insert).first()
128 1
        self.assertEqual(_rule.active, 0)
129
130 1
        rv = self.app.get('/rules/deact/%d' % last_insert)  # activate
131 1
        self.assertEqual(rv.status_code, 200)
132 1
        _rule = NaxsiRules.query.filter(NaxsiRules.sid == last_insert).first()
133 1
        self.assertEqual(_rule.active, 1)
134
135 1
        rv = self.app.get('/rules/deact/%d' % non_existent_sid)
136 1
        self.assertEqual(rv.status_code, 302)
137
138
139 1
        self.__delete_rule()
140
141 1
    def test_search_rule(self):
142
143 1
        self.__create_rule()
144 1
        rv = self.app.get('/rules/search/')
145 1
        self.assertEqual(rv.status_code, 302)
146
147 1
        rv = self.app.get('/rules/search/?s=a')
148 1
        self.assertEqual(rv.status_code, 302)
149
150 1
        rv = self.app.get('/rules/search/?s="OR 1=1;--')
151 1
        self.assertEqual(rv.status_code, 200)
152 1
        self.assertIn('<input type="text" name="s" size="20" value="&#34;OR 1=1;--"', rv.data)
153 1
        self.assertIn('<p><strong>Search: OR 11--</strong></p>', rv.data)  # filtered data
154
155 1
        rv = self.app.get('/rules/search/?s=1337')  # get rule by id
156 1
        self.assertEqual(rv.status_code, 200)
157
158 1
        self.__delete_rule()
159
160 1
    def test_edit_rule(self):
161 1
        non_nxistent_sid = self.__create_rule() + 1
162 1
        rv = self.app.get('/rules/edit/%d' % non_nxistent_sid)
163 1
        self.assertEqual(rv.status_code, 302)
164
165
        self.__delete_rule()
166