/[secure-testing]/bin/tracker_service.py
ViewVC logotype

Contents of /bin/tracker_service.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2485 - (hide annotations) (download) (as text)
Thu Oct 20 09:03:03 2005 UTC (7 years, 7 months ago) by fw
File MIME type: text/script
File size: 34702 byte(s)
 r628@deneb:  fw | 2005-10-14 10:35:43 +0200
 bin/tracker_service.py (TrackerService.page_redirect):
   New method.  Invokes page_object_or_redirect.
 (TrackerService.page_object):
   Reimplement in terms of page_object_or_redirect.
 (TrackerService.page_object_or_redirect):
   Display an object page, or redirect to the correct page
   (which can be external).
1 fw 2482 #!/usr/bin/python
2    
3     import sys
4     sys.path.insert(0,'../lib/python')
5    
6     if len(sys.argv) <> 3:
7     print "usage: python tracker_serivce.py SOCKET-PATH DATABASE-PATH"
8     sys.exit(1)
9     socket_name = sys.argv[1]
10     db_name = sys.argv[2]
11    
12     import bugs
13     import re
14     import security_db
15     from web_support import *
16    
17     class TrackerService(WebService):
18     head_contents = compose(STYLE(
19     """h1 { font-size : 144%; }
20     h2 { font-size : 120%; }
21     h3 { font-size : 100%; }
22    
23     table { padding-left : 1.5em }
24     td, th { text-align : left;
25     padding-left : 0.25em;
26     padding-right : 0.25em; }
27     td { vertical-align: baseline }
28     span.red { color: red; }
29     span.dangerous { color: rgb(191,127,0); }
30     """), SCRIPT('''var old_query_value = "";
31    
32     function selectSearch() {
33     document.searchForm.query.focus();
34     }
35    
36     function onSearch(query) {
37     if (old_query_value == "") {
38     if (query.length > 5) {
39     old_query_value = query;
40     document.searchForm.submit();
41     } else {
42     old_query_value = query;
43     }
44     }
45     }
46     ''')).toHTML()
47    
48     def __init__(self, socket_name, db_name):
49     WebService.__init__(self, socket_name)
50     self.db = security_db.DB(db_name)
51     self.register('', self.page_home)
52     self.register('*', self.page_object)
53 fw 2485 self.register('redirect/*', self.page_redirect)
54 fw 2482 self.register('source-package/*', self.page_source_package)
55     self.register('binary-package/*', self.page_binary_package)
56     self.register('status/release/stable', self.page_status_release_stable)
57     self.register('status/release/testing',
58     self.page_status_release_testing)
59     self.register('status/release/unstable',
60     self.page_status_release_unstable)
61     self.register('status/dtsa-candidates',
62     self.page_status_dtsa_candidates)
63     self.register('status/todo', self.page_status_todo)
64     self.register('status/itp', self.page_status_itp)
65     self.register('data/unknown-packages', self.page_data_unknown_packages)
66     self.register('data/missing-epochs', self.page_data_missing_epochs)
67     self.register('data/releases', self.page_data_releases)
68     self.register('data/funny-versions', self.page_data_funny_versions)
69    
70     def page_home(self, path, params, url):
71     query = params.get('query', ('',))[0]
72     if query:
73     if '/' in query:
74     return self.page_not_found(url, query)
75     else:
76     return RedirectResult(url.scriptRelativeFull(query))
77    
78     return self.create_page(
79     url, 'Security Bug Tracker',
80     [P(
81     """This is the experimental issue tracker for Debian's testing
82     security team. Keep in mind that this is merely a prototype.
83     Please report any problems to """,
84     A("mailto:fw@deneb.enyo.de", "Florian Weimer"),
85     """.Note that some of the data presented here is known
86     to be wrong (see below), but the data for the testing suite
87     should be fine."""),
88     make_menu(
89     url.scriptRelative,
90     ('status/release/stable',
91     'Vulnerable packages in the stable suite'),
92     ('status/release/testing',
93     'Vulnerable packages in the testing suite'),
94     ('status/release/unstable',
95     'Vulnerable packages in the unstable suite'),
96     ('status/dtsa-candidates', "Candidates for DTSAs"),
97     ('status/todo', 'TODO items'),
98     ('status/itp', 'ITPs with potential security issues'),
99     ('data/unknown-packages',
100     'Packages names not found in the archive'),
101     ('data/missing-epochs',
102     'Package versions which might lack an epoch'),
103     ('data/funny-versions',
104     'Packages with strange version numbers'),
105     ('data/releases',
106     'Covered Debian releases and architectures (slow)'),
107     self.make_search_button(url)),
108    
109     H2("A few notes on data sources"),
110     P("""Data in this tracker comes solely from the bug database
111     which is maintained by Debian's testing security team in their
112     Subversion repository. All external data (this includes
113     Debian bug reports and official Debian security advisories)
114     must be added to this database before it appears here, and there
115     can be some delay before this happens."""),
116     P("""At the moment, the database only contains information which is
117     relevant for tracking the security status of the stable, testing and
118     unstable suites. This means that data for oldstable is likely wrong.""")],
119     search_in_page=True)
120    
121     def page_object(self, path, params, url):
122     obj = path[0]
123 fw 2485 return self.page_object_or_redirect(url, obj, False)
124 fw 2482
125 fw 2485 def page_redirect(self, path, params, url):
126     obj = path[0]
127     return self.page_object_or_redirect(url, obj, True)
128    
129     def page_object_or_redirect(self, url, obj, redirect):
130     c = self.db.cursor()
131    
132 fw 2482 if not obj:
133     # Redirect to start page.
134     return RedirectResult(url.scriptRelativeFull(""))
135    
136     if 'A' <= obj[0] <= 'Z':
137     # Bug names start with a capital letter.
138 fw 2485 return self.page_bug(url, obj, redirect)
139 fw 2482
140     bugnumber = 0
141     try:
142     bugnumber = int(obj)
143     except ValueError:
144     pass
145     if bugnumber:
146 fw 2485 buglist = list(self.db.getBugsFromDebianBug(c, bugnumber))
147     if buglist:
148     return self.page_debian_bug(url, bugnumber, buglist)
149     if redirect:
150     return RedirectResult(self.url_debian_bug(url, str(bugnumber)),
151     permanent=False)
152 fw 2482
153     if self.db.isSourcePackage(c, obj):
154     return RedirectResult(self.url_source_package(url, obj, full=True))
155     if self.db.isBinaryPackage(c, obj):
156     return RedirectResult(self.url_binary_package(url ,obj, full=True))
157    
158     return self.page_not_found(url, obj)
159    
160 fw 2485 def page_bug(self, url, name, redirect):
161 fw 2482 cursor = self.db.cursor()
162     try:
163     bug = bugs.BugFromDB(cursor, name)
164     except ValueError:
165 fw 2485 if redirect:
166     if name[0:4] in ('CAN-', 'CVE-'):
167     return RedirectResult(self.url_cve(url, name),
168     permanent=False)
169 fw 2482 return self.page_not_found(url, name)
170 fw 2485 if bug.name <> name or redirect:
171 fw 2482 # Show the normalized bug name in the browser address bar.
172     return RedirectResult(url.scriptRelativeFull(bug.name))
173    
174     page = []
175    
176     def gen_header():
177     yield B("Name"), bug.name
178    
179     source = bug.name.split('-')[0]
180     if source in ('CAN', 'CVE'):
181     source_xref = self.make_cve_ref(url, bug.name, 'CVE')
182     elif source == 'DSA':
183     source_xref = self.make_dsa_ref(url, bug.name, 'Debian')
184     elif source == 'DTSA':
185     source_xref = 'Debian Testing Security Team'
186     elif source == 'FAKE':
187     source_xref = (
188     'Automatically generated temporary name. Not for external reference.')
189     else:
190     source_xref = None
191    
192     if source_xref:
193     yield B("Source"), source_xref
194    
195     if bug.description:
196     yield B("Description"), bug.description
197    
198     xref = list(self.db.getBugXrefs(cursor, bug.name))
199     if xref:
200     yield B("References"), self.make_xref_list(url, xref)
201    
202     debian_bugs = bug.getDebianBugs(cursor)
203     if debian_bugs:
204     yield (B("Debian Bugs"),
205     self.make_debian_bug_list(url, debian_bugs))
206    
207     if not bug.not_for_us:
208     for (release, status, reason) in bug.getStatus(cursor):
209     if status <> 'fixed':
210     reason = self.make_red(reason)
211     yield B('Status of %s' % release), reason
212    
213     page.append(make_table(gen_header()))
214    
215     if bug.notes:
216     page.append(H2("Vulnerable and fixed packages"))
217    
218     def gen_source():
219     old_pkg = ''
220     for (package, release, version, vulnerable) \
221     in self.db.getSourcePackages(cursor, bug.name):
222     if package == old_pkg:
223     package = ''
224     else:
225     old_pkg = package
226     package = compose(
227     self.make_source_package_ref(url, package),
228     " (", self.make_pts_ref(url, package, 'PTS'), ")")
229     if vulnerable:
230     vuln = self.make_red('vulnerable')
231     version = self.make_red(version)
232     else:
233     vuln = 'fixed'
234    
235     yield package, ', '.join(release), version, vuln
236    
237     page.append(make_table(gen_source(),
238     caption=("Source Package", "Release", "Version", "Status"),
239     introduction=P('The table below lists information on source packages.')))
240    
241     def gen_binary():
242     old_pkg = ''
243     for (packages, releases, version, archs, vulnerable) \
244     in self.db.getBinaryPackages(cursor, bug.name):
245     pkg = ', '.join(packages)
246     if pkg == old_pkg:
247     packages = ''
248     else:
249     old_pkg = pkg
250     packages = self.make_binary_packages_ref(url, packages)
251    
252     if vulnerable:
253     vuln = self.make_red('vulnerable')
254     version = self.make_red(version)
255     else:
256     vuln = 'fixed'
257     yield (packages,
258     ', '.join(releases),
259     version, vuln,
260     ', '.join(archs))
261    
262     page.append(make_table(gen_binary(),
263     caption=("Binary Package", "Release", "Version", "Status",
264     "Architecures"),
265     introduction=P("The next table lists affected binary packages.")))
266    
267     def gen_data():
268     notes_sorted = bug.notes[:]
269     notes_sorted.sort(lambda a, b: cmp(a.package, b.package))
270     for n in notes_sorted:
271     if n.release:
272     rel = str(n.release)
273     else:
274     rel = '(unstable)'
275     urgency = str(n.urgency)
276     if n.fixed_version:
277     ver = str(n.fixed_version)
278     if ver == '0':
279     ver = '(not affected)'
280     urgency = ''
281     else:
282     ver = self.make_red('(unfixed)')
283    
284     pkg = n.package
285     pkg_kind = n.package_kind
286     if pkg_kind == 'source':
287     pkg = self.make_source_package_ref(url, pkg)
288     elif pkg_kind == 'binary':
289     pkg = self.make_binary_package_ref(url, pkg)
290     elif pkg_kind == 'itp':
291     pkg_kind = 'ITP'
292     rel = ''
293     ver = ''
294     urgency = ''
295    
296     bugs = n.bugs
297     bugs.sort()
298     bugs = make_list(
299     map(lambda x: self.make_debian_bug(url, x), bugs))
300     if n.bug_origin:
301     origin = self.make_xref(url, n.bug_origin)
302     else:
303     origin = ''
304     yield (pkg, pkg_kind, rel, ver, urgency, origin, bugs)
305    
306     page.append(
307     make_table(gen_data(),
308     caption=("Package", "Type", "Release", "Fixed Version",
309     "Urgency", "Origin", "Debian Bugs"),
310     introduction=P("The information above is based on the following data on fixed versions.")))
311    
312     if bug.comments:
313     page.append(H2("Notes"))
314     def gen_comments():
315     for (t, c) in bug.comments:
316     yield c
317     page.append(make_pre(gen_comments()))
318    
319     return self.create_page(url, bug.name, page)
320    
321 fw 2485 def page_debian_bug(self, url, bugnumber, buglist):
322     if len(buglist) == 1:
323     # Single issue, redirect.
324     return RedirectResult(url.scriptRelativeFull(buglist[0][0]))
325 fw 2482
326 fw 2485 def gen():
327     for (name, urgency, description) in buglist:
328     if urgency == "unknown":
329     urgency = ""
330     yield self.make_xref(url, name), urgency, description
331 fw 2482
332 fw 2485 return self.create_page(
333     url, "Information related to Debian bug #%d" % bugnumber,
334     [P("The following issues reference to Debian bug ",
335     self.make_debian_bug(url, bugnumber), ":"),
336     make_table(gen(),
337     caption=("Name", "Urgency", "Description"))])
338 fw 2482
339     def page_not_found(self, url, query):
340     return self.create_page(url, 'Not found',
341     [P('Your query ',
342     CODE(query),
343     ' matched no results.')],
344     status=404)
345    
346     def page_source_package(self, path, params, url):
347     pkg = path[0]
348    
349     def gen_versions():
350     for (releases, version) in self.db.getSourcePackageVersions(
351     self.db.cursor(), pkg):
352     yield ', '.join(releases), version
353     def gen_binary():
354     for (packages, releases, archs, version) \
355     in self.db.getBinaryPackagesForSource(
356     self.db.cursor(), pkg):
357     yield (self.make_binary_packages_ref(url, packages),
358     ', '.join(releases), version, ', '.join(archs))
359     def gen_bug_list(lst):
360     for (bug, description) in lst:
361     yield self.make_xref(url, bug), description
362    
363     return self.create_page(
364     url, "Information on source package " + pkg,
365     [make_menu(lambda x: x,
366     (self.url_pts(url, pkg),
367     pkg + ' in the Package Tracking System'),
368     (self.url_debian_bug_pkg(url, pkg),
369     pkg + ' in the Bug Tracking System'),
370     (self.url_testing_status(url, pkg),
371     pkg + ' in the testing migration checker')),
372     H2("Available versions"),
373     make_table(gen_versions(), caption=("Release", "Version")),
374    
375     H2("Available binary packages"),
376     make_table(gen_binary(),
377     caption=('Package', 'Release', 'Version', 'Architectures'),
378     replacement="""No binary packages are recorded in this database.
379     This probably means that the package is architecture-specific, and the
380     architecture is currently not tracked."""),
381    
382     H2("Open issues"),
383     make_table(gen_bug_list(self.db.getBugsForSourcePackage
384     (self.db.cursor(), pkg, True)),
385     caption=('Bug', 'Description'),
386     replacement='No known open issues.'),
387    
388     H2("Resolved issues"),
389     make_table(gen_bug_list(self.db.getBugsForSourcePackage
390     (self.db.cursor(), pkg, False)),
391     caption=('Bug', 'Description'),
392     replacement='No known resolved issues.')])
393    
394     def page_binary_package(self, path, params, url):
395     pkg = path[0]
396    
397     def gen_versions():
398     for (releases, source, version, archs) \
399     in self.db.getBinaryPackageVersions(self.db.cursor(), pkg):
400     yield (', '.join(releases),
401     self.make_source_package_ref(url, source),
402     version, ', '.join(archs))
403     def gen_bug_list(lst):
404     for (bug, description) in lst:
405     yield self.make_xref(url, bug), description
406    
407     return self.create_page(
408     url, "Information on binary package " + pkg,
409     [make_menu(lambda x: x,
410     (self.url_debian_bug_pkg(url, pkg),
411     pkg + ' in the Bug Tracking System')),
412     H2("Available versions"),
413     make_table(gen_versions(),
414     caption=("Release", "Source", "Version", "Architectures")),
415    
416     H2("Open issues"),
417     make_table(gen_bug_list(self.db.getBugsForBinaryPackage
418     (self.db.cursor(), pkg, True)),
419     caption=('Bug', 'Description'),
420     replacement='No known open issues.'),
421    
422     H2("Resolved issues"),
423     make_table(gen_bug_list(self.db.getBugsForBinaryPackage
424     (self.db.cursor(), pkg, False)),
425     caption=('Bug', 'Description'),
426     replacement='No known resolved issues.'),
427    
428     H2("Non-issues"),
429     make_table(gen_bug_list(self.db.getNonBugsForBinaryPackage
430     (self.db.cursor(), pkg)),
431     caption=('Bug', 'Description'),
432     replacement="""No known issues which do not affect
433     this package, but still reference it.""")])
434    
435     def page_status_release_stable(self, path, params, url):
436     def gen():
437     old_pkg_name = ''
438     for (pkg_name, bug_name, archive, urgency) in \
439     self.db.cursor().execute(
440     """SELECT package, bug, section, urgency FROM stable_status"""):
441     if pkg_name == old_pkg_name:
442     pkg_name = ''
443     else:
444     old_pkg_name = pkg_name
445     if archive <> 'main':
446     pkg_name = "%s (%s)" % (pkg_name, archive)
447    
448     if urgency == 'unknown':
449     urgency = ''
450     elif urgency == 'high':
451     urgency = self.make_red(urgency)
452    
453     yield pkg_name, self.make_xref(url, bug_name), urgency
454    
455     return self.create_page(
456     url, 'Vulnerable source packages in the stable suite',
457     [make_table(gen(), caption=("Package", "Bug", "Urgency"))])
458    
459     def page_status_release_testing(self, path, params, url):
460     def gen():
461     old_pkg_name = ''
462     for (pkg_name, bug_name, archive, urgency,
463     sid_vulnerable, ts_fixed) in self.db.cursor().execute(
464     """SELECT package, bug, section, urgency, unstable_vulnerable,
465     testing_security_fixed
466     FROM testing_status"""):
467     if pkg_name == old_pkg_name:
468     pkg_name = ''
469     else:
470     old_pkg_name = pkg_name
471     if archive <> 'main':
472     pkg_name = "%s (%s)" % (pkg_name, archive)
473    
474     if ts_fixed:
475     status = 'fixed in testing-security'
476     else:
477     if sid_vulnerable:
478     status = self.make_red('unstable is vulnerable')
479     else:
480     status = self.make_dangerous('fixed in unstable')
481    
482     if urgency == 'unknown':
483     urgency = ''
484    
485     yield (pkg_name, self.make_xref(url, bug_name),
486     urgency, status)
487    
488     return self.create_page(
489     url, 'Vulnerable source packages in the testing suite',
490     [make_menu(url.scriptRelative,
491     ("status/dtsa-candidates", "Candidates for DTSAs")),
492     make_table(gen(), caption=("Package", "Bug"))])
493    
494     def page_status_release_unstable(self, path, params, url):
495     def gen():
496     old_pkg_name = ''
497     for (pkg_name, bug_name, section, urgency) \
498     in self.db.cursor().execute(
499     """SELECT DISTINCT sp.name, st.bug_name,
500     sp.archive, st.urgency
501     FROM source_package_status AS st, source_packages AS sp
502     WHERE st.vulnerable AND st.urgency <> 'unimportant'
503     AND sp.rowid = st.package AND sp.release = 'sid'
504     AND sp.subrelease = ''
505     ORDER BY sp.name, st.bug_name"""):
506     if pkg_name == old_pkg_name:
507     pkg_name = ''
508     else:
509     old_pkg_name = pkg_name
510     if section <> 'main':
511     pkg_name = "%s (%s)" % (pkg_name, section)
512     else:
513     pkg_name = self.make_xref(url, pkg_name)
514    
515     if urgency == 'unknown':
516     urgency = ''
517     elif urgency == 'high':
518     urgency = self.make_red(urgency)
519    
520     yield pkg_name, self.make_xref(url, bug_name), urgency
521    
522    
523     return self.create_page(
524     url, 'Vulnerable source packages in the testing suite',
525     [P("""Note that the list below is based on source packages.
526     This means that packages are not listed here once a new,
527     fixed source version has been uploaded to the archive, even
528     if there are still some vulnerably binary packages present
529     in the archive."""),
530     make_table(gen(), caption=('Package', 'Bug', 'Urgency'))])
531    
532     def page_status_dtsa_candidates(self, path, params, url):
533     def gen():
534     old_pkg_name = ''
535     for (pkg_name, bug_name, archive, urgency, stable_later) \
536     in self.db.cursor().execute(
537     """SELECT package, bug, section, urgency,
538     (SELECT testing.version_id < stable.version_id
539     FROM source_packages AS testing, source_packages AS stable
540     WHERE testing.name = testing_status.package
541     AND testing.release = 'etch'
542     AND testing.subrelease = ''
543     AND testing.archive = testing_status.section
544     AND stable.name = testing_status.package
545     AND stable.release = 'sarge'
546     AND stable.subrelease = 'security'
547     AND stable.archive = testing_status.section)
548     FROM testing_status
549     WHERE (NOT unstable_vulnerable)
550     AND (NOT testing_security_fixed)"""):
551     if pkg_name == old_pkg_name:
552     pkg_name = ''
553     migration = ''
554     else:
555     old_pkg_name = pkg_name
556     migration = A(self.url_testing_status(url, pkg_name),
557     "check")
558     if archive <> 'main':
559     pkg_name = "%s (%s)" % (pkg_name, archive)
560     else:
561     pkg_name = self.make_source_package_ref(url, pkg_name)
562    
563     if urgency == 'unknown':
564     urgency = ''
565     elif urgency == 'high':
566     urgency = self.make_red(urgency)
567    
568     if stable_later:
569     notes = "(fixed in stable?)"
570     else:
571     notes = ''
572    
573     yield (pkg_name, migration, self.make_xref(url, bug_name),
574     urgency, notes)
575    
576     return self.create_page(
577     url, "Candidates for DTSAs",
578     [P("""The table below lists packages which are fixed
579     in unstable, but unfixed in testing. Use the testing migration
580     return web_supporttracker to find out why they have not entered
581     return web_supporttesting yet."""),
582     make_menu(url.scriptRelative,
583     ("status/release/testing",
584     "List of vulnerable packages in testing")),
585     make_table(gen(),
586     caption=("Package", "Migration", "Bug", "Urgency"))])
587    
588     def page_status_todo(self, path, params, url):
589     def gen():
590     for (bug, description) in self.db.getTODOs():
591     yield self.make_xref(url, bug), description
592     return self.create_page(
593     url, "Bugs with TODO items",
594     [make_table(gen(),
595     caption=("Bug", "Description"))])
596    
597     def page_status_itp(self, path, params, url):
598     def gen():
599     old_pkg = ''
600     for pkg, bugs, debian_bugs in self.db.getITPs(self.db.cursor()):
601     if pkg == old_pkg:
602     pkg = ''
603     else:
604     old_pkg = pkg
605     yield (pkg, self.make_xref_list(url, bugs),
606     self.make_debian_bug_list(url, debian_bugs))
607     return self.create_page(
608     url, "ITPs with potential security issues",
609     [make_table(gen(), caption=("Package", "Issue", "Debian Bugs"),
610     replacement="No ITP bugs are currently known.")])
611    
612     def page_data_unknown_packages(self, path, params, url):
613     def gen():
614     for name, bugs in self.db.getUnknownPackages(self.db.cursor()):
615     yield name, self.make_xref_list(url, bugs)
616     return self.create_page(
617     url, "Unknown packages",
618     [P("""Sometimes, a package referenced in a bug report
619     cannot be found in the database. This can be the result of a spelling
620     return web_supporterror, or a historic entry refers to a
621     return web_supportpackage which is no longer in the archive."""),
622     make_table(gen(), caption=("Package", "Bugs"),
623     replacement="No unknown packages are referenced in the database.")])
624    
625     def page_data_missing_epochs(self, path, params, url):
626     def gen():
627     old_bug = ''
628     old_pkg = ''
629     for bug, pkg, ver1, ver2 in self.db.cursor().execute(
630     """SELECT DISTINCT bug_name, n.package,
631     n.fixed_version, sp.version
632     FROM package_notes AS n, source_packages AS sp
633     WHERE n.package_kind = 'source'
634     AND n.fixed_version NOT LIKE '%:%'
635     AND n.fixed_version <> '0'
636     AND n.bug_origin = ''
637     AND sp.name = n.package
638     AND sp.version LIKE '%:%'
639     ORDER BY bug_name, package"""):
640     if bug == old_bug:
641     bug = ''
642     else:
643     old_bug = bug
644     old_pkg = ''
645     bug = self.make_xref(url, bug)
646     if pkg == old_pkg:
647     pkg = ''
648     else:
649     old_pkg = pkg
650     pkg = self.make_source_package_ref(url, pkg)
651     yield bug, pkg, ver1, ver2
652    
653     return self.create_page(
654     url, "Missing epochs in package versions",
655     [make_table(gen(),
656     caption=("Bug", "Package", "Version 1", "Version 2"),
657     replacement="No source package version with missing epochs.")])
658    
659     def page_data_releases(self, path, params, url):
660     def gen():
661     for (rel, subrel, archive, sources, archs) \
662     in self.db.availableReleases():
663     if sources:
664     sources = 'yes'
665     else:
666     sources = 'no'
667     yield rel, subrel, archive, sources, make_list(archs)
668     return self.create_page(
669     url, "Available releases",
670     [P("""The security issue database is checked against
671     the Debian releases listed in the table below."""),
672     make_table(gen(),
673     caption=("Release", "Subrelease", "Archive",
674     "Sources", "Architectures"))])
675    
676     def page_data_funny_versions(self, path, params, url):
677     def gen():
678     for name, release, archive, version, source_version \
679     in self.db.getFunnyPackageVersions():
680     yield name, release, archive, source_version, version
681    
682     return self.create_page(
683     url, "Version conflicts between source/binary packages",
684     [P("""The table below lists source packages
685     which have a binary package of the same name, but with a different
686     version. This means that extra care is necessary to determine
687     the version of a package which has been fixed. (Note that
688     the bug tracker prefers source versions to binary versions
689     in this case.)"""),
690     make_table(gen(),
691     caption=("Package",
692     "Release",
693     "Archive",
694     "Source Version",
695     "Binary Version")),
696     P("""Technically speaking, these version numbering is fine,
697     but it makes version-based bug tracking quite difficult for these packages."""),
698     P("""There are many binary packages which are built from source
699     packages with different version numbering schemes. However, as
700     long as none of the binary packages carries the same name as the
701     source package, most confusion is avoided or can be easily
702     explained.""")])
703    
704    
705     def create_page(self, url, title, body, search_in_page=False, status=200):
706     append = body.append
707     append(HR())
708     if not search_in_page:
709     append(self.make_search_button(url))
710     append(P(A(url.scriptRelative(""), "Home"),
711     " - ", A(url.absolute("http://secure-testing.debian.net/"),
712     "Testing Security Team"),
713     " - ", A(url.absolute("http://www.debian.org/security/"),
714     "Debian Security"),
715     " - ", A(url.absolute
716     ("http://www.enyo.de/fw/impressum.html"),
717     "Imprint")))
718     if search_in_page:
719     on_load = "selectSearch()"
720     else:
721     on_load = None
722     return HTMLResult(self.add_title(title, body,
723     head_contents=self.head_contents,
724     body_attribs={'onload': on_load}),
725     doctype=self.html_dtd(),
726     status=status)
727    
728     def make_search_button(self, url):
729     return FORM("Search for package or bug name: ",
730     INPUT(type='text', name='query',
731     onkeyup="onSearch(this.value)",
732     onmousemove="onSearch(this.value)"),
733     INPUT(type='submit', value='Go'),
734     method='get',
735     action=url.scriptRelative(''))
736    
737     def url_cve(self, url, name):
738     return url.absolute("http://cve.mitre.org/cgi-bin/cvename.cgi",
739     name=name)
740     def url_dsa(self, url, dsa, re_dsa=re.compile(r'^DSA-(\d+)(?:-\d+)?$')):
741     match = re_dsa.match(dsa)
742     if match:
743     # We must determine the year because there is no generic URL.
744     (number,) = match.groups()
745     for (date,) in self.db.cursor().execute(
746     "SELECT release_date FROM bugs WHERE name = ?", (dsa,)):
747     (y, m, d) = date.split('-')
748     return url.absolute("http://www.debian.org/security/%d/dsa-%d"
749     % (int(y), int(number)))
750     return None
751    
752     def url_debian_bug(self, url, debian):
753     return url.absolute("http://bugs.debian.org/cgi-bin/bugreport.cgi",
754     bug=str(debian))
755     def url_debian_bug_pkg(self, url, debian):
756     return url.absolute("http://bugs.debian.org/cgi-bin/pkgreport.cgi",
757     pkg=debian)
758     def url_pts(self, url, package):
759     return url.absolute("http://packages.qa.debian.org/common/index.html",
760     src=package)
761     def url_testing_status(self, url, package):
762     return url.absolute("http://bjorn.haxx.se/debian/testing.pl",
763     package=package)
764     def url_source_package(self, url, package, full=False):
765     if full:
766     return url.scriptRelativeFull("source-package/" + package)
767     else:
768     return url.scriptRelative("source-package/" + package)
769     def url_binary_package(self, url, package, full=False):
770     if full:
771     return url.scriptRelativeFull("binary-package/" + package)
772     else:
773     return url.scriptRelative("binary-package/" + package)
774    
775     def make_xref(self, url, name):
776     return A(url.scriptRelative(name), name)
777    
778     def make_xref_list(self, url, lst, separator=', '):
779     return make_list(map(lambda x: self.make_xref(url, x), lst), separator)
780    
781     def make_debian_bug(self, url, debian):
782     return A(self.url_debian_bug(url, debian), str(debian))
783     def make_debian_bug_list(self, url, lst):
784     return make_list(map(lambda x: self.make_debian_bug(url, x), lst))
785    
786     def make_cve_ref(self, url, cve, name=None):
787     if name is None:
788     name = cve
789     return A(self.url_cve(url, cve), name)
790    
791     def make_dsa_ref(self, url, dsa, name=None):
792     if name is None:
793     name = dsa
794     u = self.url_dsa(url, dsa)
795     if u:
796     return A(u, name)
797     else:
798     return name
799    
800     def make_pts_ref(self, url, pkg, name=None):
801     if name is None:
802     name = pkg
803     return A(self.url_pts(url, pkg), name)
804    
805     def make_source_package_ref(self, url, pkg, title=None):
806     if title is None:
807     title = pkg
808     return A(self.url_source_package(url, pkg), title)
809     def make_binary_package_ref(self, url, pkg, title=None):
810     if title is None:
811     title = pkg
812     return A(self.url_binary_package(url, pkg), title)
813     def make_binary_packages_ref(self, url, lst):
814     assert type(lst) <> types.StringType
815     return make_list(map(lambda x: self.make_binary_package_ref(url, x),
816     lst))
817    
818     def make_red(self, contents):
819     return SPAN(contents, _class="red")
820    
821     def make_dangerous(self, contents):
822     return SPAN(contents, _class="dangerous")
823    
824     def pre_dispatch(self):
825     self.db.refresh()
826    
827     TrackerService(socket_name, db_name).run()

Properties

Name Value
svn:mime-type text/script

  ViewVC Help
Powered by ViewVC 1.1.5