Completed
Push — master ( a06268...76dac0 )
by -
01:27
created

plain()   A

Complexity

Conditions 2

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2.1481
Metric Value
cc 2
dl 0
loc 7
ccs 4
cts 6
cp 0.6667
crap 2.1481
rs 9.4285
1 1
import logging
2 1
import re
3 1
import string
4
5 1
from time import time
6 1
from flask import Blueprint, render_template, request, redirect, flash, Response
7 1
from sqlalchemy.exc import SQLAlchemyError
0 ignored issues
show
Configuration introduced by
The import sqlalchemy.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...
8
9 1
from spike.model import db
10 1
from spike.model.naxsi_rules import NaxsiRules
11 1
from spike.model.naxsi_rulesets import NaxsiRuleSets
12 1
from spike.model import naxsi_mz, naxsi_score
13
14 1
rules = Blueprint('rules', __name__)
15
16
17 1
@rules.route("/")
18
def index():
19 1
    _rules = NaxsiRules.query.order_by(NaxsiRules.sid.desc()).all()
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...
20 1
    if not _rules:
21
        flash("no rules found, please create one", "success")
22
        return redirect("/rules/new")
23 1
    return render_template("rules/index.html", rules=_rules)
24
25
26 1
@rules.route("/plain/<int:sid>", methods=["GET"])
27
def plain(sid):
28 1
    _rule = NaxsiRules.query.filter(NaxsiRules.sid == sid).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...
29 1
    if not _rule:
30
        flash("no rules found, please create one", "error")
31
        return redirect("/rules/new")
32 1
    return Response(_rule.fullstr(), mimetype='text/plain')
33
34
35 1
@rules.route("/view/<int:sid>", methods=["GET"])
36
def view(sid):
37 1
    _rule = NaxsiRules.query.filter(NaxsiRules.sid == sid).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...
38 1
    if _rule is None:
39 1
        flash("no rules found, please create one", "error")
40 1
        return redirect("/rules/")
41
42 1
    return render_template("rules/view.html", rule=_rule, rtext=_rule)
43
44
45 1
@rules.route("/search/", methods=["GET"])
46
def search():
47 1
    terms = request.args.get('s', '')
48
49 1
    if len(terms) < 2:
50 1
        return redirect('/rules')
51
52
    # No fancy injections
53 1
    whitelist = set(string.ascii_letters + string.digits + ':-_ ')
54 1
    filtered = ''.join(filter(whitelist.__contains__, terms))
55
56 1
    if filtered.isdigit():  # get rule by id
57 1
        _rules = db.session.query(NaxsiRules).filter(NaxsiRules.sid == int(filtered)).all()
58
    else:
59 1
        expression = '%' + filtered + '%'
60 1
        _rules = db.session.query(NaxsiRules).filter(
61
            db.or_(
62
                NaxsiRules.msg.like(expression),
63
                NaxsiRules.rmks.like(expression),
64
                NaxsiRules.detection.like(expression)
65
            )
66
        ).order_by(NaxsiRules.sid.desc()).all()
67 1
    return render_template("rules/index.html", rules=_rules, selection="Search: %s" % filtered, lsearch=terms)
68
69
70 1
@rules.route("/new", methods=["GET", "POST"])
71
def new():
72 1
    latest_sid = NaxsiRules.query.order_by(NaxsiRules.sid.desc()).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...
73 1
    if latest_sid is None:
74
        sid = 200001
75
    else:
76 1
        sid = latest_sid.sid + 1
77
78 1
    if request.method == "GET":
79 1
        _rulesets = NaxsiRuleSets.query.all()
0 ignored issues
show
Bug introduced by
The Class NaxsiRuleSets 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...
80 1
        return render_template("rules/new.html", mz=naxsi_mz, rulesets=_rulesets, score=naxsi_score, latestn=sid)
81
82
    # create new rule
83 1
    logging.debug('Posted new request: %s', request.form)
84 1
    mz = "|".join(filter(len, request.form.getlist("mz") + request.form.getlist("custom_mz_val")))
85
86 1
    score = request.form.get("score", "")
87 1
    score += ':'
88 1
    score += request.form.get("score_%s" % request.form.get("score", ""), "")
89
90 1
    nrule = NaxsiRules(request.form.get("msg", ""), request.form.get("detection", ""), mz, score, sid,
91
                       request.form.get("ruleset", ""), request.form.get("rmks", ""), "1",
92
                       request.form.get("negative", "") == 'checked', int(time()))
93
94 1
    nrule.validate()
95
96 1
    if nrule.error:
97 1
        flash("ERROR: {0}".format(",".join(nrule.error)))
98 1
        return redirect("/rules/new")
99 1
    elif nrule.warnings:
100 1
        flash("WARNINGS: {0}".format(",".join(nrule.warnings)))
101 1
    db.session.add(nrule)
102
103 1
    try:
104 1
        db.session.commit()
