Author: fw Date: 2010-05-07 20:37:27 +0000 (Fri, 07 May 2010) New Revision: 14626 Modified: lib/python/parsers.py Log: parsers.cvelist(): preliminary CVE list parser Modified: lib/python/parsers.py ==================================================================--- lib/python/parsers.py 2010-05-07 19:26:36 UTC (rev 14625) +++ lib/python/parsers.py 2010-05-07 20:37:27 UTC (rev 14626) @@ -191,6 +191,73 @@ addmessage(messages, file, line, "error", "invalid annotation")) _annotationdispatcher = _annotationdispatcher() +List = xcollections.namedtuple("List", "list messages") +Bug = xcollections.namedtuple("Bug", "file header annotations") +Header = xcollections.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): + lineno = 0 + headerlineno = None + bugs = [] + messages = [] + name = desc = 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 + if line[:1] in " \t": + if name is None: + addmessage(messages, path, lineno, "error", "header expected") + continue + _annotationdispatcher(line, path, lineno, messages, anns) + else: + emit() + headerlineno = lineno + + match = _re_cve_header.match(line) + if match is None: + addmessage(message, path, lineno, "error", "malformed header") + name = desc = None + continue + name, desc = match.groups() + if desc: + if desc[0] == ''('': + if desc[-1] <> '')'': + addmessage(message, path, lineno, "error", + "missing '')''") + else: + desc = desc[1:-1] + elif desc[0] == ''['': + if desc[-1] <> '']'': + addmessage(message, path, lineno, "error", + "missing '']''") + else: + desc = desc[1:-1] + + emit() + return List(tuple(bugs), tuple(messages)) + def _test(): o = binarypackages("../../data/packages/sid__main_i386_Packages") assert type(o) == type(()) @@ -200,6 +267,11 @@ assert type(o) == type({}) assert "bash" in o + xpickle.safeunlink("../../data/CVE/list" + xpickle.EXTENSION) + o = cvelist("../../data/CVE/list") + for err in o.messages: + print "%s:%d: %s: %s" % (err.file, err.line, err.level, err.message) + for (line, res, xmsgs) in [ ('' - foo <unfixed>'', PackageAnnotation(17, "package", None, "foo", "unfixed", None,