~ubuntu-branches/ubuntu/trusty/jockey/trusty

« back to all changes in this revision

Viewing changes to jockey/detection.py

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2011-03-08 16:08:06 UTC
  • mfrom: (2.1.31 upstream)
  • Revision ID: james.westby@ubuntu.com-20110308160806-udbldxcrfk734zsi
Tags: 0.9.2-0ubuntu1
* New upstream bug fix release:
  - Add X.org video driver ABI checking. (This was already cherrypicked
    in an earlier upload)
  - Drop our own verified_https.py and implement GPG fingerprint SSL
    checking with pycurl, which gets along with proxies. (LP: #729185)
  - Some code cleanup and more test cases.
* debian/control: Add python-pycurl dependency.

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
import os, os.path, subprocess, sys, logging, re, urllib2
28
28
import cPickle, xmlrpclib, locale
29
29
from glob import glob
 
30
from cStringIO import StringIO
 
31
import pycurl
30
32
 
31
33
from oslib import OSLib
32
34
import handlers, xorg_driver
33
35
 
34
 
from jockey.verified_https import VerifiedHTTPSHandler, InvalidCertificateException
35
 
 
36
36
#--------------------------------------------------------------------#
37
37
 
38
38
class HardwareID:
548
548
                    if 'fingerprint' not in pkgs[pkg]:
549
549
                        logging.debug('Ignoring driver as it does not have a GPG fingerprint URL')
550
550
                        continue
551
 
                    fingerprint = self._check_get_fingerprint(pkgs[pkg]['fingerprint'])
 
551
                    fingerprint = download_gpg_fingerprint(pkgs[pkg]['fingerprint'])
552
552
                    if not fingerprint:
553
553
                        logging.debug('Ignoring driver as it does not have a valid GPG fingerprint')
554
554
                        continue
624
624
            t.join()
625
625
        logging.debug('openprinting.org database query finished')
626
626
 
627
 
    def _check_get_fingerprint(self, url):
628
 
        '''Get GPG fingerprint from URL.
629
 
 
630
 
        Check that the URL is HTTPS with a valid and trusted server
631
 
        certificate, read it, extract the GPG fingerprint from it, and return
632
 
        it. Return None if the URL is invalid, not trusted, or the fingerprint
633
 
        can't be found.
634
 
        '''
635
 
        if not url.startswith('https://'):
636
 
            logging.debug('Not a https fingerprint URL: %s, ignoring driver' % url)
637
 
            return None
638
 
 
639
 
        cert = OSLib.inst.ssl_cert_file()
640
 
        if not cert:
641
 
            logging.debug('No system SSL certificates available for trust checking')
642
 
            return None
643
 
 
644
 
        opener = urllib2.build_opener(VerifiedHTTPSHandler(ca_certs=cert))
645
 
        try:
646
 
            f = opener.open(url)
647
 
        except InvalidCertificateException as e:
648
 
            logging.warning('%s has invalid certificate, ignoring driver: %s' % (url, str(e)))
649
 
            return None
650
 
 
651
 
        fingerprint_re = re.compile(' ((?:(?:[0-9A-F]{4})(?:\s+|$)){10})$')
652
 
        
653
 
        for line in f:
654
 
            m = fingerprint_re.search(line)
655
 
            if m:
656
 
                return m.group(1).strip()
657
 
 
658
 
        return None
659
 
 
660
627
#--------------------------------------------------------------------#
661
628
# internal helper functions
662
629
 
1058
1025
 
1059
1026
    return available_handlers
1060
1027
 
1061
 
 
 
1028
def download_gpg_fingerprint(url):
 
1029
    '''Get GPG fingerprint from URL.
 
1030
 
 
1031
    Check that the URL is HTTPS with a valid and trusted server
 
1032
    certificate, read it, extract the GPG fingerprint from it, and return
 
1033
    it. Return None if the URL is invalid, not trusted, or the fingerprint
 
1034
    can't be found.
 
1035
    '''
 
1036
    if not url.startswith('https://'):
 
1037
        logging.debug('Not a https fingerprint URL: %s, ignoring driver' % url)
 
1038
        return None
 
1039
 
 
1040
    cert = OSLib.inst.ssl_cert_file()
 
1041
    if not cert:
 
1042
        logging.debug('No system SSL certificates available for trust checking')
 
1043
        return None
 
1044
 
 
1045
    c = pycurl.Curl()
 
1046
    c.setopt(pycurl.URL, url)
 
1047
    content = StringIO()
 
1048
    c.setopt(pycurl.WRITEFUNCTION, content.write)
 
1049
    c.setopt(pycurl.FOLLOWLOCATION, 1)
 
1050
    c.setopt(pycurl.MAXREDIRS, 5)
 
1051
    c.setopt(pycurl.CAINFO, cert)
 
1052
 
 
1053
    try:
 
1054
        c.perform()
 
1055
    except pycurl.error as e:
 
1056
        logging.warning('Cannot retrieve %s: %s' % (url, str(e)))
 
1057
        return None
 
1058
 
 
1059
    fingerprint_re = re.compile(' ((?:(?:[0-9A-F]{4})(?:\s+|$)){10})$', re.M)
 
1060
    
 
1061
    m = fingerprint_re.search(content.getvalue())
 
1062
    if m:
 
1063
        return m.group(1).strip()
 
1064
 
 
1065
    return None