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

« back to all changes in this revision

Viewing changes to tests/verified_https.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:
1
 
# -*- coding: UTF-8 -*-
2
 
 
3
 
'''VerifiedHTTPSHandler tests'''
4
 
 
5
 
# (c) 2011 Canonical Ltd.
6
 
#
7
 
# This program is free software; you can redistribute it and/or modify
8
 
# it under the terms of the GNU General Public License as published by
9
 
# the Free Software Foundation; either version 2 of the License, or
10
 
# (at your option) any later version.
11
 
#
12
 
# This program is distributed in the hope that it will be useful,
13
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 
# GNU General Public License for more details.
16
 
#
17
 
# You should have received a copy of the GNU General Public License along
18
 
# with this program; if not, write to the Free Software Foundation, Inc.,
19
 
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20
 
 
21
 
import unittest, os, os.path, sys, time, ssl, urllib2
22
 
import BaseHTTPServer, SimpleHTTPServer
23
 
 
24
 
from jockey.oslib import OSLib
25
 
from jockey.verified_https import VerifiedHTTPSHandler, InvalidCertificateException
26
 
 
27
 
class VerifiedHTTPSHandlerTests(unittest.TestCase):
28
 
    def serve_request(self, certfile):
29
 
        '''start a local https server with the given certificate
30
 
        
31
 
        This will serve one request and then exit.
32
 
        '''
33
 
        pid = os.fork()
34
 
        if pid == 0:
35
 
            # quiesce HTTP log
36
 
            os.dup2(os.open('/dev/null', os.O_WRONLY), sys.stderr.fileno())
37
 
 
38
 
            httpd = BaseHTTPServer.HTTPServer(('localhost', 4443),
39
 
                    SimpleHTTPServer.SimpleHTTPRequestHandler)
40
 
            httpd.socket = ssl.wrap_socket (httpd.socket,
41
 
                    certfile=certfile, server_side=True)
42
 
            # first request is for startup check, second for the actual test
43
 
            httpd.handle_request()
44
 
            httpd.handle_request()
45
 
            os._exit(0)
46
 
 
47
 
        self.server_pid = pid
48
 
 
49
 
        # wait until the server is ready
50
 
        while True:
51
 
            try:
52
 
                f = urllib2.urlopen('https://localhost:4443')
53
 
            except IOError as e:
54
 
                time.sleep(0.05)
55
 
                continue
56
 
            f.read()
57
 
            f.close()
58
 
            break
59
 
 
60
 
    def setUp(self):
61
 
        self.server_pid = None
62
 
        pem_dir = os.path.join(os.path.dirname(__file__), 'data')
63
 
        self.localhost_pem = os.path.join(pem_dir, 'localhost.pem')
64
 
        self.localhost_expired_pem = os.path.join(pem_dir, 'localhost-expired.pem')
65
 
 
66
 
    def tearDown(self):
67
 
        if self.server_pid:
68
 
            os.kill(self.server_pid, 15)
69
 
            os.waitpid(self.server_pid, 0)
70
 
 
71
 
    def test_valid(self):
72
 
        '''valid certificate and hostname'''
73
 
 
74
 
        self.serve_request(self.localhost_pem)
75
 
 
76
 
        handler = VerifiedHTTPSHandler(ca_certs=self.localhost_pem)
77
 
        opener = urllib2.build_opener(handler)
78
 
        f = opener.open('https://localhost:4443/')
79
 
        self.assert_(f.readline().startswith('<!DOCTYPE html'))
80
 
        f.close()
81
 
 
82
 
    def test_wrong_host(self):
83
 
        '''unknown hostname'''
84
 
 
85
 
        self.serve_request(self.localhost_pem)
86
 
 
87
 
        handler = VerifiedHTTPSHandler(ca_certs=self.localhost_pem)
88
 
        opener = urllib2.build_opener(handler)
89
 
        try:
90
 
            opener.open('https://127.0.0.1:4443')
91
 
            self.fail('does not raise InvalidCertificateException')
92
 
        except InvalidCertificateException as e:
93
 
            self.assertEqual(e.host, '127.0.0.1')
94
 
            self.assertEqual(e.reason, 'hostname mismatch')
95
 
 
96
 
    def test_expired_cert(self):
97
 
        '''expired certificate'''
98
 
 
99
 
        self.serve_request(self.localhost_expired_pem)
100
 
 
101
 
        handler = VerifiedHTTPSHandler(ca_certs=self.localhost_expired_pem)
102
 
        opener = urllib2.build_opener(handler)
103
 
        try:
104
 
            opener.open('https://localhost:4443')
105
 
            self.fail('does not raise InvalidCertificateException')
106
 
        except InvalidCertificateException as e:
107
 
            self.assert_('certificate verify failed' in e.reason)
108
 
            self.assertEqual(e.host, 'localhost:4443')
109
 
 
110
 
    def test_wrong_cert(self):
111
 
        '''wrong certificate'''
112
 
 
113
 
        self.serve_request(self.localhost_pem)
114
 
 
115
 
        handler = VerifiedHTTPSHandler(ca_certs=self.localhost_expired_pem)
116
 
        opener = urllib2.build_opener(handler)
117
 
        try:
118
 
            opener.open('https://localhost:4443')
119
 
            self.fail('does not raise InvalidCertificateException')
120
 
        except InvalidCertificateException as e:
121
 
            self.assert_('certificate verify failed' in e.reason)
122
 
            self.assertEqual(e.host, 'localhost:4443')
123
 
 
124
 
    def test_system_cert(self):
125
 
        '''system-wide trusted certificate shouldn't match local test server'''
126
 
 
127
 
        cert = OSLib.inst.ssl_cert_file()
128
 
        if not cert:
129
 
            print '[SKIP, not available]'
130
 
            return
131
 
 
132
 
        self.serve_request(self.localhost_pem)
133
 
 
134
 
        handler = VerifiedHTTPSHandler(ca_certs=cert)
135
 
        opener = urllib2.build_opener(handler)
136
 
        try:
137
 
            opener.open('https://localhost:4443')
138
 
            self.fail('does not raise InvalidCertificateException')
139
 
        except InvalidCertificateException as e:
140
 
            self.assert_('certificate verify failed' in e.reason)
141
 
            self.assertEqual(e.host, 'localhost:4443')
142