105 1
        flash("OK: created %s : %s" % (sid, request.form.get("msg", "")), "success")
106 1
        return redirect("/rules/edit/%s" % sid)
107
    except SQLAlchemyError:
108
        flash("ERROR while trying to create %s : %s" % (sid, request.form.get("msg", "")), "error")
109
110
    return redirect("/rules/new")
111
112
113 1
@rules.route("/edit/<int:sid>", methods=["GET", "POST"])
114
def edit(sid):
115 1
    rinfo = NaxsiRules.query.filter(NaxsiRules.sid == sid).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...
116 1
    if not rinfo:
117 1
        return redirect("/rules/")
118
119 1
    _rulesets = NaxsiRuleSets.query.all()
0 ignored issues
show
Bug introduced by
The Class NaxsiRuleSets 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...
120 1
    rruleset = NaxsiRuleSets.query.filter(NaxsiRuleSets.name == rinfo.ruleset).first()
0 ignored issues
show
Bug introduced by
The Class NaxsiRuleSets 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...
121 1
    custom_mz = ""
122 1
    mz_check = rinfo.mz
123 1
    if re.search(r"^\$[A-Z]+:(.*)\|[A-Z]+", mz_check):
124
        custom_mz = mz_check
125
        rinfo.mz = "custom"
126 1
    return render_template("rules/edit.html", mz=naxsi_mz, rulesets=_rulesets, score=naxsi_score, rules_info=rinfo,
127
                           rule_ruleset=rruleset, custom_mz=custom_mz)
128
129
130 1
@rules.route("/save/<int:sid>", methods=["POST"])
131
def save(sid):
132 1
    mz = "|".join(filter(len, request.form.getlist("mz") + request.form.getlist("custom_mz_val")))
133 1
    score = "{}:{}".format(request.form.get("score", ""), request.form.get("score_%s" % request.form.get("score", "")))
134 1
    nrule = NaxsiRules.query.filter(NaxsiRules.sid == sid).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...
135 1
    nrule.msg = request.form.get("msg", "")
136 1
    nrule.detection = request.form.get("detection", "")
137 1
    nrule.mz = mz
138 1
    nrule.score = score
139 1
    nrule.ruleset = request.form.get("ruleset", "")
140 1
    nrule.rmks = request.form.get("rmks", "")
141 1
    nrule.active = request.form.get("active", "")
142 1
    nrule.negative = request.form.get("negative", "") == 'checked'
143 1
    nrule.timestamp = int(time())
144 1
    nrule.validate()
145
146 1
    if nrule.error:
147 1
        logging.debug("ERROR: %s", ",".join(nrule.error))
148 1
        flash("ERROR: {0}".format(",".join(nrule.error)))
149 1
        return redirect("/rules/edit/%s" % sid)
150 1
    elif nrule.warnings:
151 1
        logging.debug("WARNINGS: %s", ",".join(nrule.warnings))
152 1
        flash("WARNINGS: {0}".format(",".join(nrule.warnings)))
153
154 1
    db.session.add(nrule)
155 1
    try:
156 1
        db.session.commit()
157
    except SQLAlchemyError:
158
        flash("ERROR while trying to update %s : %s" % (sid, nrule.error), "error")
159 1
    return redirect("/rules/edit/%s" % sid)
160
161
162 1
@rules.route("/del/<int:sid>", methods=["GET"])
163 1
def del_sid(sid=''):
164 1
    nrule = NaxsiRules.query.filter(NaxsiRules.sid == sid).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...
165 1
    if not nrule:
166
        return redirect("/rules/")
167
168 1
    db.session.delete(nrule)
169 1
    try:
170 1
        db.session.commit()
171 1
        flash("OK: deleted %s : %s" % (sid, nrule.msg), "success")
172
    except SQLAlchemyError:
173
        flash("ERROR while trying to update %s : %s" % (sid, nrule.msg), "error")
174
175 1
    return redirect("/rules/")
176
177
178 1
@rules.route("/deact/<int:sid>", methods=["GET"])
179
def deact(sid):
180 1
    nrule = NaxsiRules.query.filter(NaxsiRules.sid == sid).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...
181 1
    if nrule is None:
182 1
        return redirect("/rules/")
183
184 1
    fm = 'deactivate' if nrule.active else 'reactivate'
185 1
    nrule.active = not nrule.active
186
187 1
    db.session.add(nrule)
188 1
    try:
189 1
        db.session.commit()
190 1
        flash("OK: %s %sd : %s" % (fm, sid, nrule.msg), "success")
191
    except SQLAlchemyError:
192
        flash("ERROR while trying to %s %s : %s" % (fm, sid, nrule.msg), "error")
193
194 1
    _rulesets = NaxsiRuleSets.query.all()
0 ignored issues
show
Bug introduced by
The Class NaxsiRuleSets 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...
195
    return render_template("rules/edit.html", mz=naxsi_mz, rulesets=_rulesets, score=naxsi_score, rules_info=nrule)
196