| 24 |
webservice_base_class = WebServiceHTTP |
webservice_base_class = WebServiceHTTP |
| 25 |
|
|
| 26 |
class BugFilter: |
class BugFilter: |
| 27 |
default_action_list = [("hide_medium_urgency", "lower urgencies"), |
default_action_list = [('show_high_urgency', 'only high urgencies'), |
| 28 |
("hide_non_remote", "local vulnerabilities")] |
('show_medium_urgency', 'only medium and high urgencies'), |
| 29 |
|
('show_undetermined_urgency', 'issues that may be vulnerable but need to be checked (shown in purple)'), |
| 30 |
|
('show_unimportant_urgency', 'unimportant issues'), |
| 31 |
|
('show_remote_only', 'only remote vulnerabilities')] |
| 32 |
def __init__(self, params, action_list=None): |
def __init__(self, params, action_list=None): |
| 33 |
if action_list is None: |
if action_list is None: |
| 34 |
self.action_list = self.default_action_list |
self.action_list = self.default_action_list |
| 44 |
l = [] |
l = [] |
| 45 |
for (prop, desc) in self.action_list: |
for (prop, desc) in self.action_list: |
| 46 |
if self.params[prop]: |
if self.params[prop]: |
| 47 |
a = A(url.updateParamsDict({prop : None}), |
if self.params['show_medium_urgency'] and prop == 'show_medium_urgency': |
| 48 |
'Show ' + desc) |
note = 'Restore lower than medium urgencies' |
| 49 |
|
elif self.params['show_high_urgency'] and prop == 'show_high_urgency': |
| 50 |
|
note = 'Restore lower than high urgencies' |
| 51 |
|
elif self.params['show_remote_only'] and prop == 'show_remote_only': |
| 52 |
|
note = 'Restore local vulnerabilities' |
| 53 |
|
else: |
| 54 |
|
note = 'Hide ' + desc |
| 55 |
|
l.append(TR(TD(A(url.updateParamsDict({prop : None}), note)))) |
| 56 |
else: |
else: |
| 57 |
a = A(url.updateParamsDict({prop : '1'}), |
note = 'Show ' + desc |
| 58 |
'Hide ' + desc) |
l.append(TR(TD(A(url.updateParamsDict({prop : '1'}), note)))) |
| 59 |
l.append(a) |
|
| 60 |
l.append(' ') |
return TABLE(l) |
| 61 |
|
|
| 62 |
return apply(P, l[:-1]) |
def urgencyFiltered(self, urg, vuln): |
| 63 |
|
"""Returns True for urgencies that should be filtered.""" |
| 64 |
def urgencyFiltered(self, urg): |
filterlow = self.params['show_medium_urgency'] and \ |
| 65 |
"""Returns True if the urgency urg is filtered.""" |
urg in ('low', 'low**', 'unimportant', |
| 66 |
return self.params['hide_medium_urgency'] \ |
'undetermined', 'not yet assigned') |
| 67 |
and urg not in ("high", "unknown", "") |
filtermed = self.params['show_high_urgency'] and \ |
| 68 |
|
urg in ('medium', 'medium**', 'low', 'low**', |
| 69 |
|
'unimportant', 'undetermined', 'not yet assigned') |
| 70 |
|
filterund = not self.params['show_undetermined_urgency'] and vuln == 2 |
| 71 |
|
filteruni = not self.params['show_unimportant_urgency'] \ |
| 72 |
|
and urg == 'unimportant' |
| 73 |
|
return filterlow or filtermed or filterund or filteruni |
| 74 |
|
|
| 75 |
def remoteFiltered(self, remote): |
def remoteFiltered(self, remote): |
| 76 |
"""Returns True if the attack range is filtered.""" |
"""Returns True for only remote flaws if filtered.""" |
| 77 |
return remote is not None and self.params['hide_non_remote'] \ |
return self.params['show_remote_only'] and not remote and not remote is None |
|
and not remote |
|
| 78 |
|
|
| 79 |
class BugFilterNoDSA(BugFilter): |
class BugFilterNoDSA(BugFilter): |
| 80 |
def __init__(self, params): |
def __init__(self, params): |
| 81 |
BugFilter.__init__(self, params, self.default_action_list |
BugFilter.__init__(self, params, self.default_action_list |
| 82 |
+ [('hide_nodsa', 'non-DSA vulnerabilities')]) |
+ [('show_nodsa', 'issues that are not severe enough to warrant a DSA')]) |
|
self.hide_nodsa = int(params.get('hide_nodsa',(0,))[0]) |
|
| 83 |
|
|
| 84 |
def nodsaFiltered(self, nodsa): |
def nodsaFiltered(self, nodsa): |
| 85 |
"""Returns True if no DSA will be issued for the bug.""" |
"""Returns True for no DSA issues if filtered.""" |
| 86 |
return nodsa and self.params['hide_nodsa'] |
return nodsa and not self.params['show_nodsa'] |
| 87 |
|
|
| 88 |
class TrackerService(webservice_base_class): |
class TrackerService(webservice_base_class): |
| 89 |
head_contents = compose(STYLE( |
head_contents = compose(STYLE( |
| 117 |
} |
} |
| 118 |
''')).toHTML() |
''')).toHTML() |
| 119 |
|
|
| 120 |
|
nvd_text = P('''If a "**" is included, the urgency field was automatically |
| 121 |
|
assigned by the NVD (National Vulnerability Database). Note that this |
| 122 |
|
rating is automatically derived from a set of known factors about the |
| 123 |
|
issue (such as access complexity, confidentiality impact, exploitability, |
| 124 |
|
remediation level, and others). Human intervention is involved in |
| 125 |
|
determining the values of these factors, but the rating itself comes |
| 126 |
|
from a fully automated formula.''') |
| 127 |
|
|
| 128 |
def __init__(self, socket_name, db_name): |
def __init__(self, socket_name, db_name): |
| 129 |
webservice_base_class.__init__(self, socket_name) |
webservice_base_class.__init__(self, socket_name) |
| 130 |
self.db = security_db.DB(db_name) |
self.db = security_db.DB(db_name) |
| 132 |
self.register('*', self.page_object) |
self.register('*', self.page_object) |
| 133 |
self.register('redirect/*', self.page_redirect) |
self.register('redirect/*', self.page_redirect) |
| 134 |
self.register('source-package/*', self.page_source_package) |
self.register('source-package/*', self.page_source_package) |
|
self.register('binary-package/*', self.page_binary_package) |
|
| 135 |
self.register('status/release/oldstable', |
self.register('status/release/oldstable', |
| 136 |
self.page_status_release_oldstable) |
self.page_status_release_oldstable) |
| 137 |
self.register('status/release/stable', self.page_status_release_stable) |
self.register('status/release/stable', self.page_status_release_stable) |
| 146 |
self.register('status/dtsa-candidates', |
self.register('status/dtsa-candidates', |
| 147 |
self.page_status_dtsa_candidates) |
self.page_status_dtsa_candidates) |
| 148 |
self.register('status/todo', self.page_status_todo) |
self.register('status/todo', self.page_status_todo) |
| 149 |
|
self.register('status/undetermined', self.page_status_undetermined) |
| 150 |
|
self.register('status/unimportant', self.page_status_unimportant) |
| 151 |
self.register('status/itp', self.page_status_itp) |
self.register('status/itp', self.page_status_itp) |
| 152 |
self.register('data/unknown-packages', self.page_data_unknown_packages) |
self.register('data/unknown-packages', self.page_data_unknown_packages) |
| 153 |
self.register('data/missing-epochs', self.page_data_missing_epochs) |
self.register('data/missing-epochs', self.page_data_missing_epochs) |
| 206 |
'Vulnerable packages in backports for oldstable'), |
'Vulnerable packages in backports for oldstable'), |
| 207 |
('status/dtsa-candidates', "Candidates for DTSAs"), |
('status/dtsa-candidates', "Candidates for DTSAs"), |
| 208 |
('status/todo', 'TODO items'), |
('status/todo', 'TODO items'), |
| 209 |
|
('status/undetermined', 'Packages that may be vulnerable but need to be checked (undetermined issues)'), |
| 210 |
|
('status/unimportant', 'Packages that have open unimportant issues'), |
| 211 |
('status/itp', 'ITPs with potential security issues'), |
('status/itp', 'ITPs with potential security issues'), |
| 212 |
('data/unknown-packages', |
('data/unknown-packages', |
| 213 |
'Packages names not found in the archive'), |
'Packages names not found in the archive'), |
| 277 |
|
|
| 278 |
if self.db.isSourcePackage(c, obj): |
if self.db.isSourcePackage(c, obj): |
| 279 |
return RedirectResult(self.url_source_package(url, obj, full=True)) |
return RedirectResult(self.url_source_package(url, obj, full=True)) |
|
if self.db.isBinaryPackage(c, obj): |
|
|
return RedirectResult(self.url_binary_package(url ,obj, full=True)) |
|
| 280 |
|
|
| 281 |
return self.page_not_found(url, obj) |
return self.page_not_found(url, obj) |
| 282 |
|
|
| 391 |
caption=("Source Package", "Release", "Version", "Status"), |
caption=("Source Package", "Release", "Version", "Status"), |
| 392 |
introduction=P('The table below lists information on source packages.'))) |
introduction=P('The table below lists information on source packages.'))) |
| 393 |
|
|
|
def gen_binary(): |
|
|
old_pkg = '' |
|
|
for (packages, releases, version, archs, vulnerable) \ |
|
|
in self.db.getBinaryPackages(cursor, bug.name): |
|
|
pkg = ', '.join(packages) |
|
|
if pkg == old_pkg: |
|
|
packages = '' |
|
|
else: |
|
|
old_pkg = pkg |
|
|
packages = self.make_binary_packages_ref(url, packages) |
|
|
|
|
|
if vulnerable == 1: |
|
|
vuln = self.make_red('vulnerable') |
|
|
version = self.make_red(version) |
|
|
elif vulnerable == 2: |
|
|
vuln = self.make_purple('undetermined') |
|
|
version = self.make_purple(version) |
|
|
else: |
|
|
vuln = 'fixed' |
|
|
yield (packages, |
|
|
', '.join(releases), |
|
|
version, vuln, |
|
|
', '.join(archs)) |
|
|
|
|
|
page.append(make_table(gen_binary(), |
|
|
caption=("Binary Package", "Release", "Version", "Status", |
|
|
"Architecures"), |
|
|
introduction=P("The next table lists affected binary packages."))) |
|
|
|
|
| 394 |
def gen_data(): |
def gen_data(): |
| 395 |
notes_sorted = bug.notes[:] |
notes_sorted = bug.notes[:] |
| 396 |
notes_sorted.sort(lambda a, b: cmp(a.package, b.package)) |
notes_sorted.sort(lambda a, b: cmp(a.package, b.package)) |
| 407 |
urgency = '' |
urgency = '' |
| 408 |
else: |
else: |
| 409 |
ver = self.make_red('(unfixed)') |
ver = self.make_red('(unfixed)') |
| 410 |
|
if urgency == 'not yet assigned': |
| 411 |
|
urgency = '' |
| 412 |
|
|
| 413 |
pkg = n.package |
pkg = n.package |
| 414 |
pkg_kind = n.package_kind |
pkg_kind = n.package_kind |
| 415 |
if pkg_kind == 'source': |
if pkg_kind == 'source': |
| 416 |
pkg = self.make_source_package_ref(url, pkg) |
pkg = self.make_source_package_ref(url, pkg) |
|
elif pkg_kind == 'binary': |
|
|
pkg = self.make_binary_package_ref(url, pkg) |
|
| 417 |
elif pkg_kind == 'itp': |
elif pkg_kind == 'itp': |
| 418 |
pkg_kind = 'ITP' |
pkg_kind = 'ITP' |
| 419 |
rel = '' |
rel = '' |
| 441 |
def gen_comments(): |
def gen_comments(): |
| 442 |
for (t, c) in bug.comments: |
for (t, c) in bug.comments: |
| 443 |
yield c |
yield c |
| 444 |
page.append(make_pre(linkify(gen_comments()))) |
page.append(make_pre(gen_comments())) |
| 445 |
|
|
| 446 |
return self.create_page(url, bug.name, page) |
return self.create_page(url, bug.name, page) |
| 447 |
|
|
| 529 |
for (releases, version) in self.db.getSourcePackageVersions( |
for (releases, version) in self.db.getSourcePackageVersions( |
| 530 |
self.db.cursor(), pkg): |
self.db.cursor(), pkg): |
| 531 |
yield ', '.join(releases), version |
yield ', '.join(releases), version |
|
def gen_binary(): |
|
|
for (packages, releases, archs, version) \ |
|
|
in self.db.getBinaryPackagesForSource( |
|
|
self.db.cursor(), pkg): |
|
|
yield (self.make_binary_packages_ref(url, packages), |
|
|
', '.join(releases), version, ', '.join(archs)) |
|
| 532 |
def gen_bug_list(lst): |
def gen_bug_list(lst): |
| 533 |
for (bug, description) in lst: |
for (bug, description) in lst: |
| 534 |
yield self.make_xref(url, bug), description |
yield self.make_xref(url, bug), description |
| 545 |
H2("Available versions"), |
H2("Available versions"), |
| 546 |
make_table(gen_versions(), caption=("Release", "Version")), |
make_table(gen_versions(), caption=("Release", "Version")), |
| 547 |
|
|
|
H2("Available binary packages"), |
|
|
make_table(gen_binary(), |
|
|
caption=('Package', 'Release', 'Version', 'Architectures'), |
|
|
replacement="""No binary packages are recorded in this database. |
|
|
This probably means that the package is architecture-specific, and the |
|
|
architecture is currently not tracked."""), |
|
|
|
|
| 548 |
H2("Open issues"), |
H2("Open issues"), |
| 549 |
make_table(gen_bug_list(self.db.getBugsForSourcePackage |
make_table(gen_bug_list(self.db.getBugsForSourcePackage |
| 550 |
(self.db.cursor(), pkg, True)), |
(self.db.cursor(), pkg, True)), |
| 557 |
caption=('Bug', 'Description'), |
caption=('Bug', 'Description'), |
| 558 |
replacement='No known resolved issues.')]) |
replacement='No known resolved issues.')]) |
| 559 |
|
|
|
def page_binary_package(self, path, params, url): |
|
|
pkg = path[0] |
|
|
|
|
|
def gen_versions(): |
|
|
for (releases, source, version, archs) \ |
|
|
in self.db.getBinaryPackageVersions(self.db.cursor(), pkg): |
|
|
yield (', '.join(releases), |
|
|
self.make_source_package_ref(url, source), |
|
|
version, ', '.join(archs)) |
|
|
def gen_bug_list(lst): |
|
|
for (bug, description) in lst: |
|
|
yield self.make_xref(url, bug), description |
|
|
|
|
|
return self.create_page( |
|
|
url, "Information on binary package " + pkg, |
|
|
[make_menu(lambda x: x, |
|
|
(self.url_debian_bug_pkg(url, pkg), |
|
|
pkg + ' in the Bug Tracking System')), |
|
|
H2("Available versions"), |
|
|
make_table(gen_versions(), |
|
|
caption=("Release", "Source", "Version", "Architectures")), |
|
|
|
|
|
H2("Open issues"), |
|
|
make_table(gen_bug_list(self.db.getBugsForBinaryPackage |
|
|
(self.db.cursor(), pkg, True)), |
|
|
caption=('Bug', 'Description'), |
|
|
replacement='No known open issues.'), |
|
|
|
|
|
H2("Resolved issues"), |
|
|
make_table(gen_bug_list(self.db.getBugsForBinaryPackage |
|
|
(self.db.cursor(), pkg, False)), |
|
|
caption=('Bug', 'Description'), |
|
|
replacement='No known resolved issues.'), |
|
|
|
|
|
H2("Non-issues"), |
|
|
make_table(gen_bug_list(self.db.getNonBugsForBinaryPackage |
|
|
(self.db.cursor(), pkg)), |
|
|
caption=('Bug', 'Description'), |
|
|
replacement="""No known issues which do not affect |
|
|
this package, but still reference it.""")]) |
|
|
|
|
| 560 |
def page_status_release_stable_oldstable(self, release, params, url): |
def page_status_release_stable_oldstable(self, release, params, url): |
| 561 |
assert release in ('stable', 'oldstable') |
assert release in ('stable', 'oldstable') |
| 562 |
|
|
| 564 |
|
|
| 565 |
def gen(): |
def gen(): |
| 566 |
old_pkg_name = '' |
old_pkg_name = '' |
| 567 |
for (pkg_name, bug_name, archive, urgency, remote, no_dsa) in \ |
for (pkg_name, bug_name, archive, urgency, vulnerable, remote, no_dsa) in \ |
| 568 |
self.db.cursor().execute( |
self.db.cursor().execute( |
| 569 |
"""SELECT package, bug, section, urgency, remote, no_dsa |
"""SELECT package, bug, section, urgency, vulnerable, remote, no_dsa |
| 570 |
FROM %s_status""" % release): |
FROM %s_status""" % release): |
| 571 |
if bf.urgencyFiltered(urgency): |
if bf.urgencyFiltered(urgency, vulnerable): |
| 572 |
continue |
continue |
| 573 |
if bf.remoteFiltered(remote): |
if bf.remoteFiltered(remote): |
| 574 |
continue |
continue |
| 575 |
if bf.nodsaFiltered(no_dsa): |
if bf.nodsaFiltered(no_dsa): |
| 576 |
continue |
continue |
| 577 |
|
|
| 578 |
if pkg_name == old_pkg_name: |
if pkg_name == old_pkg_name: |
| 579 |
pkg_name = '' |
pkg_name = '' |
| 580 |
else: |
else: |
| 583 |
pkg_name = "%s (%s)" % (pkg_name, archive) |
pkg_name = "%s (%s)" % (pkg_name, archive) |
| 584 |
|
|
| 585 |
if remote is None: |
if remote is None: |
| 586 |
remote = '' |
remote = '???' |
| 587 |
elif remote: |
elif remote: |
| 588 |
remote = 'yes' |
remote = 'yes' |
| 589 |
else: |
else: |
| 590 |
remote = 'no' |
remote = 'no' |
| 591 |
|
|
| 592 |
if urgency == 'unknown': |
if urgency.startswith('high'): |
|
if no_dsa: |
|
|
urgency = 'no DSA' |
|
|
else: |
|
|
urgency = '' |
|
|
elif urgency == 'high': |
|
| 593 |
urgency = self.make_red(urgency) |
urgency = self.make_red(urgency) |
| 594 |
elif urgency == 'undetermined': |
elif vulnerable == 2: |
| 595 |
urgency = self.make_purple(urgency) |
urgency = self.make_purple(urgency) |
| 596 |
else: |
else: |
| 597 |
if no_dsa: |
if no_dsa: |
| 601 |
|
|
| 602 |
return self.create_page( |
return self.create_page( |
| 603 |
url, 'Vulnerable source packages in the %s suite' % release, |
url, 'Vulnerable source packages in the %s suite' % release, |
| 604 |
[bf.actions(url), |
[bf.actions(url), BR(), |
| 605 |
make_table(gen(), caption=("Package", "Bug", "Urgency", |
make_table(gen(), caption=("Package", "Bug", "Urgency", "Remote")), |
| 606 |
"Remote")), |
P('''If a "*" is included in the urgency field, no DSA is planned |
| 607 |
P('''(If a "*" is included in the urgency field, no DSA is planned |
for this vulnerability.'''), |
| 608 |
for this vulnerability.)''')]) |
self.nvd_text]) |
| 609 |
|
|
| 610 |
def page_status_release_stable(self, path, params, url): |
def page_status_release_stable(self, path, params, url): |
| 611 |
return self.page_status_release_stable_oldstable('stable', params, url) |
return self.page_status_release_stable_oldstable('stable', params, url) |
| 618 |
|
|
| 619 |
def gen(): |
def gen(): |
| 620 |
old_pkg_name = '' |
old_pkg_name = '' |
| 621 |
for (pkg_name, bug_name, archive, urgency, |
for (pkg_name, bug_name, archive, urgency, vulnerable, |
| 622 |
sid_vulnerable, ts_fixed, remote, no_dsa) \ |
sid_vulnerable, ts_fixed, remote, no_dsa) \ |
| 623 |
in self.db.cursor().execute( |
in self.db.cursor().execute( |
| 624 |
"""SELECT package, bug, section, urgency, unstable_vulnerable, |
"""SELECT package, bug, section, urgency, vulnerable, |
| 625 |
testing_security_fixed, remote, no_dsa |
unstable_vulnerable, testing_security_fixed, remote, no_dsa |
| 626 |
FROM testing_status"""): |
FROM testing_status"""): |
| 627 |
if bf.urgencyFiltered(urgency): |
if bf.urgencyFiltered(urgency, vulnerable): |
| 628 |
continue |
continue |
| 629 |
if bf.remoteFiltered(remote): |
if bf.remoteFiltered(remote): |
| 630 |
continue |
continue |
| 639 |
pkg_name = "%s (%s)" % (pkg_name, archive) |
pkg_name = "%s (%s)" % (pkg_name, archive) |
| 640 |
|
|
| 641 |
if remote is None: |
if remote is None: |
| 642 |
remote = '' |
remote = '???' |
| 643 |
elif remote: |
elif remote: |
| 644 |
remote = 'yes' |
remote = 'yes' |
| 645 |
else: |
else: |
| 653 |
else: |
else: |
| 654 |
status = self.make_dangerous('fixed in unstable') |
status = self.make_dangerous('fixed in unstable') |
| 655 |
|
|
| 656 |
if urgency == 'unknown': |
if urgency.startswith('high'): |
| 657 |
urgency = '' |
urgency = self.make_red(urgency) |
| 658 |
|
elif vulnerable == 2: |
| 659 |
|
urgency = self.make_purple(urgency) |
| 660 |
|
|
| 661 |
yield (pkg_name, self.make_xref(url, bug_name), |
yield (pkg_name, self.make_xref(url, bug_name), |
| 662 |
urgency, remote, status) |
urgency, remote, status) |
| 665 |
url, 'Vulnerable source packages in the testing suite', |
url, 'Vulnerable source packages in the testing suite', |
| 666 |
[make_menu(url.scriptRelative, |
[make_menu(url.scriptRelative, |
| 667 |
("status/dtsa-candidates", "Candidates for DTSAs")), |
("status/dtsa-candidates", "Candidates for DTSAs")), |
| 668 |
bf.actions(url), |
bf.actions(url), BR(), |
| 669 |
make_table(gen(), caption=("Package", "Bug", "Urgency", |
make_table(gen(), caption=("Package", "Bug", "Urgency", "Remote")), |
| 670 |
"Remote"))]) |
self.nvd_text]) |
| 671 |
|
|
| 672 |
def page_status_release_unstable_like(self, path, params, url, |
def page_status_release_unstable_like(self, path, params, url, |
| 673 |
rel, title): |
rel, title): |
| 675 |
|
|
| 676 |
def gen(): |
def gen(): |
| 677 |
old_pkg_name = '' |
old_pkg_name = '' |
| 678 |
for (pkg_name, bug_name, section, urgency, remote) \ |
for (pkg_name, bug_name, section, urgency, vulnerable, remote) \ |
| 679 |
in self.db.cursor().execute( |
in self.db.cursor().execute( |
| 680 |
"""SELECT DISTINCT sp.name, st.bug_name, |
"""SELECT DISTINCT sp.name, st.bug_name, |
| 681 |
sp.archive, st.urgency, |
sp.archive, st.urgency, st.vulnerable, |
| 682 |
(SELECT range_remote FROM nvd_data |
(SELECT range_remote FROM nvd_data |
| 683 |
WHERE cve_name = st.bug_name) |
WHERE cve_name = st.bug_name) |
| 684 |
FROM source_package_status AS st, source_packages AS sp |
FROM source_package_status AS st, source_packages AS sp |
| 685 |
WHERE st.vulnerable AND st.urgency <> 'unimportant' |
WHERE st.vulnerable AND sp.rowid = st.package |
| 686 |
AND sp.rowid = st.package AND sp.release = ? |
AND sp.release = ? AND sp.subrelease = '' |
|
AND sp.subrelease = '' |
|
| 687 |
ORDER BY sp.name, st.bug_name""", (rel,)): |
ORDER BY sp.name, st.bug_name""", (rel,)): |
| 688 |
if bf.urgencyFiltered(urgency): |
if bf.urgencyFiltered(urgency, vulnerable): |
| 689 |
continue |
continue |
| 690 |
if bf.remoteFiltered(remote): |
if bf.remoteFiltered(remote): |
| 691 |
continue |
continue |
| 700 |
pkg_name = self.make_xref(url, pkg_name) |
pkg_name = self.make_xref(url, pkg_name) |
| 701 |
|
|
| 702 |
if remote is None: |
if remote is None: |
| 703 |
remote = '' |
remote = '???' |
| 704 |
elif remote: |
elif remote: |
| 705 |
remote = 'yes' |
remote = 'yes' |
| 706 |
else: |
else: |
| 707 |
remote = 'no' |
remote = 'no' |
| 708 |
|
|
| 709 |
if urgency == 'unknown': |
if urgency.startswith('high'): |
|
urgency = '' |
|
|
elif urgency == 'high': |
|
| 710 |
urgency = self.make_red(urgency) |
urgency = self.make_red(urgency) |
| 711 |
elif urgency == 'undetermined': |
elif vulnerable == 2: |
| 712 |
urgency = self.make_purple(urgency) |
urgency = self.make_purple(urgency) |
| 713 |
|
|
| 714 |
yield pkg_name, self.make_xref(url, bug_name), urgency, remote |
yield pkg_name, self.make_xref(url, bug_name), urgency, remote |
| 715 |
|
|
| 716 |
return self.create_page( |
return self.create_page( |
| 717 |
url, title, |
url, title, |
| 718 |
[P("""Note that the list below is based on source packages. |
[P("""Note that the list below is based on source packages. |
| 720 |
fixed source version has been uploaded to the archive, even |
fixed source version has been uploaded to the archive, even |
| 721 |
if there are still some vulnerably binary packages present |
if there are still some vulnerably binary packages present |
| 722 |
in the archive."""), |
in the archive."""), |
| 723 |
bf.actions(url), |
bf.actions(url), BR(), |
| 724 |
make_table(gen(), caption=('Package', 'Bug', 'Urgency', |
make_table(gen(), caption=('Package', 'Bug', 'Urgency', 'Remote')), |
| 725 |
'Remote'))]) |
self.nvd_text]) |
| 726 |
|
|
| 727 |
def page_status_release_unstable(self, path, params, url): |
def page_status_release_unstable(self, path, params, url): |
| 728 |
return self.page_status_release_unstable_like( |
return self.page_status_release_unstable_like( |
| 747 |
|
|
| 748 |
def gen(): |
def gen(): |
| 749 |
old_pkg_name = '' |
old_pkg_name = '' |
| 750 |
for (pkg_name, bug_name, archive, urgency, stable_later, |
for (pkg_name, bug_name, archive, urgency, vulnerable, |
| 751 |
remote) \ |
stable_later, remote) \ |
| 752 |
in self.db.cursor().execute( |
in self.db.cursor().execute( |
| 753 |
"""SELECT package, bug, section, urgency, |
"""SELECT package, bug, section, urgency, vulnerable, |
| 754 |
(SELECT testing.version_id < stable.version_id |
(SELECT testing.version_id < stable.version_id |
| 755 |
FROM source_packages AS testing, source_packages AS stable |
FROM source_packages AS testing, source_packages AS stable |
| 756 |
WHERE testing.name = testing_status.package |
WHERE testing.name = testing_status.package |
| 766 |
FROM testing_status |
FROM testing_status |
| 767 |
WHERE (NOT unstable_vulnerable) |
WHERE (NOT unstable_vulnerable) |
| 768 |
AND (NOT testing_security_fixed)"""): |
AND (NOT testing_security_fixed)"""): |
| 769 |
if bf.urgencyFiltered(urgency): |
if bf.urgencyFiltered(urgency, vulnerable): |
| 770 |
continue |
continue |
| 771 |
if bf.remoteFiltered(remote): |
if bf.remoteFiltered(remote): |
| 772 |
continue |
continue |
| 784 |
pkg_name = self.make_source_package_ref(url, pkg_name) |
pkg_name = self.make_source_package_ref(url, pkg_name) |
| 785 |
|
|
| 786 |
if remote is None: |
if remote is None: |
| 787 |
remote = '' |
remote = '???' |
| 788 |
elif remote: |
elif remote: |
| 789 |
remote = 'yes' |
remote = 'yes' |
| 790 |
else: |
else: |
| 791 |
remote = 'no' |
remote = 'no' |
| 792 |
|
|
| 793 |
if urgency == 'unknown': |
if urgency.startswith('high'): |
|
urgency = '' |
|
|
elif urgency == 'high': |
|
| 794 |
urgency = self.make_red(urgency) |
urgency = self.make_red(urgency) |
| 795 |
|
elif vulnerable == 2: |
| 796 |
|
urgency = self.make_purple(urgency) |
| 797 |
|
|
| 798 |
if stable_later: |
if stable_later: |
| 799 |
notes = "(fixed in stable?)" |
notes = "(fixed in stable?)" |
| 811 |
make_menu(url.scriptRelative, |
make_menu(url.scriptRelative, |
| 812 |
("status/release/testing", |
("status/release/testing", |
| 813 |
"List of vulnerable packages in testing")), |
"List of vulnerable packages in testing")), |
| 814 |
bf.actions(url), |
bf.actions(url), BR(), |
| 815 |
make_table(gen(), |
make_table(gen(), |
| 816 |
caption=("Package", "Migration", "Bug", "Urgency", |
caption=("Package", "Migration", "Bug", "Urgency", |
| 817 |
"Remote"))]) |
"Remote"))]) |
| 830 |
yield self.make_xref(url, bug), description |
yield self.make_xref(url, bug), description |
| 831 |
return self.create_page( |
return self.create_page( |
| 832 |
url, "Bugs with TODO items", |
url, "Bugs with TODO items", |
| 833 |
[P(flags), |
[P(flags), make_table(gen(), caption=("Bug", "Description"))]) |
| 834 |
make_table(gen(), |
|
| 835 |
caption=("Bug", "Description"))]) |
def page_status_undetermined(self, path, params, url): |
| 836 |
|
def gen(): |
| 837 |
|
outrel = [] |
| 838 |
|
old_bug = '' |
| 839 |
|
old_pkg = '' |
| 840 |
|
old_dsc = '' |
| 841 |
|
last_displayed = '' |
| 842 |
|
releases = ('sid', 'squeeze', 'lenny', 'etch') |
| 843 |
|
for (pkg_name, bug_name, release, desc) in self.db.cursor().execute( |
| 844 |
|
"""SELECT DISTINCT sp.name, st.bug_name, sp.release, |
| 845 |
|
bugs.description |
| 846 |
|
FROM source_package_status AS st, source_packages AS sp, bugs |
| 847 |
|
WHERE st.vulnerable == 2 AND sp.rowid = st.package |
| 848 |
|
AND ( sp.release = ? OR sp.release = ? OR sp.release = ? |
| 849 |
|
OR sp.release = ? ) |
| 850 |
|
AND sp.subrelease = '' AND st.bug_name == bugs.name |
| 851 |
|
ORDER BY sp.name, st.bug_name""", releases): |
| 852 |
|
|
| 853 |
|
if old_bug == '': |
| 854 |
|
old_bug = bug_name |
| 855 |
|
old_pkg = pkg_name |
| 856 |
|
old_dsc = desc |
| 857 |
|
elif old_bug != bug_name: |
| 858 |
|
if old_pkg == last_displayed: |
| 859 |
|
to_display = '' |
| 860 |
|
else: |
| 861 |
|
to_display = old_pkg |
| 862 |
|
yield to_display, self.make_xref(url, old_bug), old_dsc, ', '.join(outrel) |
| 863 |
|
last_displayed = old_pkg |
| 864 |
|
old_bug = bug_name |
| 865 |
|
old_pkg = pkg_name |
| 866 |
|
old_dsc = desc |
| 867 |
|
outrel = [] |
| 868 |
|
outrel.append( release ) |
| 869 |
|
yield old_pkg, self.make_xref(url, old_bug), old_dsc, ', '.join(outrel) |
| 870 |
|
|
| 871 |
|
return self.create_page(url, 'Packages that may be vulnerable but need to be checked (undetermined issues)', |
| 872 |
|
[P("""This page lists packages that may or may not be affected |
| 873 |
|
by known issues. This means that some additional work needs to |
| 874 |
|
be done to determined whether the package is actually |
| 875 |
|
vulnerable or not. This list is a good area for new |
| 876 |
|
contributors to make quick and meaningful contributions."""), |
| 877 |
|
make_table(gen(), caption=('Package', 'Bug', 'Description', 'Releases'))]) |
| 878 |
|
|
| 879 |
|
def page_status_unimportant(self, path, params, url): |
| 880 |
|
def gen(): |
| 881 |
|
outrel = [] |
| 882 |
|
old_bug = '' |
| 883 |
|
old_pkg = '' |
| 884 |
|
old_dsc = '' |
| 885 |
|
old_name = '' |
| 886 |
|
last_displayed = '' |
| 887 |
|
releases = ('sid', 'squeeze', 'lenny', 'etch') |
| 888 |
|
for (pkg_name, bug_name, release, desc) in self.db.cursor().execute( |
| 889 |
|
"""SELECT DISTINCT sp.name, st.bug_name, sp.release, |
| 890 |
|
bugs.description |
| 891 |
|
FROM source_package_status AS st, source_packages AS sp, bugs |
| 892 |
|
WHERE st.vulnerable > 0 AND sp.rowid = st.package |
| 893 |
|
AND ( sp.release = ? OR sp.release = ? OR sp.release = ? |
| 894 |
|
OR sp.release = ? ) AND st.urgency == 'unimportant' |
| 895 |
|
AND sp.subrelease = '' AND st.bug_name == bugs.name |
| 896 |
|
ORDER BY sp.name, st.bug_name""", releases): |
| 897 |
|
|
| 898 |
|
if old_bug == '': |
| 899 |
|
old_bug = bug_name |
| 900 |
|
old_pkg = pkg_name |
| 901 |
|
old_dsc = desc |
| 902 |
|
elif old_bug != bug_name: |
| 903 |
|
if old_pkg == last_displayed: |
| 904 |
|
to_display = '' |
| 905 |
|
else: |
| 906 |
|
to_display = old_pkg |
| 907 |
|
yield to_display, self.make_xref(url, old_bug), old_dsc, ', '.join(outrel) |
| 908 |
|
last_displayed = old_pkg |
| 909 |
|
old_bug = bug_name |
| 910 |
|
old_pkg = pkg_name |
| 911 |
|
old_dsc = desc |
| 912 |
|
outrel = [] |
| 913 |
|
outrel.append( release ) |
| 914 |
|
yield old_pkg, self.make_xref(url, old_bug), old_dsc, ', '.join(outrel) |
| 915 |
|
|
| 916 |
|
return self.create_page(url, 'Packages that have open unimportant issues', |
| 917 |
|
[P("""This page lists packages that are affected by issues |
| 918 |
|
that are considered unimportant from a security perspective. |
| 919 |
|
These issues are thought to be unexploitable or uneffective |
| 920 |
|
in most situations (for example, browser denial-of-services)."""), |
| 921 |
|
make_table(gen(), caption=('Package', 'Bug', 'Description', 'Releases'))]) |
| 922 |
|
|
| 923 |
def page_status_itp(self, path, params, url): |
def page_status_itp(self, path, params, url): |
| 924 |
def gen(): |
def gen(): |
| 1114 |
data = [] |
data = [] |
| 1115 |
for pkg, bugs in self.db.cursor().execute( |
for pkg, bugs in self.db.cursor().execute( |
| 1116 |
"""SELECT package, COUNT(DISTINCT bug) FROM |
"""SELECT package, COUNT(DISTINCT bug) FROM |
| 1117 |
(SELECT package, bug FROM stable_status |
(SELECT package, bug, urgency FROM stable_status |
| 1118 |
UNION ALL SELECT package, bug FROM oldstable_status |
UNION ALL SELECT package, bug, urgency FROM oldstable_status |
| 1119 |
UNION ALL SELECT DISTINCT sp.name, st.bug_name |
UNION ALL SELECT DISTINCT sp.name, st.bug_name, st.urgency |
| 1120 |
FROM source_package_status AS st, source_packages AS sp |
FROM source_package_status AS st, source_packages AS sp |
| 1121 |
WHERE st.vulnerable AND st.urgency <> 'unimportant' |
WHERE st.vulnerable AND st.urgency <> 'unimportant' |
| 1122 |
AND sp.rowid = st.package AND sp.release = 'sid' |
AND sp.rowid = st.package AND sp.release = 'sid' |
| 1123 |
AND sp.subrelease = '') x |
AND sp.subrelease = '') x WHERE urgency <> 'unimportant' |
| 1124 |
GROUP BY package ORDER BY package"""): |
GROUP BY package ORDER BY package"""): |
| 1125 |
data.append(pkg) |
data.append(pkg) |
| 1126 |
data.append(':') |
data.append(':') |
| 1212 |
return url.scriptRelativeFull("source-package/" + package) |
return url.scriptRelativeFull("source-package/" + package) |
| 1213 |
else: |
else: |
| 1214 |
return url.scriptRelative("source-package/" + package) |
return url.scriptRelative("source-package/" + package) |
|
def url_binary_package(self, url, package, full=False): |
|
|
if full: |
|
|
return url.scriptRelativeFull("binary-package/" + package) |
|
|
else: |
|
|
return url.scriptRelative("binary-package/" + package) |
|
| 1215 |
|
|
| 1216 |
def make_xref(self, url, name): |
def make_xref(self, url, name): |
| 1217 |
return A(url.scriptRelative(name), name) |
return A(url.scriptRelative(name), name) |
| 1257 |
if title is None: |
if title is None: |
| 1258 |
title = pkg |
title = pkg |
| 1259 |
return A(self.url_source_package(url, pkg), title) |
return A(self.url_source_package(url, pkg), title) |
|
def make_binary_package_ref(self, url, pkg, title=None): |
|
|
if title is None: |
|
|
title = pkg |
|
|
return A(self.url_binary_package(url, pkg), title) |
|
|
def make_binary_packages_ref(self, url, lst): |
|
|
assert type(lst) <> types.StringType |
|
|
return make_list(map(lambda x: self.make_binary_package_ref(url, x), |
|
|
lst)) |
|
| 1260 |
|
|
| 1261 |
def make_red(self, contents): |
def make_red(self, contents): |
| 1262 |
return SPAN(contents, _class="red") |
return SPAN(contents, _class="red") |