Completed
Push — master ( ac8e27...9493cd )
by -
01:40
created

NaxsiWhitelist.generate_from_nxlog()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1.125
Metric Value
dl 0
loc 3
ccs 1
cts 2
cp 0.5
rs 10
cc 1
crap 1.125
1 1
import re
2
3 1
from spike.model import db
4 1
from shlex import shlex
5
6 1
from spike.model.naxsi_rules import NaxsiRules
7 1
from flask import url_for
8
9 1
class NaxsiWhitelist(db.Model):
10 1
    __bind_key__ = 'rules'
11 1
    __tablename__ = 'naxsi_whitelist'
12
13 1
    id = db.Column(db.Integer, primary_key=True)
14 1
    wid = db.Column(db.String, nullable=False, unique=True)
15 1
    mz = db.Column(db.String(1024), nullable=False)
16 1
    negative = db.Column(db.Integer, nullable=False, server_default='0')
17 1
    active = db.Column(db.Integer, nullable=False, server_default='1')
18 1
    timestamp = db.Column(db.Integer, nullable=False)
19 1
    whitelistset = db.Column(db.String(1024), nullable=False)
20
21 1
    def __init__(self, wid='0', mz='', active=0, negative=0, whitelistset='', timestamp=0):
22
        self.wid = wid
23
        self.mz = mz
24
        self.active = active
25
        self.negative = negative
26
        self.whitelistset = whitelistset
27
        self.timestamp = timestamp
28
        self.warnings = []
29
        self.error = []
30
31 1
    def __str__(self):
32
        return 'BasicRule {}wl:{} "mz:{}";'.format('negative ' if self.negative else ' ', self.wid, self.mz)
33
34 1
    def __validate_id(self, wid):
35
        if not re.match(r':(\-?\d+,)\-?\d+', wid):
36
            self.error.append('Illegal character in the whitelist id.')
37
            return False
38
        self.wid = wid
39
        return True
40
41 1
    def __validate_mz(self, mz):
42
        # Borrow '__validate_matchzone' from naxsi_rules.py ?
43
        self.mz = mz
44
        return True
45
46 1
    def parse(self, str_wl):
47
        self.warnings = list()
48
        self.error = list()
49
50
        lexer = shlex(str_wl)
51
        lexer.whitespace_split = True
52
        split = list(iter(lexer.get_token, ''))
53
        print('VALUE: {}'.format(split))
54
55
        for piece in split:
56
            if piece == ';':
57
                continue
58
            elif piece.startswith(('"', "'")) and (piece[0] == piece[-1]):  # remove (double-)quotes
59
                piece = piece[1:-1]
60
61
            print('piece: {}'.format(piece))
62
63
            if piece == 'BasicRule':
64
                has_basicrule = True
0 ignored issues
show
Unused Code introduced by
The variable has_basicrule seems to be unused.
Loading history...
65
            elif piece.startswith('wl:'):
66
                self.__validate_id(piece[3:])
67
            elif piece.startswith('mz:'):
68
                self.__validate_mz(piece[3:])
69
            elif piece == 'negative':
70
                self.negative = True
71
            else:
72
                print('Unknown fragment: {}'.format(piece))
73
                self.error.append('Unknown fragment: {}'.format(piece))
74
                return False
75
76
        if 'BasicRule' not in split:
77
            self.error.append('No "BasicRule" keyword in {}'.format(str_wl))
78
            return False
79
80
        return True
81
82 1
    def explain(self):
83
        def __linkify_rule(rid):
84
            if NaxsiRules.query.filter(NaxsiRules.sid == self.wid).first() is None:
0 ignored issues
show
Bug introduced by
The Class NaxsiRules does not seem to have a member named query.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
85
                return rid
86
            return '<a href="{}">{}</a>'.format(url_for('rules.view', sid=rid), self.wid)
87
88
        if self.wid == '0':
89
            ret = 'Whitelist all rules'
90
        elif self.wid.isdigit():
91
            ret = 'Whitelist the rule {}'.format(__linkify_rule(self.wid))
92
        else:
93
            zones = list()
94
            for rid in self.wid.split(','):
95
                if rid.startswith('-'):
96
                    zones.append('except the rule {}'.format(__linkify_rule(self.wid)))
97
                else:
98
                    zones.append('the rule {}'.format(__linkify_rule(self.wid)))
99
            ret = 'Whitelist '+ ', '.join(zones)
100
101
        if not self.mz:
102
            return ret + '.'
103
104
        return ret + ' if matching in {}.'.format(self.mz)
105
106
107 1
    @staticmethod
108
    def generate_from_nxlog(nxlogs):
109
        return ''
110