| 1 | 1 |  | from time import strftime, localtime | 
            
                                                                                                            
                            
            
                                    
            
            
                | 2 | 1 |  | import re | 
            
                                                                                                            
                            
            
                                    
            
            
                | 3 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 4 | 1 |  | from sqlalchemy.orm.exc import UnmappedInstanceError | 
                            
                    |  |  |  | 
                                                                                        
                                                                                     | 
            
                                                                                                            
                            
            
                                    
            
            
                | 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 | 
                            
                    |  |  |  | 
                                                                                        
                                                                                     | 
            
                                                                                                            
                            
            
                                    
            
            
                | 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 | 1 |  |         except UnmappedInstanceError:  # who cares ? | 
                            
                    |  |  |  | 
                                                                                        
                                                                                     | 
            
                                                                                                            
                            
            
                                    
            
            
                | 40 | 1 |  |             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 | 1 |  |         self.__create_rule() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 122 | 1 |  |         non_existent_sid = NaxsiRules.query.order_by(NaxsiRules.sid.desc()).first().sid + 1 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 123 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 124 | 1 |  |         rv = self.app.get('/rules/deact/%d' % non_existent_sid) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 125 | 1 |  |         self.assertEqual(rv.status_code, 302) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 126 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 127 | 1 |  |         self.__delete_rule() | 
            
                                                                                                            
                            
            
                                    
            
            
                | 128 |  |  |  | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 129 |  |  |  | 
            
                                                        
            
                                    
            
            
                | 130 |  |  |  | 
            
                        
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.
2. Missing __init__.py files
This error could also result from missing
__init__.pyfiles in your module folders. Make sure that you place one file in each sub-folder.