// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. // OtherResources=certificates/server_chain.pem // OtherResources=certificates/server_key.pem // OtherResources=certificates/trusted_certs.pem // This test verifies that the bad certificate callback works in HttpClient. import "dart:async"; import "dart:io"; import "package:expect/expect.dart"; final HOST_NAME = 'localhost'; String localFile(path) => Platform.script.resolve(path).toFilePath(); SecurityContext serverContext = new SecurityContext() ..useCertificateChain(localFile('certificates/server_chain.pem')) ..usePrivateKey(localFile('certificates/server_key.pem'), password: 'dartdart'); class CustomException {} main() async { var HOST = (await InternetAddress.lookup(HOST_NAME)).first; var server = await HttpServer.bindSecure(HOST, 0, serverContext, backlog: 5); server.listen((request) { request.listen((_) {}, onDone: () { request.response.close(); }); }); SecurityContext goodContext = new SecurityContext() ..setTrustedCertificates(localFile('certificates/trusted_certs.pem')); SecurityContext badContext = new SecurityContext(); SecurityContext defaultContext = SecurityContext.defaultContext; await runClient(server.port, goodContext, true, 'pass'); await runClient(server.port, goodContext, false, 'pass'); await runClient(server.port, goodContext, 'fisk', 'pass'); await runClient(server.port, goodContext, 'exception', 'pass'); await runClient(server.port, badContext, true, 'pass'); await runClient(server.port, badContext, false, 'fail'); await runClient(server.port, badContext, 'fisk', 'fail'); await runClient(server.port, badContext, 'exception', 'throw'); await runClient(server.port, defaultContext, true, 'pass'); await runClient(server.port, defaultContext, false, 'fail'); await runClient(server.port, defaultContext, 'fisk', 'fail'); await runClient(server.port, defaultContext, 'exception', 'throw'); server.close(); } Future runClient( int port, SecurityContext context, callbackReturns, result) async { HttpClient client = new HttpClient(context: context); client.badCertificateCallback = (X509Certificate certificate, host, port) { Expect.isTrue(certificate.subject.contains('rootauthority')); Expect.isTrue(certificate.issuer.contains('rootauthority')); // Throw exception if one is requested. if (callbackReturns == 'exception') throw new CustomException(); return callbackReturns; }; try { var request = await client.getUrl(Uri.parse('https://$HOST_NAME:$port/')); Expect.equals('pass', result); await request.close(); } catch (error) { Expect.notEquals(result, 'pass'); if (result == 'fail') { Expect.isTrue(error is HandshakeException || (callbackReturns is! bool && error is TypeError)); } else if (result == 'throw') { Expect.isTrue(error is CustomException); } else { Expect.fail('Unknown expectation $result'); } } }