Completed
Push — master ( 10e778...0dd3b0 )
by -
01:51
created

explain_rule()   F

Complexity

Conditions 12

Size

Total Lines 42

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 32
CRAP Score 12.0906

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 12
c 1
b 0
f 0
dl 0
loc 42
ccs 32
cts 35
cp 0.9143
crap 12.0906
rs 2.7855

How to fix   Complexity   

Complexity

Complex classes like explain_rule() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1 1
try:
2 1
    from urlparse import parse_qs
3
except ImportError:  # python3
4
    from urllib.parse import parse_qs
5
6 1
from flask import Blueprint, render_template, request, redirect, flash, url_for
7
8 1
from spike.model.naxsi_rules import NaxsiRules
9 1
from spike.model.naxsi_whitelist import NaxsiWhitelist
10
11 1
sandbox = Blueprint('sandbox', __name__)
12
13
14 1
@sandbox.route("/", methods=["GET"])
15
def index():
16 1
    return render_template("misc/sandbox.html")
17
18
19 1
@sandbox.route("/explain_rule/", methods=["GET", "POST"])
20
def explain_rule():
21 1
    errors = warnings = list()
22 1
    rule_get = request.args.get('rule', '')
23 1
    rule_post = request.form.get("rule", '')
24 1
    if rule_get.isdigit():  # explain a rule by id
25 1
        _rule = NaxsiRules.query.filter(NaxsiRules.sid == rule_get).first()
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...
26 1
        if _rule is None:
27 1
            flash('Not rule with id %s' % rule_get)
28 1
            return redirect(url_for("sandbox.index"))
29 1
    elif rule_get is not '':
30 1
        flash('Please provide a numeric id')
31 1
        return redirect(url_for("sandbox.index"))
32 1
    elif not rule_post:
33 1
        flash('Please provide a rule')
34 1
        return redirect(url_for("sandbox.index"))
35
    else:
36 1
        _rule = NaxsiRules()
37 1
        errors, warnings, rdict = _rule.parse_rule(rule_post)
38 1
        _rule = NaxsiRules()
39 1
        _rule.from_dict(rdict)
40 1
        _rule.errors = errors
41 1
        _rule.warnings = warnings
42
43 1
        if _rule.errors:
44 1
            flash('You rule is wrong', 'error')
45 1
            return render_template("misc/sandbox.html")
46
47 1
    if 'visualise_rule' in request.form:
48 1
        if _rule.detection.startswith('rx:'):
49
            return redirect('https://regexper.com/#' + _rule.detection[3:])
50
        else:
51 1
            flash('The rule is not a regexp, so you can not visualize it.', category='error')
52
53 1
    if errors:
54
        for error in errors:
55
            flash(error, category='error')
56 1
    if warnings:
57 1
        for warnings in warnings:
58 1
            flash(warnings, category='warning')
59
60 1
    return render_template("misc/sandbox.html", rule_explaination=_rule.explain(), rule=_rule)
61
62
63 1
@sandbox.route("/explain_whitelist/", methods=["GET", "POST"])
64
def explain_whitelist():
65 1
    whitelist_get = request.args.get('whitelist', '')
66 1
    whitelist_post = request.form.get('whitelist', '')
67 1
    if whitelist_get.isdigit():  # explain a whitelist by id
68 1
        _wlist = NaxsiWhitelist.query.filter(NaxsiWhitelist.id == whitelist_get).first()
0 ignored issues
show
Bug introduced by
The Class NaxsiWhitelist 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...
69 1
        if _wlist is None:
70 1
            flash('Not rule with id %s' % whitelist_get)
71 1
            return redirect(url_for("sandbox.index"))
72 1
    elif whitelist_get is not '':
73 1
        flash('Please provide a numeric id')
74 1
        return redirect(url_for("sandbox.index"))
75 1
    elif not whitelist_post:
76 1
        flash('Please provide a whitelist')
77 1
        return redirect(url_for("sandbox.index"))
78
    else:
79 1
        _wlist = NaxsiWhitelist()
80 1
        _wlist.parse(whitelist_post)
81
82 1
    if hasattr(_wlist, 'error'):
83 1
        for error in _wlist.error:
84 1
            flash(error, category='error')
85 1
    if hasattr(_wlist, 'warning'):
86
        for warnings in _wlist.warnings:
87
            flash(warnings, category='warning')
88
89 1
    return render_template("misc/sandbox.html", whitelist_explaination=_wlist.explain(), whitelist=_wlist)
90
91
92 1
@sandbox.route('/explain_nxlog/', methods=["POST"])
93
def explain_nxlog():
94 1
    nxlog = request.form.get("nxlog", '')
95 1
    if not nxlog:
96 1
        return redirect(url_for("sandbox.index"))
97
98 1
    start = nxlog.find("ip=")
99 1
    if start < 0:
100 1
        flash('{} is an invalid extlog, string "ip=" not found.'.format(nxlog))
101 1
        return redirect(url_for("sandbox.index"))
102
103 1
    end = nxlog.find(", ")
104 1
    if end < 0:
105 1
        flash('{} is an invalid extlog, string "," not found.'.format(nxlog))
106 1
        return redirect(url_for("sandbox.index"))
107
108
    # Flatten the dict, since parse_qs is a bit annoying
109 1
    nxdic = parse_qs(nxlog[start:end])
110 1
    for key, value in nxdic.items():
111 1
        nxdic[key] = value[0]
112
113 1
    explain = "Peer <strong>{}</strong> performed a request to <strong>{}</strong> on URI <strong>{}</strong> ".format(
114
        nxdic['ip'], nxdic['server'], nxdic['uri'])
115
116 1
    scores = list()
117 1
    cpt = 0
118 1
    while "cscore{}".format(cpt) in nxdic:
119 1 View Code Duplication
        cscore = "cscore{}".format(cpt)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
120 1
        score = "score{}".format(cpt)
121 1
        scores.append("that reached a <strong>{}</strong> score of <strong>{}</strong> ".format(
122
            nxdic[cscore], nxdic[score]))
123 1
        cpt += 1
124 1
    explain += ' and '.join(scores)
125
126 1
    cpt = 0
127 1
    named = list()
128 1
    while "id{}".format(cpt) in nxdic:
129 1
        _id = "id{}".format(cpt)
130 1
        _var_name = "var_name{}".format(cpt)
131 1
        _zone = "zone{}".format(cpt)
132 1
        if "var_name{}".format(cpt) in nxdic:
133 1
            named.append("id <strong>{}</strong> in var named <strong>{}</strong> of zone <strong>{}</strong>".format(
134
                nxdic[_id], nxdic[_var_name], nxdic[_zone]))
135
        else:
136
            named.append("id <strong>{}</strong> in zone <strong>{}</strong>".format(nxdic[_id], nxdic[_zone]))
137 1
        cpt += 1
138 1
    explain += ' and '.join(named)
139
140
    return render_template("misc/sandbox.html", nxlog_explaination=explain, nxlog=nxlog)
141