| Index: net/tools/testserver/testserver.py
|
| diff --git a/net/tools/testserver/testserver.py b/net/tools/testserver/testserver.py
|
| index 871e540f8d272e5b69ed949ed0751dcf671a07dc..8888431d260354774c55d39cb923ceee506d3fe3 100755
|
| --- a/net/tools/testserver/testserver.py
|
| +++ b/net/tools/testserver/testserver.py
|
| @@ -73,7 +73,8 @@ class HTTPSServer(tlslite.api.TLSSocketServerMixIn, StoppableHTTPServer):
|
| """This is a specialization of StoppableHTTPerver that add https support."""
|
|
|
| def __init__(self, server_address, request_hander_class, cert_path,
|
| - ssl_client_auth, ssl_client_cas, ssl_bulk_ciphers):
|
| + ssl_client_auth, ssl_client_cas, ssl_bulk_ciphers,
|
| + use_tls_srp, only_tls_srp):
|
| s = open(cert_path).read()
|
| x509 = tlslite.api.X509()
|
| x509.parse(s)
|
| @@ -90,6 +91,14 @@ class HTTPSServer(tlslite.api.TLSSocketServerMixIn, StoppableHTTPServer):
|
| self.ssl_handshake_settings = tlslite.api.HandshakeSettings()
|
| if ssl_bulk_ciphers is not None:
|
| self.ssl_handshake_settings.cipherNames = ssl_bulk_ciphers
|
| + self.only_tls_srp = only_tls_srp
|
| + self.srp_verifier_db = None
|
| + if use_tls_srp:
|
| + # Make dummy SRP verifier database
|
| + self.srp_verifier_db = tlslite.api.VerifierDB()
|
| + self.srp_verifier_db.create()
|
| + entry = tlslite.api.VerifierDB.makeVerifier('user', 'secret', 1536)
|
| + self.srp_verifier_db['user'] = entry
|
|
|
| self.session_cache = tlslite.api.SessionCache()
|
| StoppableHTTPServer.__init__(self, server_address, request_hander_class)
|
| @@ -97,13 +106,18 @@ class HTTPSServer(tlslite.api.TLSSocketServerMixIn, StoppableHTTPServer):
|
| def handshake(self, tlsConnection):
|
| """Creates the SSL connection."""
|
| try:
|
| - tlsConnection.handshakeServer(certChain=self.cert_chain,
|
| - privateKey=self.private_key,
|
| - sessionCache=self.session_cache,
|
| - reqCert=self.ssl_client_auth,
|
| - settings=self.ssl_handshake_settings,
|
| - reqCAs=self.ssl_client_cas)
|
| + if not self.only_tls_srp:
|
| + tlsConnection.handshakeServer(certChain=self.cert_chain,
|
| + privateKey=self.private_key,
|
| + sessionCache=self.session_cache,
|
| + reqCert=self.ssl_client_auth,
|
| + settings=self.ssl_handshake_settings,
|
| + reqCAs=self.ssl_client_cas,
|
| + verifierDB=self.srp_verifier_db)
|
| + else:
|
| + tlsConnection.handshakeServer(verifierDB=self.srp_verifier_db)
|
| tlsConnection.ignoreAbruptClose = True
|
| + self.tlsConnection = tlsConnection
|
| return True
|
| except tlslite.api.TLSAbruptCloseError:
|
| # Ignore abrupt close.
|
| @@ -211,11 +225,14 @@ class SyncHTTPServer(StoppableHTTPServer):
|
| class BasePageHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
|
|
| def __init__(self, request, client_address, socket_server,
|
| - connect_handlers, get_handlers, post_handlers, put_handlers):
|
| + connect_handlers, get_handlers, get_with_socket_handlers,
|
| + post_handlers, put_handlers):
|
| self._connect_handlers = connect_handlers
|
| self._get_handlers = get_handlers
|
| + self._get_with_socket_handlers = get_with_socket_handlers
|
| self._post_handlers = post_handlers
|
| self._put_handlers = put_handlers
|
| + self._socket_server = socket_server
|
| BaseHTTPServer.BaseHTTPRequestHandler.__init__(
|
| self, request, client_address, socket_server)
|
|
|
| @@ -239,6 +256,9 @@ class BasePageHandler(BaseHTTPServer.BaseHTTPRequestHandler):
|
| return
|
|
|
| def do_GET(self):
|
| + for handler in self._get_with_socket_handlers:
|
| + if handler(self._socket_server):
|
| + return
|
| for handler in self._get_handlers:
|
| if handler():
|
| return
|
| @@ -292,6 +312,8 @@ class TestPageHandler(BasePageHandler):
|
| self.ClientRedirectHandler,
|
| self.MultipartHandler,
|
| self.DefaultResponseHandler]
|
| + get_with_socket_handlers = [
|
| + self.TLSLoginInfoHandler]
|
| post_handlers = [
|
| self.EchoTitleHandler,
|
| self.EchoAllHandler,
|
| @@ -314,7 +336,8 @@ class TestPageHandler(BasePageHandler):
|
| self._default_mime_type = 'text/html'
|
|
|
| BasePageHandler.__init__(self, request, client_address, socket_server,
|
| - connect_handlers, get_handlers, post_handlers,
|
| + connect_handlers, get_handlers,
|
| + get_with_socket_handlers, post_handlers,
|
| put_handlers)
|
|
|
| def GetMIMETypeFromName(self, file_name):
|
| @@ -613,6 +636,23 @@ class TestPageHandler(BasePageHandler):
|
| self.rfile.read(2)
|
| return body
|
|
|
| + def TLSLoginInfoHandler(self, socket_server):
|
| + """This handler echoes back the username used to log in via TLS."""
|
| +
|
| + if not self._ShouldHandleRequest("/tlslogininfo"):
|
| + return False
|
| +
|
| + self.send_response(200)
|
| + self.send_header('Content-type', 'text/html')
|
| + self.end_headers()
|
| +
|
| + srp_user = socket_server.tlsConnection.session.srpUsername
|
| + if srp_user:
|
| + self.wfile.write('username: ' + srp_user)
|
| + else:
|
| + self.wfile.write('not using TLS-SRP')
|
| + return True
|
| +
|
| def EchoHandler(self):
|
| """This handler just echoes back the payload of the request, for testing
|
| form submission."""
|
| @@ -1413,7 +1453,8 @@ def main(options, args):
|
| return
|
| server = HTTPSServer(('127.0.0.1', port), TestPageHandler, options.cert,
|
| options.ssl_client_auth, options.ssl_client_ca,
|
| - options.ssl_bulk_cipher)
|
| + options.ssl_bulk_cipher, options.use_tls_srp,
|
| + options.only_tls_srp)
|
| print 'HTTPS server started on port %d...' % server.server_port
|
| else:
|
| server = StoppableHTTPServer(('127.0.0.1', port), TestPageHandler)
|
| @@ -1522,6 +1563,11 @@ if __name__ == '__main__':
|
| 'omitted, all algorithms will be used. This '
|
| 'option may appear multiple times, indicating '
|
| 'multiple algorithms should be enabled.');
|
| + option_parser.add_option('', '--use-tls-srp', action='store_true',
|
| + help='Allow TLS authentication using TLS-SRP'
|
| + ' (user jsmith, password asdf)')
|
| + option_parser.add_option('', '--only-tls-srp', action='store_true',
|
| + help='Only allow connections using TLS-SRP')
|
| option_parser.add_option('', '--file-root-url', default='/files/',
|
| help='Specify a root URL for files served.')
|
| option_parser.add_option('', '--startup-pipe', type='int',
|
|
|