Florian Weimer
2010-May-08 18:23 UTC
[Secure-testing-commits] r14648 - in lib/python: sectracker sectracker_test
Author: fw Date: 2010-05-08 18:23:58 +0000 (Sat, 08 May 2010) New Revision: 14648 Modified: lib/python/sectracker/parsers.py lib/python/sectracker_test/test_parsers.py Log: sectracker.parsers.dsalist(): DSA file parser Modified: lib/python/sectracker/parsers.py ==================================================================--- lib/python/sectracker/parsers.py 2010-05-08 18:22:31 UTC (rev 14647) +++ lib/python/sectracker/parsers.py 2010-05-08 18:23:58 UTC (rev 14648) @@ -185,65 +185,92 @@ Bug = _namedtuple("Bug", "file header annotations") Header = _namedtuple("Header", "line name description") -def _cveuniquename(line, anns): - bug = 0 - for ann in anns: - if ann.type == "package" and ann.debian_bugs: - bug = ann.debian_bugs[0] - break - return "TEMP-%07d-%06d" % (bug, line) - -_re_cve_header = re.compile(r''^(CVE-\d{4}-(?:\d{4}|XXXX))\s+(.*?)\s*$'') - at _xpickle.loader("CVE" + FORMAT) -def cvelist(path, f): +def _parselist(path, f, parseheader, finish): lineno = 0 headerlineno = None bugs = [] diag = sectracker.diagnostics.Diagnostics() - name = desc = None + header = None anns = [] - def emit(): - if name is None: - return - - if name[-1] == "X": - name1 = _cveuniquename(headerlineno, anns) - else: - name1 = name - bugs.append(Bug(path, Header(headerlineno, name1, desc), tuple(anns))) - del anns[:] - for line in f.readlines(): lineno += 1 diag.setlocation(path, lineno) if line[:1] in " \t": - if name is None: + if header is None: diag.error("header expected") continue _annotationdispatcher(line, diag, anns) else: - emit() + if header is not None: + bugs.append(finish(header, headerlineno, anns, diag)) + del anns[:] headerlineno = lineno - match = _re_cve_header.match(line) - if match is None: + header = parseheader(line) + if header is None: diag.error("malformed header") - name = desc = None continue - name, desc = match.groups() - if desc: - if desc[0] == ''('': - if desc[-1] <> '')'': - diag.error("error", "missing '')''") - else: - desc = desc[1:-1] - elif desc[0] == ''['': - if desc[-1] <> '']'': - diag.error("missing '']''") - else: - desc = desc[1:-1] - emit() + if header is not None: + finish(header, headerlineno, anns, diag) return List(tuple(bugs), diag.messages()) + + at _xpickle.loader("CVE" + FORMAT) +def cvelist(path, f): + re_header = re.compile(r''^(CVE-\d{4}-(?:\d{4}|XXXX))\s+(.*?)\s*$'') + def parseheader(line): + match = re_header.match(line) + if match is None: + return None + name, desc = match.groups() + if desc: + if desc[0] == ''('': + if desc[-1] <> '')'': + diag.error("error", "missing '')''") + else: + desc = desc[1:-1] + elif desc[0] == ''['': + if desc[-1] <> '']'': + diag.error("missing '']''") + else: + desc = desc[1:-1] + return (name, desc) + def cveuniquename(line, anns): + bug = 0 + for ann in anns: + if ann.type == "package" and ann.debian_bugs: + bug = ann.debian_bugs[0] + break + return "TEMP-%07d-%06d" % (bug, line) + def finish(header, headerlineno, anns, diag): + name, desc = header + if name[-1] == "X": + name1 = cveuniquename(headerlineno, anns) + else: + name1 = name + return Bug(path, Header(headerlineno, name1, desc), tuple(anns)) + return _parselist(path, f, parseheader, finish) + +def _checkrelease(anns, diag, kind): + for ann in anns: + if ann.type == "package" and ann.release is None: + diag.error("release annotation required in %s file" % kind, + line=ann.line) + + at _xpickle.loader("DSA" + FORMAT) +def dsalist(path, f): + re_header = re.compile(r''^\[(\d\d) ([A-Z][a-z][a-z]) (\d{4})\] '' + + r''(DSA-\d+(?:-\d+)?)\s+'' + + r''(.*?)\s*$'') + def parseheader(line): + match = re_header.match(line) + if match is None: + return None + return match.groups() + def finish(header, headerlineno, anns, diag): + d, m, y, name, desc = header + _checkrelease(anns, diag, "DSA") + return Bug(path, Header(headerlineno, name, None), tuple(anns)) + return _parselist(path, f, parseheader, finish) Modified: lib/python/sectracker_test/test_parsers.py ==================================================================--- lib/python/sectracker_test/test_parsers.py 2010-05-08 18:22:31 UTC (rev 14647) +++ lib/python/sectracker_test/test_parsers.py 2010-05-08 18:23:58 UTC (rev 14648) @@ -30,6 +30,11 @@ for err in o.messages: print "%s:%d: %s: %s" % (err.file, err.line, err.level, err.message) +safeunlink("../../data/DSA/list" + EXTENSION) +o = dsalist("../../data/DSA/list") +for err in o.messages: + print "%s:%d: %s: %s" % (err.file, err.line, err.level, err.message) + Message = sectracker.diagnostics.Message for (line, res, xmsgs) in [ ('' - foo <unfixed>'',