diff options
author | Florian Weimer <fw@deneb.enyo.de> | 2010-05-08 18:23:58 +0000 |
---|---|---|
committer | Florian Weimer <fw@deneb.enyo.de> | 2010-05-08 18:23:58 +0000 |
commit | 5108c2e36844a6b7a06e3e167450841c5e6acc28 (patch) | |
tree | 259601e976bba3b383413785af6609585181a4fe /lib | |
parent | 4c9b547ce88f0a39ad0c3db37fbfa9c719d2ffc2 (diff) |
sectracker.parsers.dsalist(): DSA file parser
git-svn-id: svn+ssh://svn.debian.org/svn/secure-testing@14648 e39458fd-73e7-0310-bf30-c45bca0a0e42
Diffstat (limited to 'lib')
-rw-r--r-- | lib/python/sectracker/parsers.py | 111 | ||||
-rw-r--r-- | lib/python/sectracker_test/test_parsers.py | 5 |
2 files changed, 74 insertions, 42 deletions
diff --git a/lib/python/sectracker/parsers.py b/lib/python/sectracker/parsers.py index 998127cefa..f861e033d7 100644 --- a/lib/python/sectracker/parsers.py +++ b/lib/python/sectracker/parsers.py @@ -185,65 +185,92 @@ List = _namedtuple("List", "list messages") 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*$') -@_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()) + +@_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) + +@_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) diff --git a/lib/python/sectracker_test/test_parsers.py b/lib/python/sectracker_test/test_parsers.py index 83a00645be..ac29156508 100644 --- a/lib/python/sectracker_test/test_parsers.py +++ b/lib/python/sectracker_test/test_parsers.py @@ -30,6 +30,11 @@ o = cvelist("../../data/CVE/list") 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>', |