test_tls_server_multiple_clients.js (3268B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 // Need profile dir to store the key / cert 7 do_get_profile(); 8 // Ensure PSM is initialized 9 Cc["@mozilla.org/psm;1"].getService(Ci.nsISupports); 10 11 const certOverrideService = Cc[ 12 "@mozilla.org/security/certoverride;1" 13 ].getService(Ci.nsICertOverrideService); 14 const socketTransportService = Cc[ 15 "@mozilla.org/network/socket-transport-service;1" 16 ].getService(Ci.nsISocketTransportService); 17 18 function startServer(cert) { 19 let tlsServer = Cc["@mozilla.org/network/tls-server-socket;1"].createInstance( 20 Ci.nsITLSServerSocket 21 ); 22 tlsServer.init(-1, true, -1); 23 tlsServer.serverCert = cert; 24 25 let input, output; 26 27 let listener = { 28 onSocketAccepted(socket, transport) { 29 info("Accept TLS client connection"); 30 let connectionInfo = transport.securityCallbacks.getInterface( 31 Ci.nsITLSServerConnectionInfo 32 ); 33 connectionInfo.setSecurityObserver(listener); 34 input = transport.openInputStream(0, 0, 0); 35 output = transport.openOutputStream(0, 0, 0); 36 }, 37 onHandshakeDone() { 38 info("TLS handshake done"); 39 40 input.asyncWait( 41 { 42 onInputStreamReady(input1) { 43 NetUtil.asyncCopy(input1, output); 44 }, 45 }, 46 0, 47 0, 48 Services.tm.currentThread 49 ); 50 }, 51 onStopListening() {}, 52 }; 53 54 tlsServer.setSessionTickets(false); 55 56 tlsServer.asyncListen(listener); 57 58 return tlsServer.port; 59 } 60 61 function storeCertOverride(port, cert) { 62 certOverrideService.rememberValidityOverride( 63 "127.0.0.1", 64 port, 65 {}, 66 cert, 67 true 68 ); 69 } 70 71 function startClient(port) { 72 let transport = socketTransportService.createTransport( 73 ["ssl"], 74 "127.0.0.1", 75 port, 76 null, 77 null 78 ); 79 let input; 80 let output; 81 82 let inputDeferred = Promise.withResolvers(); 83 let outputDeferred = Promise.withResolvers(); 84 85 let handler = { 86 onTransportStatus(transport1, status) { 87 if (status === Ci.nsISocketTransport.STATUS_CONNECTED_TO) { 88 output.asyncWait(handler, 0, 0, Services.tm.currentThread); 89 } 90 }, 91 92 onInputStreamReady(input1) { 93 try { 94 let data = NetUtil.readInputStreamToString(input1, input1.available()); 95 equal(data, "HELLO", "Echoed data received"); 96 input1.close(); 97 output.close(); 98 inputDeferred.resolve(); 99 } catch (e) { 100 inputDeferred.reject(e); 101 } 102 }, 103 104 onOutputStreamReady(output1) { 105 try { 106 output1.write("HELLO", 5); 107 info("Output to server written"); 108 outputDeferred.resolve(); 109 input = transport.openInputStream(0, 0, 0); 110 input.asyncWait(handler, 0, 0, Services.tm.currentThread); 111 } catch (e) { 112 outputDeferred.reject(e); 113 } 114 }, 115 }; 116 117 transport.setEventSink(handler, Services.tm.currentThread); 118 output = transport.openOutputStream(0, 0, 0); 119 120 return Promise.all([inputDeferred.promise, outputDeferred.promise]); 121 } 122 123 add_task(async function () { 124 let cert = getTestServerCertificate(); 125 ok(!!cert, "Got self-signed cert"); 126 let port = startServer(cert); 127 storeCertOverride(port, cert); 128 await startClient(port); 129 await startClient(port); 130 });