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

Diff of /bin/tracker_service.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 13784 by geissert, Mon Jan 11 07:49:35 2010 UTC revision 14909 by geissert, Sun Jun 27 04:03:20 2010 UTC
# Line 24  else: Line 24  else:
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
# Line 41  class BugFilter: Line 44  class BugFilter:
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(
# Line 103  function onSearch(query) { Line 117  function onSearch(query) {
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)
# Line 110  function onSearch(query) { Line 132  function onSearch(query) {
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)
# Line 125  function onSearch(query) { Line 146  function onSearch(query) {
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)
# Line 183  aware of and/or help us improve the qual Line 206  aware of and/or help us improve the qual
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'),
# Line 252  data source.""")], Line 277  data source.""")],
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    
# Line 368  data source.""")], Line 391  data source.""")],
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))
# Line 413  data source.""")], Line 407  data source.""")],
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 = ''
# Line 447  data source.""")], Line 441  data source.""")],
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    
# Line 535  to improve our documentation and procedu Line 529  to improve our documentation and procedu
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
# Line 557  to improve our documentation and procedu Line 545  to improve our documentation and procedu
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)),
# Line 576  architecture is currently not tracked."" Line 557  architecture is currently not tracked.""
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    
# Line 624  this package, but still reference it.""" Line 564  this package, but still reference it."""
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:
# Line 643  this package, but still reference it.""" Line 583  this package, but still reference it."""
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:
# Line 666  this package, but still reference it.""" Line 601  this package, but still reference it."""
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)
# Line 683  for this vulnerability.)''')]) Line 618  for this vulnerability.)''')])
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
# Line 704  for this vulnerability.)''')]) Line 639  for this vulnerability.)''')])
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:
# Line 718  for this vulnerability.)''')]) Line 653  for this vulnerability.)''')])
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)
# Line 728  for this vulnerability.)''')]) Line 665  for this vulnerability.)''')])
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):
# Line 738  for this vulnerability.)''')]) Line 675  for this vulnerability.)''')])
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
# Line 764  for this vulnerability.)''')]) Line 700  for this vulnerability.)''')])
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.
# Line 785  for this vulnerability.)''')]) Line 720  for this vulnerability.)''')])
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(
# Line 812  for this vulnerability.)''')]) Line 747  for this vulnerability.)''')])
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
# Line 831  for this vulnerability.)''')]) Line 766  for this vulnerability.)''')])
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
# Line 849  for this vulnerability.)''')]) Line 784  for this vulnerability.)''')])
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?)"
# Line 876  checker to find out why they have not en Line 811  checker to find out why they have not en
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"))])
# Line 895  checker to find out why they have not en Line 830  checker to find out why they have not en
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():
# Line 1093  Debian bug number.'''), Line 1114  Debian bug number.'''),
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(':')
# Line 1191  Debian bug number.'''), Line 1212  Debian bug number.'''),
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)
# Line 1241  Debian bug number.'''), Line 1257  Debian bug number.'''),
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")

Legend:
Removed from v.13784  
changed lines
  Added in v.14909

  ViewVC Help
Powered by ViewVC 1.1.5