Mercurial > farol > farol
annotate farol/main.py @ 18:d547b6a0038e
Add more and more error handling in the /new page.
author | Benoît Allard <benoit.allard@greenbone.net> |
---|---|
date | Tue, 30 Sep 2014 16:27:42 +0200 |
parents | deced0345829 |
children | 56cab60172ad |
rev | line source |
---|---|
0 | 1 # -*- encoding: utf-8 -*- |
2 # Description: | |
3 # Farol Web Application | |
4 # | |
5 # Authors: | |
6 # BenoƮt Allard <benoit.allard@greenbone.net> | |
7 # | |
8 # Copyright: | |
9 # Copyright (C) 2014 Greenbone Networks GmbH | |
10 # | |
11 # This program is free software; you can redistribute it and/or | |
12 # modify it under the terms of the GNU General Public License | |
13 # as published by the Free Software Foundation; either version 2 | |
14 # of the License, or (at your option) any later version. | |
15 # | |
16 # This program is distributed in the hope that it will be useful, | |
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 # GNU General Public License for more details. | |
20 # | |
21 # You should have received a copy of the GNU General Public License | |
22 # along with this program; if not, write to the Free Software | |
23 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
24 | |
25 import os | |
13
d5265a0da13a
Always log exceptions to file.
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
26 import logging |
d5265a0da13a
Always log exceptions to file.
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
27 from logging import FileHandler |
17
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
28 import urllib2 |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
29 from xml.etree import ElementTree as ET |
0 | 30 |
15
f8d51aaac8bc
Display sessionID in about page as well as various versions
Benoît Allard <benoit.allard@greenbone.net>
parents:
13
diff
changeset
|
31 import farolluz |
7
8f41bb7f4681
Move the Document management routines to a document Blueprint
Benoît Allard <benoit.allard@greenbone.net>
parents:
3
diff
changeset
|
32 from farolluz.cvrf import CVRF, ValidationError |
8f41bb7f4681
Move the Document management routines to a document Blueprint
Benoît Allard <benoit.allard@greenbone.net>
parents:
3
diff
changeset
|
33 from farolluz.parsers.cvrf import parse |
0 | 34 from farolluz.py2 import urlopen |
35 from farolluz.renderer import render as render_cvrf | |
36 from farolluz.utils import utcnow | |
37 | |
15
f8d51aaac8bc
Display sessionID in about page as well as various versions
Benoît Allard <benoit.allard@greenbone.net>
parents:
13
diff
changeset
|
38 import flask |
7
8f41bb7f4681
Move the Document management routines to a document Blueprint
Benoît Allard <benoit.allard@greenbone.net>
parents:
3
diff
changeset
|
39 from flask import Flask, request, render_template, redirect, url_for, flash |
0 | 40 from werkzeug import secure_filename |
41 | |
15
f8d51aaac8bc
Display sessionID in about page as well as various versions
Benoît Allard <benoit.allard@greenbone.net>
parents:
13
diff
changeset
|
42 from . import __version__, cache |
7
8f41bb7f4681
Move the Document management routines to a document Blueprint
Benoît Allard <benoit.allard@greenbone.net>
parents:
3
diff
changeset
|
43 from .document import document |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
44 from .session import get_current, set_current, has_current, document_required |
0 | 45 from .vulnerability import vulnerability |
46 from .producttree import producttree | |
47 | |
1
63b00c10ada8
Add Configuration support, warning when in DEBUG mode, and Deployment instruction
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
48 app = Flask(__name__, instance_relative_config=True) |
63b00c10ada8
Add Configuration support, warning when in DEBUG mode, and Deployment instruction
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
49 app.config.from_object('farol.config.Config') |
63b00c10ada8
Add Configuration support, warning when in DEBUG mode, and Deployment instruction
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
50 app.config.from_pyfile('farol.cfg', silent=True) |
0 | 51 |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
52 app.register_blueprint(cache.mod, url_prefix='/cache') |
7
8f41bb7f4681
Move the Document management routines to a document Blueprint
Benoît Allard <benoit.allard@greenbone.net>
parents:
3
diff
changeset
|
53 app.register_blueprint(document, url_prefix='/document') |
0 | 54 app.register_blueprint(vulnerability, url_prefix='/vulnerability') |
55 app.register_blueprint(producttree, url_prefix='/producttree') | |
56 | |
13
d5265a0da13a
Always log exceptions to file.
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
57 file_handler = FileHandler(os.path.join(app.instance_path, 'farol.log')) |
d5265a0da13a
Always log exceptions to file.
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
58 file_handler.setLevel(logging.WARNING) |
d5265a0da13a
Always log exceptions to file.
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
59 app.logger.addHandler(file_handler) |
3
3478e20885fd
Add a ReverseProxy and fix the cache path everywhere
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
60 |
0 | 61 @app.context_processor |
62 def cache_content(): | |
63 """ List the documents in cache """ | |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
64 return dict(caching=cache.caching_type(), |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
65 cache=cache.cache_content()) |
0 | 66 |
67 @app.context_processor | |
68 def doc_properties(): | |
69 if not has_current(): | |
70 return {'has_current': False} | |
71 cvrf = get_current() | |
72 vulns = [(v.getTitle(), v._ordinal) for v in cvrf._vulnerabilities] | |
73 prods = [] | |
74 if cvrf._producttree: | |
75 prods = [(p._name, p._productid) for p in cvrf._producttree._products] | |
76 try: | |
77 cvrf.validate() | |
78 error = None | |
79 except ValidationError as ve: | |
80 error = ve | |
81 return dict(has_current=True, vulnerabilities=vulns, products=prods, error=error) | |
82 | |
83 @app.template_filter('secure_filename') | |
84 def makeId(string): | |
85 return secure_filename(string) | |
86 | |
7
8f41bb7f4681
Move the Document management routines to a document Blueprint
Benoît Allard <benoit.allard@greenbone.net>
parents:
3
diff
changeset
|
87 @app.route('/') |
8f41bb7f4681
Move the Document management routines to a document Blueprint
Benoît Allard <benoit.allard@greenbone.net>
parents:
3
diff
changeset
|
88 def welcome(): |
8f41bb7f4681
Move the Document management routines to a document Blueprint
Benoît Allard <benoit.allard@greenbone.net>
parents:
3
diff
changeset
|
89 return render_template('welcome.j2') |
8f41bb7f4681
Move the Document management routines to a document Blueprint
Benoît Allard <benoit.allard@greenbone.net>
parents:
3
diff
changeset
|
90 |
17
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
91 def set_url(url): |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
92 try: content = urlopen(url).read() |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
93 except urllib2.HTTPError as e: |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
94 flash('Unable to retrieve %s: %s' % (url, e)) |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
95 return |
18
d547b6a0038e
Add more and more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
96 set_text(content) |
17
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
97 |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
98 def set_RHSA(id_): |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
99 # validate input |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
100 if ':' not in id_: |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
101 flash('Wrong RHSA id: %s' % id_) |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
102 return |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
103 year, index = id_.split(':', 1) |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
104 try: |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
105 int(year) |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
106 int(index) |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
107 except ValueError: |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
108 flash('Wrong RHSA id: %s' % id_) |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
109 return |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
110 # Process it |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
111 set_url("https://www.redhat.com/security/data/cvrf/%(year)s/cvrf-rhsa-%(year)s-%(index)s.xml" % {'year': year, 'index': index}) |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
112 |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
113 def set_oracle(id_): |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
114 try: int(id_) |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
115 except ValueError: |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
116 flash('Wrong Oracle id: %s' % id_) |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
117 return |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
118 set_url("http://www.oracle.com/ocom/groups/public/@otn/documents/webcontent/%s.xml" % id_) |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
119 |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
120 def set_cisco(id_): |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
121 if id_.count('-') < 2: |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
122 flash('Wrong cisco id: %s' % id_) |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
123 return |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
124 kind, date, name = id_.split('-', 2) |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
125 try: kind = {'sa': 'Advisory', 'sr': 'Response'}[kind] |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
126 except KeyError: |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
127 flash('Wrong cisco id: %s' % id_) |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
128 return |
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
129 set_url("http://tools.cisco.com/security/center/contentxml/CiscoSecurity%(kind)s/cisco-%(id)s/cvrf/cisco-%(id)s_cvrf.xml" % {'kind': kind, 'id': id_}) |
8
2ce3676c9b2e
Ease the import of new documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
7
diff
changeset
|
130 |
18
d547b6a0038e
Add more and more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
131 def set_text(text): |
d547b6a0038e
Add more and more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
132 try: doc = parse(content) |
d547b6a0038e
Add more and more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
133 except ET.ParseError as e: |
d547b6a0038e
Add more and more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
134 flash('Unable to parse %s: %s' % (url, e)) |
d547b6a0038e
Add more and more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
135 return |
d547b6a0038e
Add more and more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
136 set_current(doc) |
d547b6a0038e
Add more and more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
137 |
0 | 138 @app.route('/new', methods=['GET', 'POST']) |
139 def new(): | |
140 if request.method != 'POST': | |
141 return render_template('new.j2', has_document=has_current(), now=utcnow()) | |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
142 |
8
2ce3676c9b2e
Ease the import of new documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
7
diff
changeset
|
143 if 'rhsa' in request.form: |
17
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
144 set_RHSA(request.form['id']) |
8
2ce3676c9b2e
Ease the import of new documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
7
diff
changeset
|
145 elif 'oracle' in request.form: |
17
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
146 set_oracle(request.form['id']) |
8
2ce3676c9b2e
Ease the import of new documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
7
diff
changeset
|
147 elif 'cisco' in request.form: |
17
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
148 set_cisco(request.form['id']) |
8
2ce3676c9b2e
Ease the import of new documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
7
diff
changeset
|
149 elif 'nasl' in request.form: |
2ce3676c9b2e
Ease the import of new documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
7
diff
changeset
|
150 flash("I'm not able to parse NASL scripts yet", 'danger') |
2ce3676c9b2e
Ease the import of new documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
7
diff
changeset
|
151 return redirect(url_for('new')) |
2ce3676c9b2e
Ease the import of new documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
7
diff
changeset
|
152 elif 'url' in request.form: |
17
deced0345829
Add more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
15
diff
changeset
|
153 set_url(request.form['url']) |
0 | 154 elif 'local' in request.files: |
155 upload = request.files['local'] | |
156 if not upload.filename.endswith('.xml'): | |
157 flash('Uploaded files should end in .xml', 'danger') | |
158 return redirect(url_for('new')) | |
18
d547b6a0038e
Add more and more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
159 fpath = os.path.join(app.instance_path, 'tmp', |
d547b6a0038e
Add more and more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
160 secure_filename(upload.filename)) |
0 | 161 upload.save(fpath) |
162 with open(fpath, 'rt') as f: | |
18
d547b6a0038e
Add more and more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
163 set_text(f.read()) |
0 | 164 os.remove(fpath) |
165 elif 'text' in request.form: | |
18
d547b6a0038e
Add more and more error handling in the /new page.
Benoît Allard <benoit.allard@greenbone.net>
parents:
17
diff
changeset
|
166 set_text(request.form['text'].encode('utf-8')) |
0 | 167 else: |
168 set_current(CVRF(request.form['title'], request.form['type'])) | |
7
8f41bb7f4681
Move the Document management routines to a document Blueprint
Benoît Allard <benoit.allard@greenbone.net>
parents:
3
diff
changeset
|
169 return redirect(url_for('document.view')) |
0 | 170 |
171 @app.route('/render/<format_>') | |
172 @document_required | |
173 def render(format_): | |
174 cvrf = get_current() | |
175 doc = render_cvrf(cvrf, format_ + '.j2') | |
176 return render_template('render.j2', format_=format_, title=cvrf._title, type_=cvrf._type, doc=doc ) | |
177 | |
178 @app.route('/about') | |
179 def about(): | |
15
f8d51aaac8bc
Display sessionID in about page as well as various versions
Benoît Allard <benoit.allard@greenbone.net>
parents:
13
diff
changeset
|
180 versions = (('farol', __version__), ('farolluz', farolluz.__version__), ('flask', flask.__version__)) |
f8d51aaac8bc
Display sessionID in about page as well as various versions
Benoît Allard <benoit.allard@greenbone.net>
parents:
13
diff
changeset
|
181 return render_template('about.j2', instance_dir=app.instance_path, versions=versions) |
0 | 182 |