| 2 |
|
|
| 3 |
import sys |
import sys |
| 4 |
sys.path.insert(0,'../lib/python') |
sys.path.insert(0,'../lib/python') |
|
|
|
|
if len(sys.argv) <> 3: |
|
|
print "usage: python tracker_serivce.py SOCKET-PATH DATABASE-PATH" |
|
|
sys.exit(1) |
|
|
socket_name = sys.argv[1] |
|
|
db_name = sys.argv[2] |
|
|
|
|
| 5 |
import bugs |
import bugs |
| 6 |
import re |
import re |
| 7 |
import security_db |
import security_db |
| 8 |
from web_support import * |
from web_support import * |
| 9 |
|
|
| 10 |
|
if len(sys.argv) not in (3, 5): |
| 11 |
|
print "usage: python tracker_service.py SOCKET-PATH DATABASE-PATH" |
| 12 |
|
print " python tracker_service.py URL HOST PORT DATABASE-PATH" |
| 13 |
|
sys.exit(1) |
| 14 |
|
if len(sys.argv) == 3: |
| 15 |
|
socket_name = sys.argv[1] |
| 16 |
|
db_name = sys.argv[2] |
| 17 |
|
webservice_base_class = WebService |
| 18 |
|
else: |
| 19 |
|
server_base_url = sys.argv[1] |
| 20 |
|
server_address = sys.argv[2] |
| 21 |
|
server_port = int(sys.argv[3]) |
| 22 |
|
socket_name = (server_base_url, server_address, server_port) |
| 23 |
|
db_name = sys.argv[4] |
| 24 |
|
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): |
class TrackerService(webservice_base_class): |
| 89 |
head_contents = compose(STYLE( |
head_contents = compose(STYLE( |
| 90 |
"""h1 { font-size : 144%; } |
"""h1 { font-size : 144%; } |
| 91 |
h2 { font-size : 120%; } |
h2 { font-size : 120%; } |
| 97 |
padding-right : 0.25em; } |
padding-right : 0.25em; } |
| 98 |
td { vertical-align: baseline } |
td { vertical-align: baseline } |
| 99 |
span.red { color: red; } |
span.red { color: red; } |
| 100 |
|
span.purple { color: purple; } |
| 101 |
span.dangerous { color: rgb(191,127,0); } |
span.dangerous { color: rgb(191,127,0); } |
| 102 |
"""), SCRIPT('''var old_query_value = ""; |
"""), SCRIPT('''var old_query_value = ""; |
| 103 |
|
|
| 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.__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) |
| 131 |
self.register('', self.page_home) |
self.register('', self.page_home) |
| 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) |
| 156 |
self.register('data/releases', self.page_data_releases) |
self.register('data/releases', self.page_data_releases) |
| 157 |
self.register('data/funny-versions', self.page_data_funny_versions) |
self.register('data/funny-versions', self.page_data_funny_versions) |
| 158 |
self.register('data/fake-names', self.page_data_fake_names) |
self.register('data/fake-names', self.page_data_fake_names) |
| 159 |
|
self.register('data/pts/1', self.page_data_pts) |
| 160 |
self.register('debsecan/**', self.page_debsecan) |
self.register('debsecan/**', self.page_debsecan) |
| 161 |
self.register('data/report', self.page_report) |
self.register('data/report', self.page_report) |
| 162 |
|
|
| 173 |
[P( |
[P( |
| 174 |
"""The data in this tracker comes solely from the bug database maintained |
"""The data in this tracker comes solely from the bug database maintained |
| 175 |
by Debian's security team located in the testing-security Subversion """, |
by Debian's security team located in the testing-security Subversion """, |
| 176 |
A("http://svn.debian.org/wsvn/secure-testing/data", "repository"), |
A("http://svn.debian.org/wsvn/secure-testing/data/", "repository"), |
| 177 |
""". The data represented here is derived from: """, |
""". The data represented here is derived from: """, |
| 178 |
A("http://www.debian.org/security/#DSAS", "DSAs"), |
A("http://www.debian.org/security/#DSAS", "DSAs"), |
| 179 |
""" issued by the Security Team; issues tracked in the """, |
""" issued by the Security Team; issues tracked in the """, |
| 198 |
'Vulnerable packages in the testing suite'), |
'Vulnerable packages in the testing suite'), |
| 199 |
('status/release/stable', |
('status/release/stable', |
| 200 |
'Vulnerable packages in the stable suite'), |
'Vulnerable packages in the stable suite'), |
|
('status/release/oldstable', |
|
|
'Vulnerable packages in the old stable suite'), |
|
| 201 |
('status/release/stable-backports', |
('status/release/stable-backports', |
| 202 |
'Vulnerable packages in backports for stable'), |
'Vulnerable packages in backports for stable'), |
|
('status/release/oldstable-backports', |
|
|
'Vulnerable packages in backports for oldstable'), |
|
| 203 |
('status/dtsa-candidates', "Candidates for DTSAs"), |
('status/dtsa-candidates', "Candidates for DTSAs"), |
| 204 |
('status/todo', 'TODO items'), |
('status/todo', 'TODO items'), |
| 205 |
|
('status/undetermined', 'Packages that may be vulnerable but need to be checked (undetermined issues)'), |
| 206 |
|
('status/unimportant', 'Packages that have open unimportant issues'), |
| 207 |
('status/itp', 'ITPs with potential security issues'), |
('status/itp', 'ITPs with potential security issues'), |
| 208 |
('data/unknown-packages', |
('data/unknown-packages', |
| 209 |
'Packages names not found in the archive'), |
'Packages names not found in the archive'), |
| 234 |
return self.page_object_or_redirect(url, obj, False) |
return self.page_object_or_redirect(url, obj, False) |
| 235 |
|
|
| 236 |
def page_redirect(self, path, params, url): |
def page_redirect(self, path, params, url): |
| 237 |
obj = path[0] |
if path == (): |
| 238 |
|
obj = '' |
| 239 |
|
else: |
| 240 |
|
obj = path[0] |
| 241 |
return self.page_object_or_redirect(url, obj, True) |
return self.page_object_or_redirect(url, obj, True) |
| 242 |
|
|
| 243 |
def page_object_or_redirect(self, url, obj, redirect): |
def page_object_or_redirect(self, url, obj, redirect): |
| 273 |
|
|
| 274 |
if self.db.isSourcePackage(c, obj): |
if self.db.isSourcePackage(c, obj): |
| 275 |
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)) |
|
| 276 |
|
|
| 277 |
return self.page_not_found(url, obj) |
return self.page_not_found(url, obj) |
| 278 |
|
|
| 299 |
|
|
| 300 |
def gen_header(): |
def gen_header(): |
| 301 |
yield B("Name"), bug.name |
yield B("Name"), bug.name |
| 302 |
|
|
| 303 |
|
nvd = self.db.getNVD(cursor, bug.name) |
| 304 |
|
|
| 305 |
|
if nvd and nvd.cve_desc: |
| 306 |
|
yield B("Description"), nvd.cve_desc |
| 307 |
|
elif bug.description: |
| 308 |
|
yield B("Description"), bug.description |
| 309 |
|
|
| 310 |
source = bug.name.split('-')[0] |
source = bug.name.split('-')[0] |
| 311 |
if source == 'CVE': |
if source == 'CVE': |
| 312 |
source_xref = compose(self.make_cve_ref(url, bug.name, 'CVE'), |
source_xref = compose(self.make_cve_ref(url, bug.name, 'CVE'), |
| 313 |
" (", |
" (at ", |
| 314 |
self.make_nvd_ref(url, bug.name, |
self.make_nvd_ref(url, bug.name, |
| 315 |
'in NVD'), |
'NVD'), |
| 316 |
|
"; ", |
| 317 |
|
self.make_rhbug_ref(url, bug.name, |
| 318 |
|
'Red Hat'), |
| 319 |
|
", ", |
| 320 |
|
self.make_ubuntu_bug_ref(url, bug.name, 'Ubuntu'), |
| 321 |
|
", ", |
| 322 |
|
self.make_gentoo_bug_ref(url, bug.name, 'Gentoo'), |
| 323 |
|
", ", |
| 324 |
|
A(url.absolute('http://oss-security.openwall.org/wiki/vendors'), 'more'), |
| 325 |
")") |
")") |
| 326 |
elif source == 'DSA': |
elif source == 'DSA': |
| 327 |
source_xref = self.make_dsa_ref(url, bug.name, 'Debian') |
source_xref = self.make_dsa_ref(url, bug.name, 'Debian') |
| 335 |
|
|
| 336 |
if source_xref: |
if source_xref: |
| 337 |
yield B("Source"), source_xref |
yield B("Source"), source_xref |
|
|
|
|
nvd = self.db.getNVD(cursor, bug.name) |
|
|
|
|
|
if nvd and nvd.cve_desc: |
|
|
yield B("Description"), nvd.cve_desc |
|
|
elif bug.description: |
|
|
yield B("Description"), bug.description |
|
| 338 |
|
|
| 339 |
xref = list(self.db.getBugXrefs(cursor, bug.name)) |
xref = list(self.db.getBugXrefs(cursor, bug.name)) |
| 340 |
if xref: |
if xref: |
| 356 |
|
|
| 357 |
if not bug.not_for_us: |
if not bug.not_for_us: |
| 358 |
for (release, status, reason) in bug.getStatus(cursor): |
for (release, status, reason) in bug.getStatus(cursor): |
| 359 |
if status <> 'fixed': |
if status == 'undetermined': |
| 360 |
|
reason = self.make_purple(reason) |
| 361 |
|
elif status <> 'fixed': |
| 362 |
reason = self.make_red(reason) |
reason = self.make_red(reason) |
| 363 |
yield B('Debian/%s' % release), reason |
yield B('Debian/%s' % release), reason |
| 364 |
|
|
| 378 |
package = compose( |
package = compose( |
| 379 |
self.make_source_package_ref(url, package), |
self.make_source_package_ref(url, package), |
| 380 |
" (", self.make_pts_ref(url, package, 'PTS'), ")") |
" (", self.make_pts_ref(url, package, 'PTS'), ")") |
| 381 |
if vulnerable: |
if vulnerable == 1: |
| 382 |
vuln = self.make_red('vulnerable') |
vuln = self.make_red('vulnerable') |
| 383 |
version = self.make_red(version) |
version = self.make_red(version) |
| 384 |
|
elif vulnerable == 2: |
| 385 |
|
vuln = self.make_purple('undetermined') |
| 386 |
|
version = self.make_purple(version) |
| 387 |
else: |
else: |
| 388 |
vuln = 'fixed' |
vuln = 'fixed' |
| 389 |
|
|
| 393 |
caption=("Source Package", "Release", "Version", "Status"), |
caption=("Source Package", "Release", "Version", "Status"), |
| 394 |
introduction=P('The table below lists information on source packages.'))) |
introduction=P('The table below lists information on source packages.'))) |
| 395 |
|
|
|
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: |
|
|
vuln = self.make_red('vulnerable') |
|
|
version = self.make_red(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."))) |
|
|
|
|
| 396 |
def gen_data(): |
def gen_data(): |
| 397 |
notes_sorted = bug.notes[:] |
notes_sorted = bug.notes[:] |
| 398 |
notes_sorted.sort(lambda a, b: cmp(a.package, b.package)) |
notes_sorted.sort(lambda a, b: cmp(a.package, b.package)) |
| 409 |
urgency = '' |
urgency = '' |
| 410 |
else: |
else: |
| 411 |
ver = self.make_red('(unfixed)') |
ver = self.make_red('(unfixed)') |
| 412 |
|
if urgency == 'not yet assigned': |
| 413 |
|
urgency = '' |
| 414 |
|
|
| 415 |
pkg = n.package |
pkg = n.package |
| 416 |
pkg_kind = n.package_kind |
pkg_kind = n.package_kind |
| 417 |
if pkg_kind == 'source': |
if pkg_kind == 'source': |
| 418 |
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) |
|
| 419 |
elif pkg_kind == 'itp': |
elif pkg_kind == 'itp': |
| 420 |
pkg_kind = 'ITP' |
pkg_kind = 'ITP' |
| 421 |
rel = '' |
rel = '' |
| 515 |
P("""Helping out: We welcome people who wish to join us in tracking |
P("""Helping out: We welcome people who wish to join us in tracking |
| 516 |
issues. The process is designed to be easy to learn and participate, |
issues. The process is designed to be easy to learn and participate, |
| 517 |
please read our """, |
please read our """, |
| 518 |
A("http://svn.debian.org/wsvn/secure-testing/doc/narrative_introduction?op=file&rev=0&sc=0", |
A("http://svn.debian.org/viewvc/secure-testing/doc/narrative_introduction?view=co", |
| 519 |
"Introduction"), |
"Introduction"), |
| 520 |
""" to get familiar with how things work. Join us on |
""" to get familiar with how things work. Join us on |
| 521 |
our mailing list, and on IRC and request to be added to the Alioth """, |
our mailing list, and on IRC and request to be added to the Alioth """, |
| 531 |
for (releases, version) in self.db.getSourcePackageVersions( |
for (releases, version) in self.db.getSourcePackageVersions( |
| 532 |
self.db.cursor(), pkg): |
self.db.cursor(), pkg): |
| 533 |
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)) |
|
| 534 |
def gen_bug_list(lst): |
def gen_bug_list(lst): |
| 535 |
for (bug, description) in lst: |
for (bug, description) in lst: |
| 536 |
yield self.make_xref(url, bug), description |
yield self.make_xref(url, bug), description |
| 537 |
|
|
| 538 |
return self.create_page( |
return self.create_page( |
| 539 |
url, "Information on source package " + pkg, |
url, 'Information on source package ' + pkg, |
| 540 |
[make_menu(lambda x: x, |
[make_menu(lambda x: x, |
| 541 |
(self.url_pts(url, pkg), |
(self.url_pts(url, pkg), |
| 542 |
pkg + ' in the Package Tracking System'), |
pkg + ' in the Package Tracking System'), |
| 544 |
pkg + ' in the Bug Tracking System'), |
pkg + ' in the Bug Tracking System'), |
| 545 |
(self.url_testing_status(url, pkg), |
(self.url_testing_status(url, pkg), |
| 546 |
pkg + ' in the testing migration checker')), |
pkg + ' in the testing migration checker')), |
| 547 |
H2("Available versions"), |
H2('Available versions'), |
| 548 |
make_table(gen_versions(), caption=("Release", "Version")), |
make_table(gen_versions(), caption=('Release', 'Version')), |
| 549 |
|
|
| 550 |
H2("Available binary packages"), |
H2('Open issues'), |
|
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."""), |
|
|
|
|
|
H2("Open issues"), |
|
| 551 |
make_table(gen_bug_list(self.db.getBugsForSourcePackage |
make_table(gen_bug_list(self.db.getBugsForSourcePackage |
| 552 |
(self.db.cursor(), pkg, True)), |
(self.db.cursor(), pkg, True, False)), |
| 553 |
caption=('Bug', 'Description'), |
caption=('Bug', 'Description'), |
| 554 |
replacement='No known open issues.'), |
replacement='No known open issues.'), |
| 555 |
|
|
| 556 |
H2("Resolved issues"), |
H2('Open unimportant issues'), |
| 557 |
make_table(gen_bug_list(self.db.getBugsForSourcePackage |
make_table(gen_bug_list(self.db.getBugsForSourcePackage |
| 558 |
(self.db.cursor(), pkg, False)), |
(self.db.cursor(), pkg, True, True)), |
|
caption=('Bug', 'Description'), |
|
|
replacement='No known resolved issues.')]) |
|
|
|
|
|
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)), |
|
| 559 |
caption=('Bug', 'Description'), |
caption=('Bug', 'Description'), |
| 560 |
replacement='No known open issues.'), |
replacement='No known unimportant issues.'), |
| 561 |
|
|
| 562 |
H2("Resolved issues"), |
H2('Resolved issues'), |
| 563 |
make_table(gen_bug_list(self.db.getBugsForBinaryPackage |
make_table(gen_bug_list(self.db.getBugsForSourcePackage |
| 564 |
(self.db.cursor(), pkg, False)), |
(self.db.cursor(), pkg, False, True)), |
| 565 |
caption=('Bug', 'Description'), |
caption=('Bug', 'Description'), |
| 566 |
replacement='No known resolved issues.'), |
replacement='No known resolved issues.'), |
| 567 |
|
|
| 568 |
H2("Non-issues"), |
H2('Security announcements'), |
| 569 |
make_table(gen_bug_list(self.db.getNonBugsForBinaryPackage |
make_table(gen_bug_list(self.db.getDSAsForSourcePackage |
| 570 |
(self.db.cursor(), pkg)), |
(self.db.cursor(), pkg)), |
| 571 |
caption=('Bug', 'Description'), |
caption=('DSA', 'Description'), |
| 572 |
replacement="""No known issues which do not affect |
replacement='No known security announcements.') |
| 573 |
this package, but still reference it.""")]) |
]) |
| 574 |
|
|
| 575 |
def page_status_release_stable_oldstable(self, release, params, url): |
def page_status_release_stable_oldstable(self, release, params, url): |
| 576 |
assert release in ('stable', 'oldstable') |
assert release in ('stable', 'oldstable') |
| 579 |
|
|
| 580 |
def gen(): |
def gen(): |
| 581 |
old_pkg_name = '' |
old_pkg_name = '' |
| 582 |
for (pkg_name, bug_name, archive, urgency, remote, no_dsa) in \ |
for (pkg_name, bug_name, archive, urgency, vulnerable, remote, no_dsa) in \ |
| 583 |
self.db.cursor().execute( |
self.db.cursor().execute( |
| 584 |
"""SELECT package, bug, section, urgency, remote, no_dsa |
"""SELECT package, bug, section, urgency, vulnerable, remote, no_dsa |
| 585 |
FROM %s_status""" % release): |
FROM %s_status""" % release): |
| 586 |
if bf.urgencyFiltered(urgency): |
if bf.urgencyFiltered(urgency, vulnerable): |
| 587 |
continue |
continue |
| 588 |
if bf.remoteFiltered(remote): |
if bf.remoteFiltered(remote): |
| 589 |
continue |
continue |
| 590 |
if bf.nodsaFiltered(no_dsa): |
if bf.nodsaFiltered(no_dsa): |
| 591 |
continue |
continue |
| 592 |
|
|
| 593 |
if pkg_name == old_pkg_name: |
if pkg_name == old_pkg_name: |
| 594 |
pkg_name = '' |
pkg_name = '' |
| 595 |
else: |
else: |
| 598 |
pkg_name = "%s (%s)" % (pkg_name, archive) |
pkg_name = "%s (%s)" % (pkg_name, archive) |
| 599 |
|
|
| 600 |
if remote is None: |
if remote is None: |
| 601 |
remote = '' |
remote = '???' |
| 602 |
elif remote: |
elif remote: |
| 603 |
remote = 'yes' |
remote = 'yes' |
| 604 |
else: |
else: |
| 605 |
remote = 'no' |
remote = 'no' |
| 606 |
|
|
| 607 |
if urgency == 'unknown': |
if urgency.startswith('high'): |
|
if no_dsa: |
|
|
urgency = 'no DSA' |
|
|
else: |
|
|
urgency = '' |
|
|
elif urgency == 'high': |
|
| 608 |
urgency = self.make_red(urgency) |
urgency = self.make_red(urgency) |
| 609 |
|
elif vulnerable == 2: |
| 610 |
|
urgency = self.make_purple(urgency) |
| 611 |
else: |
else: |
| 612 |
if no_dsa: |
if no_dsa: |
| 613 |
urgency = urgency + '*' |
urgency = urgency + '*' |
| 616 |
|
|
| 617 |
return self.create_page( |
return self.create_page( |
| 618 |
url, 'Vulnerable source packages in the %s suite' % release, |
url, 'Vulnerable source packages in the %s suite' % release, |
| 619 |
[bf.actions(url), |
[bf.actions(url), BR(), |
| 620 |
make_table(gen(), caption=("Package", "Bug", "Urgency", |
make_table(gen(), caption=("Package", "Bug", "Urgency", "Remote")), |
| 621 |
"Remote")), |
P('''If a "*" is included in the urgency field, no DSA is planned |
| 622 |
P('''(If a "*" is included in the urgency field, no DSA is planned |
for this vulnerability.'''), |
| 623 |
for this vulnerability.)''')]) |
self.nvd_text]) |
| 624 |
|
|
| 625 |
def page_status_release_stable(self, path, params, url): |
def page_status_release_stable(self, path, params, url): |
| 626 |
return self.page_status_release_stable_oldstable('stable', params, url) |
return self.page_status_release_stable_oldstable('stable', params, url) |
| 633 |
|
|
| 634 |
def gen(): |
def gen(): |
| 635 |
old_pkg_name = '' |
old_pkg_name = '' |
| 636 |
for (pkg_name, bug_name, archive, urgency, |
for (pkg_name, bug_name, archive, urgency, vulnerable, |
| 637 |
sid_vulnerable, ts_fixed, remote, no_dsa) \ |
sid_vulnerable, ts_fixed, remote, no_dsa) \ |
| 638 |
in self.db.cursor().execute( |
in self.db.cursor().execute( |
| 639 |
"""SELECT package, bug, section, urgency, unstable_vulnerable, |
"""SELECT package, bug, section, urgency, vulnerable, |
| 640 |
testing_security_fixed, remote, no_dsa |
unstable_vulnerable, testing_security_fixed, remote, no_dsa |
| 641 |
FROM testing_status"""): |
FROM testing_status"""): |
| 642 |
if bf.urgencyFiltered(urgency): |
if bf.urgencyFiltered(urgency, vulnerable): |
| 643 |
continue |
continue |
| 644 |
if bf.remoteFiltered(remote): |
if bf.remoteFiltered(remote): |
| 645 |
continue |
continue |
| 654 |
pkg_name = "%s (%s)" % (pkg_name, archive) |
pkg_name = "%s (%s)" % (pkg_name, archive) |
| 655 |
|
|
| 656 |
if remote is None: |
if remote is None: |
| 657 |
remote = '' |
remote = '???' |
| 658 |
elif remote: |
elif remote: |
| 659 |
remote = 'yes' |
remote = 'yes' |
| 660 |
else: |
else: |
| 668 |
else: |
else: |
| 669 |
status = self.make_dangerous('fixed in unstable') |
status = self.make_dangerous('fixed in unstable') |
| 670 |
|
|
| 671 |
if urgency == 'unknown': |
if urgency.startswith('high'): |
| 672 |
urgency = '' |
urgency = self.make_red(urgency) |
| 673 |
|
elif vulnerable == 2: |
| 674 |
|
urgency = self.make_purple(urgency) |
| 675 |
|
|
| 676 |
yield (pkg_name, self.make_xref(url, bug_name), |
yield (pkg_name, self.make_xref(url, bug_name), |
| 677 |
urgency, remote, status) |
urgency, remote, status) |
| 680 |
url, 'Vulnerable source packages in the testing suite', |
url, 'Vulnerable source packages in the testing suite', |
| 681 |
[make_menu(url.scriptRelative, |
[make_menu(url.scriptRelative, |
| 682 |
("status/dtsa-candidates", "Candidates for DTSAs")), |
("status/dtsa-candidates", "Candidates for DTSAs")), |
| 683 |
bf.actions(url), |
bf.actions(url), BR(), |
| 684 |
make_table(gen(), caption=("Package", "Bug", "Urgency", |
make_table(gen(), caption=("Package", "Bug", "Urgency", "Remote")), |
| 685 |
"Remote"))]) |
self.nvd_text]) |
| 686 |
|
|
| 687 |
def page_status_release_unstable_like(self, path, params, url, |
def page_status_release_unstable_like(self, path, params, url, |
| 688 |
rel, title): |
rel, title): |
| 690 |
|
|
| 691 |
def gen(): |
def gen(): |
| 692 |
old_pkg_name = '' |
old_pkg_name = '' |
| 693 |
for (pkg_name, bug_name, section, urgency, remote) \ |
for (pkg_name, bug_name, section, urgency, vulnerable, remote) \ |
| 694 |
in self.db.cursor().execute( |
in self.db.cursor().execute( |
| 695 |
"""SELECT DISTINCT sp.name, st.bug_name, |
"""SELECT DISTINCT sp.name, st.bug_name, |
| 696 |
sp.archive, st.urgency, |
sp.archive, st.urgency, st.vulnerable, |
| 697 |
(SELECT range_remote FROM nvd_data |
(SELECT range_remote FROM nvd_data |
| 698 |
WHERE cve_name = st.bug_name) |
WHERE cve_name = st.bug_name) |
| 699 |
FROM source_package_status AS st, source_packages AS sp |
FROM source_package_status AS st, source_packages AS sp |
| 700 |
WHERE st.vulnerable AND st.urgency <> 'unimportant' |
WHERE st.vulnerable AND sp.rowid = st.package |
| 701 |
AND sp.rowid = st.package AND sp.release = ? |
AND sp.release = ? AND sp.subrelease = '' |
|
AND sp.subrelease = '' |
|
| 702 |
ORDER BY sp.name, st.bug_name""", (rel,)): |
ORDER BY sp.name, st.bug_name""", (rel,)): |
| 703 |
if bf.urgencyFiltered(urgency): |
if bf.urgencyFiltered(urgency, vulnerable): |
| 704 |
continue |
continue |
| 705 |
if bf.remoteFiltered(remote): |
if bf.remoteFiltered(remote): |
| 706 |
continue |
continue |
| 715 |
pkg_name = self.make_xref(url, pkg_name) |
pkg_name = self.make_xref(url, pkg_name) |
| 716 |
|
|
| 717 |
if remote is None: |
if remote is None: |
| 718 |
remote = '' |
remote = '???' |
| 719 |
elif remote: |
elif remote: |
| 720 |
remote = 'yes' |
remote = 'yes' |
| 721 |
else: |
else: |
| 722 |
remote = 'no' |
remote = 'no' |
| 723 |
|
|
| 724 |
if urgency == 'unknown': |
if urgency.startswith('high'): |
|
urgency = '' |
|
|
elif urgency == 'high': |
|
| 725 |
urgency = self.make_red(urgency) |
urgency = self.make_red(urgency) |
| 726 |
|
elif vulnerable == 2: |
| 727 |
|
urgency = self.make_purple(urgency) |
| 728 |
|
|
| 729 |
yield pkg_name, self.make_xref(url, bug_name), urgency, remote |
yield pkg_name, self.make_xref(url, bug_name), urgency, remote |
| 730 |
|
|
| 731 |
return self.create_page( |
return self.create_page( |
| 732 |
url, title, |
url, title, |
| 733 |
[P("""Note that the list below is based on source packages. |
[P("""Note that the list below is based on source packages. |
| 735 |
fixed source version has been uploaded to the archive, even |
fixed source version has been uploaded to the archive, even |
| 736 |
if there are still some vulnerably binary packages present |
if there are still some vulnerably binary packages present |
| 737 |
in the archive."""), |
in the archive."""), |
| 738 |
bf.actions(url), |
bf.actions(url), BR(), |
| 739 |
make_table(gen(), caption=('Package', 'Bug', 'Urgency', |
make_table(gen(), caption=('Package', 'Bug', 'Urgency', 'Remote')), |
| 740 |
'Remote'))]) |
self.nvd_text]) |
| 741 |
|
|
| 742 |
def page_status_release_unstable(self, path, params, url): |
def page_status_release_unstable(self, path, params, url): |
| 743 |
return self.page_status_release_unstable_like( |
return self.page_status_release_unstable_like( |
| 749 |
return self.page_status_release_unstable_like( |
return self.page_status_release_unstable_like( |
| 750 |
path, params, url, |
path, params, url, |
| 751 |
title='Vulnerable source packages among backports for stable', |
title='Vulnerable source packages among backports for stable', |
| 752 |
rel='lenny-backports') |
rel='squeeze-backports') |
| 753 |
|
|
| 754 |
def page_status_release_oldstable_backports(self, path, params, url): |
def page_status_release_oldstable_backports(self, path, params, url): |
| 755 |
return self.page_status_release_unstable_like( |
return self.page_status_release_unstable_like( |
| 756 |
path, params, url, |
path, params, url, |
| 757 |
title='Vulnerable source packages among backports for oldstable', |
title='Vulnerable source packages among backports for oldstable', |
| 758 |
rel='etch-backports') |
rel='lenny-backports') |
| 759 |
|
|
| 760 |
def page_status_dtsa_candidates(self, path, params, url): |
def page_status_dtsa_candidates(self, path, params, url): |
| 761 |
bf = BugFilter(params) |
bf = BugFilter(params) |
| 762 |
|
|
| 763 |
def gen(): |
def gen(): |
| 764 |
old_pkg_name = '' |
old_pkg_name = '' |
| 765 |
for (pkg_name, bug_name, archive, urgency, stable_later, |
for (pkg_name, bug_name, archive, urgency, vulnerable, |
| 766 |
remote) \ |
stable_later, remote) \ |
| 767 |
in self.db.cursor().execute( |
in self.db.cursor().execute( |
| 768 |
"""SELECT package, bug, section, urgency, |
"""SELECT package, bug, section, urgency, vulnerable, |
| 769 |
(SELECT testing.version_id < stable.version_id |
(SELECT testing.version_id < stable.version_id |
| 770 |
FROM source_packages AS testing, source_packages AS stable |
FROM source_packages AS testing, source_packages AS stable |
| 771 |
WHERE testing.name = testing_status.package |
WHERE testing.name = testing_status.package |
| 772 |
AND testing.release = 'squeeze' |
AND testing.release = 'wheezy' |
| 773 |
AND testing.subrelease = '' |
AND testing.subrelease = '' |
| 774 |
AND testing.archive = testing_status.section |
AND testing.archive = testing_status.section |
| 775 |
AND stable.name = testing_status.package |
AND stable.name = testing_status.package |
| 776 |
AND stable.release = 'lenny' |
AND stable.release = 'squeeze' |
| 777 |
AND stable.subrelease = 'security' |
AND stable.subrelease = 'security' |
| 778 |
AND stable.archive = testing_status.section), |
AND stable.archive = testing_status.section), |
| 779 |
(SELECT range_remote FROM nvd_data |
(SELECT range_remote FROM nvd_data |
| 781 |
FROM testing_status |
FROM testing_status |
| 782 |
WHERE (NOT unstable_vulnerable) |
WHERE (NOT unstable_vulnerable) |
| 783 |
AND (NOT testing_security_fixed)"""): |
AND (NOT testing_security_fixed)"""): |
| 784 |
if bf.urgencyFiltered(urgency): |
if bf.urgencyFiltered(urgency, vulnerable): |
| 785 |
continue |
continue |
| 786 |
if bf.remoteFiltered(remote): |
if bf.remoteFiltered(remote): |
| 787 |
continue |
continue |
| 799 |
pkg_name = self.make_source_package_ref(url, pkg_name) |
pkg_name = self.make_source_package_ref(url, pkg_name) |
| 800 |
|
|
| 801 |
if remote is None: |
if remote is None: |
| 802 |
remote = '' |
remote = '???' |
| 803 |
elif remote: |
elif remote: |
| 804 |
remote = 'yes' |
remote = 'yes' |
| 805 |
else: |
else: |
| 806 |
remote = 'no' |
remote = 'no' |
| 807 |
|
|
| 808 |
if urgency == 'unknown': |
if urgency.startswith('high'): |
|
urgency = '' |
|
|
elif urgency == 'high': |
|
| 809 |
urgency = self.make_red(urgency) |
urgency = self.make_red(urgency) |
| 810 |
|
elif vulnerable == 2: |
| 811 |
|
urgency = self.make_purple(urgency) |
| 812 |
|
|
| 813 |
if stable_later: |
if stable_later: |
| 814 |
notes = "(fixed in stable?)" |
notes = "(fixed in stable?)" |
| 826 |
make_menu(url.scriptRelative, |
make_menu(url.scriptRelative, |
| 827 |
("status/release/testing", |
("status/release/testing", |
| 828 |
"List of vulnerable packages in testing")), |
"List of vulnerable packages in testing")), |
| 829 |
bf.actions(url), |
bf.actions(url), BR(), |
| 830 |
make_table(gen(), |
make_table(gen(), |
| 831 |
caption=("Package", "Migration", "Bug", "Urgency", |
caption=("Package", "Migration", "Bug", "Urgency", |
| 832 |
"Remote"))]) |
"Remote"))]) |
| 841 |
'Hide "check" TODOs') |
'Hide "check" TODOs') |
| 842 |
|
|
| 843 |
def gen(): |
def gen(): |
| 844 |
for (bug, description) in self.db.getTODOs(hide_check=hide_check): |
for (bug, description, note) in self.db.getTODOs(hide_check=hide_check): |
| 845 |
yield self.make_xref(url, bug), description |
yield self.make_xref(url, bug), description, note |
| 846 |
return self.create_page( |
return self.create_page( |
| 847 |
url, "Bugs with TODO items", |
url, 'Bugs with TODO items', |
| 848 |
[P(flags), |
[P(flags), make_table(gen(), caption=('Bug', 'Description', 'Note'))]) |
| 849 |
make_table(gen(), |
|
| 850 |
caption=("Bug", "Description"))]) |
def page_status_undetermined(self, path, params, url): |
| 851 |
|
def gen(): |
| 852 |
|
outrel = [] |
| 853 |
|
old_bug = '' |
| 854 |
|
old_pkg = '' |
| 855 |
|
old_dsc = '' |
| 856 |
|
last_displayed = '' |
| 857 |
|
releases = ('sid', 'wheezy', 'squeeze', 'lenny') |
| 858 |
|
for (pkg_name, bug_name, release, desc) in self.db.cursor().execute( |
| 859 |
|
"""SELECT DISTINCT sp.name, st.bug_name, sp.release, |
| 860 |
|
bugs.description |
| 861 |
|
FROM source_package_status AS st, source_packages AS sp, bugs |
| 862 |
|
WHERE st.vulnerable == 2 AND sp.rowid = st.package |
| 863 |
|
AND ( sp.release = ? OR sp.release = ? OR sp.release = ? |
| 864 |
|
OR sp.release = ? ) |
| 865 |
|
AND sp.subrelease = '' AND st.bug_name == bugs.name |
| 866 |
|
ORDER BY sp.name, st.bug_name""", releases): |
| 867 |
|
|
| 868 |
|
if old_bug == '': |
| 869 |
|
old_bug = bug_name |
| 870 |
|
old_pkg = pkg_name |
| 871 |
|
old_dsc = desc |
| 872 |
|
elif old_bug != bug_name: |
| 873 |
|
if old_pkg == last_displayed: |
| 874 |
|
to_display = '' |
| 875 |
|
else: |
| 876 |
|
to_display = old_pkg |
| 877 |
|
yield to_display, self.make_xref(url, old_bug), old_dsc, ', '.join(outrel) |
| 878 |
|
last_displayed = old_pkg |
| 879 |
|
old_bug = bug_name |
| 880 |
|
old_pkg = pkg_name |
| 881 |
|
old_dsc = desc |
| 882 |
|
outrel = [] |
| 883 |
|
outrel.append( release ) |
| 884 |
|
yield old_pkg, self.make_xref(url, old_bug), old_dsc, ', '.join(outrel) |
| 885 |
|
|
| 886 |
|
return self.create_page(url, 'Packages that may be vulnerable but need to be checked (undetermined issues)', |
| 887 |
|
[P("""This page lists packages that may or may not be affected |
| 888 |
|
by known issues. This means that some additional work needs to |
| 889 |
|
be done to determined whether the package is actually |
| 890 |
|
vulnerable or not. This list is a good area for new |
| 891 |
|
contributors to make quick and meaningful contributions."""), |
| 892 |
|
make_table(gen(), caption=('Package', 'Bug', 'Description', 'Releases'))]) |
| 893 |
|
|
| 894 |
|
def page_status_unimportant(self, path, params, url): |
| 895 |
|
def gen(): |
| 896 |
|
outrel = [] |
| 897 |
|
old_bug = '' |
| 898 |
|
old_pkg = '' |
| 899 |
|
old_dsc = '' |
| 900 |
|
old_name = '' |
| 901 |
|
last_displayed = '' |
| 902 |
|
releases = ('sid', 'wheezy', 'squeeze', 'lenny') |
| 903 |
|
for (pkg_name, bug_name, release, desc) in self.db.cursor().execute( |
| 904 |
|
"""SELECT DISTINCT sp.name, st.bug_name, sp.release, |
| 905 |
|
bugs.description |
| 906 |
|
FROM source_package_status AS st, source_packages AS sp, bugs |
| 907 |
|
WHERE st.vulnerable > 0 AND sp.rowid = st.package |
| 908 |
|
AND ( sp.release = ? OR sp.release = ? OR sp.release = ? |
| 909 |
|
OR sp.release = ? ) AND st.urgency == 'unimportant' |
| 910 |
|
AND sp.subrelease = '' AND st.bug_name == bugs.name |
| 911 |
|
ORDER BY sp.name, st.bug_name""", releases): |
| 912 |
|
|
| 913 |
|
if old_bug == '': |
| 914 |
|
old_bug = bug_name |
| 915 |
|
old_pkg = pkg_name |
| 916 |
|
old_dsc = desc |
| 917 |
|
elif old_bug != bug_name: |
| 918 |
|
if old_pkg == last_displayed: |
| 919 |
|
to_display = '' |
| 920 |
|
else: |
| 921 |
|
to_display = old_pkg |
| 922 |
|
yield to_display, self.make_xref(url, old_bug), old_dsc, ', '.join(outrel) |
| 923 |
|
last_displayed = old_pkg |
| 924 |
|
old_bug = bug_name |
| 925 |
|
old_pkg = pkg_name |
| 926 |
|
old_dsc = desc |
| 927 |
|
outrel = [] |
| 928 |
|
outrel.append( release ) |
| 929 |
|
yield old_pkg, self.make_xref(url, old_bug), old_dsc, ', '.join(outrel) |
| 930 |
|
|
| 931 |
|
return self.create_page(url, 'Packages that have open unimportant issues', |
| 932 |
|
[P("""This page lists packages that are affected by issues |
| 933 |
|
that are considered unimportant from a security perspective. |
| 934 |
|
These issues are thought to be unexploitable or uneffective |
| 935 |
|
in most situations (for example, browser denial-of-services)."""), |
| 936 |
|
make_table(gen(), caption=('Package', 'Bug', 'Description', 'Releases'))]) |
| 937 |
|
|
| 938 |
def page_status_itp(self, path, params, url): |
def page_status_itp(self, path, params, url): |
| 939 |
def gen(): |
def gen(): |
| 1125 |
make_table(gen(), |
make_table(gen(), |
| 1126 |
caption=("Bug", "Description"))]) |
caption=("Bug", "Description"))]) |
| 1127 |
|
|
| 1128 |
|
def page_data_pts(self, path, params, url): |
| 1129 |
|
data = [] |
| 1130 |
|
for pkg, bugs in self.db.cursor().execute( |
| 1131 |
|
"""SELECT package, COUNT(DISTINCT bug) FROM |
| 1132 |
|
(SELECT package, bug, urgency FROM stable_status |
| 1133 |
|
UNION ALL SELECT DISTINCT sp.name, st.bug_name, st.urgency |
| 1134 |
|
FROM source_package_status AS st, source_packages AS sp |
| 1135 |
|
WHERE st.vulnerable AND st.urgency <> 'unimportant' |
| 1136 |
|
AND sp.rowid = st.package AND sp.release = 'sid' |
| 1137 |
|
AND sp.subrelease = '') x WHERE urgency <> 'unimportant' |
| 1138 |
|
GROUP BY package ORDER BY package"""): |
| 1139 |
|
data.append(pkg) |
| 1140 |
|
data.append(':') |
| 1141 |
|
data.append(str(bugs)) |
| 1142 |
|
data.append('\n') |
| 1143 |
|
return BinaryResult(''.join(data)) |
| 1144 |
|
|
| 1145 |
def page_debsecan(self, path, params, url): |
def page_debsecan(self, path, params, url): |
| 1146 |
obj = '/'.join(path) |
obj = '/'.join(path) |
| 1147 |
data = self.db.getDebsecan(obj) |
data = self.db.getDebsecan(obj) |
| 1163 |
"Testing Security Team"), |
"Testing Security Team"), |
| 1164 |
" - ", A(url.absolute("http://www.debian.org/security/"), |
" - ", A(url.absolute("http://www.debian.org/security/"), |
| 1165 |
"Debian Security"), |
"Debian Security"), |
| 1166 |
" - ", A(url.absolute |
" - ", A(url.absolute("http://anonscm.debian.org/viewvc/secure-testing/bin/tracker_service.py?view=markup"), |
| 1167 |
("http://www.enyo.de/fw/impressum.html"), |
"Source"), |
| 1168 |
"Imprint"))) |
" ", A(url.absolute("svn://svn.debian.org/secure-testing"), "(SVN)"), |
| 1169 |
|
)) |
| 1170 |
if search_in_page: |
if search_in_page: |
| 1171 |
on_load = "selectSearch()" |
on_load = "selectSearch()" |
| 1172 |
else: |
else: |
| 1194 |
def url_nvd(self, url, name): |
def url_nvd(self, url, name): |
| 1195 |
return url.absolute("http://web.nvd.nist.gov/view/vuln/detail", |
return url.absolute("http://web.nvd.nist.gov/view/vuln/detail", |
| 1196 |
vulnId=name) |
vulnId=name) |
| 1197 |
|
def url_rhbug(self, url, name): |
| 1198 |
|
return url.absolute("https://bugzilla.redhat.com/show_bug.cgi", |
| 1199 |
|
id=name) |
| 1200 |
|
def url_ubuntu_bug(self, url, name): |
| 1201 |
|
return url.absolute("http://people.canonical.com/~ubuntu-security/cve/%s" % name) |
| 1202 |
|
def url_gentoo_bug(self, url, name): |
| 1203 |
|
return url.absolute("http://bugs.gentoo.org/show_bug.cgi", id=name) |
| 1204 |
|
|
| 1205 |
def url_dsa(self, url, dsa, re_dsa=re.compile(r'^DSA-(\d+)(?:-\d+)?$')): |
def url_dsa(self, url, dsa, re_dsa=re.compile(r'^DSA-(\d+)(?:-\d+)?$')): |
| 1206 |
match = re_dsa.match(dsa) |
match = re_dsa.match(dsa) |
| 1231 |
return url.scriptRelativeFull("source-package/" + package) |
return url.scriptRelativeFull("source-package/" + package) |
| 1232 |
else: |
else: |
| 1233 |
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) |
|
| 1234 |
|
|
| 1235 |
def make_xref(self, url, name): |
def make_xref(self, url, name): |
| 1236 |
return A(url.scriptRelative(name), name) |
return A(url.scriptRelative(name), name) |
| 1252 |
if name is None: |
if name is None: |
| 1253 |
name = cve |
name = cve |
| 1254 |
return A(self.url_nvd(url, cve), name) |
return A(self.url_nvd(url, cve), name) |
| 1255 |
|
|
| 1256 |
|
def make_rhbug_ref(self, url, cve, name=None): |
| 1257 |
|
if name is None: |
| 1258 |
|
name = cve |
| 1259 |
|
return A(self.url_rhbug(url, cve), name) |
| 1260 |
|
|
| 1261 |
|
def make_ubuntu_bug_ref(self, url, cve, name=None): |
| 1262 |
|
if name is None: |
| 1263 |
|
name = cve |
| 1264 |
|
return A(self.url_ubuntu_bug(url, cve), name) |
| 1265 |
|
|
| 1266 |
|
def make_gentoo_bug_ref(self, url, cve, name=None): |
| 1267 |
|
if name is None: |
| 1268 |
|
name = cve |
| 1269 |
|
return A(self.url_gentoo_bug(url, cve), name) |
| 1270 |
|
|
| 1271 |
def make_dsa_ref(self, url, dsa, name=None): |
def make_dsa_ref(self, url, dsa, name=None): |
| 1272 |
if name is None: |
if name is None: |
| 1286 |
if title is None: |
if title is None: |
| 1287 |
title = pkg |
title = pkg |
| 1288 |
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)) |
|
| 1289 |
|
|
| 1290 |
def make_red(self, contents): |
def make_red(self, contents): |
| 1291 |
return SPAN(contents, _class="red") |
return SPAN(contents, _class="red") |
| 1292 |
|
|
| 1293 |
|
def make_purple(self, contents): |
| 1294 |
|
return SPAN(contents, _class="purple") |
| 1295 |
|
|
| 1296 |
def make_dangerous(self, contents): |
def make_dangerous(self, contents): |
| 1297 |
return SPAN(contents, _class="dangerous") |
return SPAN(contents, _class="dangerous") |
| 1298 |
|
|
| 1299 |
def pre_dispatch(self): |
def pre_dispatch(self): |
| 1300 |
self.db.refresh() |
pass |
| 1301 |
|
|
| 1302 |
TrackerService(socket_name, db_name).run() |
TrackerService(socket_name, db_name).run() |