benoit@58: # -*- encoding: utf-8 -*- benoit@58: # Description: benoit@58: # Common controller Web stuffs benoit@58: # benoit@58: # Authors: benoit@58: # BenoƮt Allard benoit@58: # benoit@58: # Copyright: benoit@58: # Copyright (C) 2014 Greenbone Networks GmbH benoit@58: # benoit@58: # This program is free software; you can redistribute it and/or benoit@58: # modify it under the terms of the GNU General Public License benoit@58: # as published by the Free Software Foundation; either version 2 benoit@58: # of the License, or (at your option) any later version. benoit@58: # benoit@58: # This program is distributed in the hope that it will be useful, benoit@58: # but WITHOUT ANY WARRANTY; without even the implied warranty of benoit@58: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the benoit@58: # GNU General Public License for more details. benoit@58: # benoit@58: # You should have received a copy of the GNU General Public License benoit@58: # along with this program; if not, write to the Free Software benoit@58: # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. benoit@58: benoit@58: """\ benoit@58: Some common routines for handling of Notes, Acknowledgments and Reference that benoit@58: is shared for the Document and the Vulnerabilities. benoit@58: """ benoit@58: benoit@100: import re benoit@100: from datetime import datetime, timedelta benoit@100: benoit@100: try: benoit@100: from datetime import timezone benoit@100: except ImportError: benoit@100: from farolluz.py2 import FixedTimeZone as timezone benoit@100: benoit@129: from flask import request, flash benoit@58: benoit@62: from farolluz.cvrf import CVRFNote, CVRFReference, CVRFAcknowledgment benoit@127: from farolluz.parsers.cvrf import parseDate as parseXMLDate, parseVersion as parseXMLVersion benoit@58: benoit@63: def split_fields(field, separator=','): benoit@63: if not field: benoit@63: return [] benoit@63: return [f.strip() for f in field.split(separator)] benoit@63: benoit@58: def update_note_from_request(note): benoit@58: note._type = request.form['type'] benoit@58: note._ordinal = int(request.form['ordinal']) benoit@58: note._note = request.form['note'] benoit@58: note._title = request.form['title'] or None benoit@58: note._audience = request.form['audience'] or None benoit@58: benoit@58: def create_note_from_request(): benoit@58: title = request.form['title'] or None benoit@58: audience = request.form['audience'] or None benoit@58: benoit@58: return CVRFNote(request.form['type'], int(request.form['ordinal']), benoit@58: request.form['note'], title, audience) benoit@60: benoit@61: def update_reference_from_request(ref): benoit@61: ref._type = request.form['type'] or None benoit@61: ref._url = request.form['url'] benoit@61: ref._description = request.form['description'] benoit@61: benoit@61: def create_reference_from_request(): benoit@61: return CVRFReference(request.form['url'], request.form['description'], benoit@61: request.form['type'] or None) benoit@61: benoit@60: def update_acknowledgment_from_request(ack): benoit@63: ack._names = split_fields(request.form['names']) benoit@63: ack._organizations = split_fields(request.form['organizations']) benoit@60: ack._description = request.form['description'] or None benoit@60: ack._url = request.form['url'] or None benoit@60: benoit@60: def create_acknowledgment_from_request(): benoit@60: ack = CVRFAcknowledgment() benoit@63: ack._names = split_fields(request.form['names']) benoit@63: ack._organizations = split_fields(request.form['organizations']) benoit@60: ack._description = request.form['description'] or None benoit@60: ack._url = request.form['url'] or None benoit@60: return ack benoit@100: benoit@100: def parseDate(string): benoit@100: """ An extended version of the XML parser's one, that also unsderstand benoit@100: date without time. """ benoit@100: try: return parseXMLDate(string) benoit@100: except AttributeError: pass benoit@100: # Absorb AttributeError, and try to parse it a second time ... benoit@100: m = re.match('(\d{4})-(\d{2})-(\d{2})', string) benoit@130: if m is None: benoit@130: flash('Cannot parse date: "%s"' % string, 'warning') benoit@130: return None benoit@100: return datetime(int(m.group(1)), int(m.group(2)), int(m.group(3)), benoit@100: tzinfo=timezone(timedelta(hours=0, minutes=0))) benoit@127: benoit@127: def parseVersion(string): benoit@127: """ An extended version, one that doesn't throw exceptions """ benoit@127: try: return parseXMLVersion(string) benoit@129: except ValueError: benoit@129: flash('Cannot parse Version string: "%s"' % string) benoit@129: return None