| OLD | NEW | 
|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "net/test/spawned_test_server/base_test_server.h" | 5 #include "net/test/spawned_test_server/base_test_server.h" | 
| 6 | 6 | 
| 7 #include <stdint.h> | 7 #include <stdint.h> | 
| 8 #include <limits> | 8 #include <limits> | 
| 9 #include <string> | 9 #include <string> | 
| 10 #include <utility> | 10 #include <utility> | 
| 11 #include <vector> | 11 #include <vector> | 
| 12 | 12 | 
| 13 #include "base/base64.h" | 13 #include "base/base64.h" | 
| 14 #include "base/files/file_util.h" | 14 #include "base/files/file_util.h" | 
| 15 #include "base/json/json_reader.h" | 15 #include "base/json/json_reader.h" | 
| 16 #include "base/logging.h" | 16 #include "base/logging.h" | 
|  | 17 #include "base/memory/ptr_util.h" | 
| 17 #include "base/path_service.h" | 18 #include "base/path_service.h" | 
| 18 #include "base/values.h" | 19 #include "base/values.h" | 
| 19 #include "net/base/address_list.h" | 20 #include "net/base/address_list.h" | 
| 20 #include "net/base/host_port_pair.h" | 21 #include "net/base/host_port_pair.h" | 
| 21 #include "net/base/net_errors.h" | 22 #include "net/base/net_errors.h" | 
| 22 #include "net/base/port_util.h" | 23 #include "net/base/port_util.h" | 
| 23 #include "net/base/test_completion_callback.h" | 24 #include "net/base/test_completion_callback.h" | 
| 24 #include "net/cert/test_root_certs.h" | 25 #include "net/cert/test_root_certs.h" | 
| 25 #include "net/cert/x509_certificate.h" | 26 #include "net/cert/x509_certificate.h" | 
| 26 #include "net/dns/host_resolver.h" | 27 #include "net/dns/host_resolver.h" | 
| (...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 528 // { argument-name: argument-value, ... } | 529 // { argument-name: argument-value, ... } | 
| 529 // Returns false if an invalid configuration is specified. | 530 // Returns false if an invalid configuration is specified. | 
| 530 bool BaseTestServer::GenerateArguments(base::DictionaryValue* arguments) const { | 531 bool BaseTestServer::GenerateArguments(base::DictionaryValue* arguments) const { | 
| 531   DCHECK(arguments); | 532   DCHECK(arguments); | 
| 532 | 533 | 
| 533   arguments->SetString("host", host_port_pair_.host()); | 534   arguments->SetString("host", host_port_pair_.host()); | 
| 534   arguments->SetInteger("port", host_port_pair_.port()); | 535   arguments->SetInteger("port", host_port_pair_.port()); | 
| 535   arguments->SetString("data-dir", document_root_.value()); | 536   arguments->SetString("data-dir", document_root_.value()); | 
| 536 | 537 | 
| 537   if (VLOG_IS_ON(1) || log_to_console_) | 538   if (VLOG_IS_ON(1) || log_to_console_) | 
| 538     arguments->Set("log-to-console", base::Value::CreateNullValue()); | 539     arguments->Set("log-to-console", base::MakeUnique<base::Value>()); | 
| 539 | 540 | 
| 540   if (ws_basic_auth_) { | 541   if (ws_basic_auth_) { | 
| 541     DCHECK(type_ == TYPE_WS || type_ == TYPE_WSS); | 542     DCHECK(type_ == TYPE_WS || type_ == TYPE_WSS); | 
| 542     arguments->Set("ws-basic-auth", base::Value::CreateNullValue()); | 543     arguments->Set("ws-basic-auth", base::MakeUnique<base::Value>()); | 
| 543   } | 544   } | 
| 544 | 545 | 
| 545   if (no_anonymous_ftp_user_) { | 546   if (no_anonymous_ftp_user_) { | 
| 546     DCHECK_EQ(TYPE_FTP, type_); | 547     DCHECK_EQ(TYPE_FTP, type_); | 
| 547     arguments->Set("no-anonymous-ftp-user", base::Value::CreateNullValue()); | 548     arguments->Set("no-anonymous-ftp-user", base::MakeUnique<base::Value>()); | 
| 548   } | 549   } | 
| 549 | 550 | 
| 550   if (UsingSSL(type_)) { | 551   if (UsingSSL(type_)) { | 
| 551     // Check the certificate arguments of the HTTPS server. | 552     // Check the certificate arguments of the HTTPS server. | 
| 552     base::FilePath certificate_path(certificates_dir_); | 553     base::FilePath certificate_path(certificates_dir_); | 
| 553     base::FilePath certificate_file(ssl_options_.GetCertificateFile()); | 554     base::FilePath certificate_file(ssl_options_.GetCertificateFile()); | 
| 554     if (!certificate_file.value().empty()) { | 555     if (!certificate_file.value().empty()) { | 
| 555       certificate_path = certificate_path.Append(certificate_file); | 556       certificate_path = certificate_path.Append(certificate_file); | 
| 556       if (certificate_path.IsAbsolute() && | 557       if (certificate_path.IsAbsolute() && | 
| 557           !base::PathExists(certificate_path)) { | 558           !base::PathExists(certificate_path)) { | 
| 558         LOG(ERROR) << "Certificate path " << certificate_path.value() | 559         LOG(ERROR) << "Certificate path " << certificate_path.value() | 
| 559                    << " doesn't exist. Can't launch https server."; | 560                    << " doesn't exist. Can't launch https server."; | 
| 560         return false; | 561         return false; | 
| 561       } | 562       } | 
| 562       arguments->SetString("cert-and-key-file", certificate_path.value()); | 563       arguments->SetString("cert-and-key-file", certificate_path.value()); | 
| 563     } | 564     } | 
| 564 | 565 | 
| 565     // Check the client certificate related arguments. | 566     // Check the client certificate related arguments. | 
| 566     if (ssl_options_.request_client_certificate) | 567     if (ssl_options_.request_client_certificate) | 
| 567       arguments->Set("ssl-client-auth", base::Value::CreateNullValue()); | 568       arguments->Set("ssl-client-auth", base::MakeUnique<base::Value>()); | 
| 568     std::unique_ptr<base::ListValue> ssl_client_certs(new base::ListValue()); | 569     std::unique_ptr<base::ListValue> ssl_client_certs(new base::ListValue()); | 
| 569 | 570 | 
| 570     std::vector<base::FilePath>::const_iterator it; | 571     std::vector<base::FilePath>::const_iterator it; | 
| 571     for (it = ssl_options_.client_authorities.begin(); | 572     for (it = ssl_options_.client_authorities.begin(); | 
| 572          it != ssl_options_.client_authorities.end(); ++it) { | 573          it != ssl_options_.client_authorities.end(); ++it) { | 
| 573       if (it->IsAbsolute() && !base::PathExists(*it)) { | 574       if (it->IsAbsolute() && !base::PathExists(*it)) { | 
| 574         LOG(ERROR) << "Client authority path " << it->value() | 575         LOG(ERROR) << "Client authority path " << it->value() | 
| 575                    << " doesn't exist. Can't launch https server."; | 576                    << " doesn't exist. Can't launch https server."; | 
| 576         return false; | 577         return false; | 
| 577       } | 578       } | 
| 578       ssl_client_certs->AppendString(it->value()); | 579       ssl_client_certs->AppendString(it->value()); | 
| 579     } | 580     } | 
| 580 | 581 | 
| 581     if (ssl_client_certs->GetSize()) | 582     if (ssl_client_certs->GetSize()) | 
| 582       arguments->Set("ssl-client-ca", ssl_client_certs.release()); | 583       arguments->Set("ssl-client-ca", ssl_client_certs.release()); | 
| 583 | 584 | 
| 584     std::unique_ptr<base::ListValue> client_cert_types(new base::ListValue()); | 585     std::unique_ptr<base::ListValue> client_cert_types(new base::ListValue()); | 
| 585     for (size_t i = 0; i < ssl_options_.client_cert_types.size(); i++) { | 586     for (size_t i = 0; i < ssl_options_.client_cert_types.size(); i++) { | 
| 586       client_cert_types->AppendString( | 587       client_cert_types->AppendString( | 
| 587           GetClientCertType(ssl_options_.client_cert_types[i])); | 588           GetClientCertType(ssl_options_.client_cert_types[i])); | 
| 588     } | 589     } | 
| 589     if (client_cert_types->GetSize()) | 590     if (client_cert_types->GetSize()) | 
| 590       arguments->Set("ssl-client-cert-type", client_cert_types.release()); | 591       arguments->Set("ssl-client-cert-type", client_cert_types.release()); | 
| 591   } | 592   } | 
| 592 | 593 | 
| 593   if (type_ == TYPE_HTTPS) { | 594   if (type_ == TYPE_HTTPS) { | 
| 594     arguments->Set("https", base::Value::CreateNullValue()); | 595     arguments->Set("https", base::MakeUnique<base::Value>()); | 
| 595 | 596 | 
| 596     if (ssl_options_.server_certificate == | 597     if (ssl_options_.server_certificate == | 
| 597         SSLOptions::CERT_AUTO_AIA_INTERMEDIATE) | 598         SSLOptions::CERT_AUTO_AIA_INTERMEDIATE) | 
| 598       arguments->Set("aia-intermediate", base::Value::CreateNullValue()); | 599       arguments->Set("aia-intermediate", base::MakeUnique<base::Value>()); | 
| 599 | 600 | 
| 600     std::string ocsp_arg = ssl_options_.GetOCSPArgument(); | 601     std::string ocsp_arg = ssl_options_.GetOCSPArgument(); | 
| 601     if (!ocsp_arg.empty()) | 602     if (!ocsp_arg.empty()) | 
| 602       arguments->SetString("ocsp", ocsp_arg); | 603       arguments->SetString("ocsp", ocsp_arg); | 
| 603 | 604 | 
| 604     std::string ocsp_date_arg = ssl_options_.GetOCSPDateArgument(); | 605     std::string ocsp_date_arg = ssl_options_.GetOCSPDateArgument(); | 
| 605     if (!ocsp_date_arg.empty()) | 606     if (!ocsp_date_arg.empty()) | 
| 606       arguments->SetString("ocsp-date", ocsp_date_arg); | 607       arguments->SetString("ocsp-date", ocsp_date_arg); | 
| 607 | 608 | 
| 608     std::string ocsp_produced_arg = ssl_options_.GetOCSPProducedArgument(); | 609     std::string ocsp_produced_arg = ssl_options_.GetOCSPProducedArgument(); | 
| 609     if (!ocsp_produced_arg.empty()) | 610     if (!ocsp_produced_arg.empty()) | 
| 610       arguments->SetString("ocsp-produced", ocsp_produced_arg); | 611       arguments->SetString("ocsp-produced", ocsp_produced_arg); | 
| 611 | 612 | 
| 612     if (ssl_options_.cert_serial != 0) { | 613     if (ssl_options_.cert_serial != 0) { | 
| 613       arguments->SetInteger("cert-serial", ssl_options_.cert_serial); | 614       arguments->SetInteger("cert-serial", ssl_options_.cert_serial); | 
| 614     } | 615     } | 
| 615 | 616 | 
| 616     // Check key exchange argument. | 617     // Check key exchange argument. | 
| 617     std::unique_ptr<base::ListValue> key_exchange_values(new base::ListValue()); | 618     std::unique_ptr<base::ListValue> key_exchange_values(new base::ListValue()); | 
| 618     GetKeyExchangesList(ssl_options_.key_exchanges, key_exchange_values.get()); | 619     GetKeyExchangesList(ssl_options_.key_exchanges, key_exchange_values.get()); | 
| 619     if (key_exchange_values->GetSize()) | 620     if (key_exchange_values->GetSize()) | 
| 620       arguments->Set("ssl-key-exchange", key_exchange_values.release()); | 621       arguments->Set("ssl-key-exchange", key_exchange_values.release()); | 
| 621     // Check bulk cipher argument. | 622     // Check bulk cipher argument. | 
| 622     std::unique_ptr<base::ListValue> bulk_cipher_values(new base::ListValue()); | 623     std::unique_ptr<base::ListValue> bulk_cipher_values(new base::ListValue()); | 
| 623     GetCiphersList(ssl_options_.bulk_ciphers, bulk_cipher_values.get()); | 624     GetCiphersList(ssl_options_.bulk_ciphers, bulk_cipher_values.get()); | 
| 624     if (bulk_cipher_values->GetSize()) | 625     if (bulk_cipher_values->GetSize()) | 
| 625       arguments->Set("ssl-bulk-cipher", bulk_cipher_values.release()); | 626       arguments->Set("ssl-bulk-cipher", bulk_cipher_values.release()); | 
| 626     if (ssl_options_.record_resume) | 627     if (ssl_options_.record_resume) | 
| 627       arguments->Set("https-record-resume", base::Value::CreateNullValue()); | 628       arguments->Set("https-record-resume", base::MakeUnique<base::Value>()); | 
| 628     if (ssl_options_.tls_intolerant != SSLOptions::TLS_INTOLERANT_NONE) { | 629     if (ssl_options_.tls_intolerant != SSLOptions::TLS_INTOLERANT_NONE) { | 
| 629       arguments->SetInteger("tls-intolerant", ssl_options_.tls_intolerant); | 630       arguments->SetInteger("tls-intolerant", ssl_options_.tls_intolerant); | 
| 630       arguments->Set("tls-intolerance-type", GetTLSIntoleranceType( | 631       arguments->Set("tls-intolerance-type", GetTLSIntoleranceType( | 
| 631           ssl_options_.tls_intolerance_type)); | 632           ssl_options_.tls_intolerance_type)); | 
| 632     } | 633     } | 
| 633     if (ssl_options_.fallback_scsv_enabled) | 634     if (ssl_options_.fallback_scsv_enabled) | 
| 634       arguments->Set("fallback-scsv", base::Value::CreateNullValue()); | 635       arguments->Set("fallback-scsv", base::MakeUnique<base::Value>()); | 
| 635     if (!ssl_options_.signed_cert_timestamps_tls_ext.empty()) { | 636     if (!ssl_options_.signed_cert_timestamps_tls_ext.empty()) { | 
| 636       std::string b64_scts_tls_ext; | 637       std::string b64_scts_tls_ext; | 
| 637       base::Base64Encode(ssl_options_.signed_cert_timestamps_tls_ext, | 638       base::Base64Encode(ssl_options_.signed_cert_timestamps_tls_ext, | 
| 638                          &b64_scts_tls_ext); | 639                          &b64_scts_tls_ext); | 
| 639       arguments->SetString("signed-cert-timestamps-tls-ext", b64_scts_tls_ext); | 640       arguments->SetString("signed-cert-timestamps-tls-ext", b64_scts_tls_ext); | 
| 640     } | 641     } | 
| 641     if (ssl_options_.staple_ocsp_response) | 642     if (ssl_options_.staple_ocsp_response) | 
| 642       arguments->Set("staple-ocsp-response", base::Value::CreateNullValue()); | 643       arguments->Set("staple-ocsp-response", base::MakeUnique<base::Value>()); | 
| 643     if (ssl_options_.ocsp_server_unavailable) { | 644     if (ssl_options_.ocsp_server_unavailable) { | 
| 644       arguments->Set("ocsp-server-unavailable", | 645       arguments->Set("ocsp-server-unavailable", | 
| 645                      base::Value::CreateNullValue()); | 646                      base::MakeUnique<base::Value>()); | 
| 646     } | 647     } | 
| 647     if (!ssl_options_.alpn_protocols.empty()) { | 648     if (!ssl_options_.alpn_protocols.empty()) { | 
| 648       std::unique_ptr<base::ListValue> alpn_protocols(new base::ListValue()); | 649       std::unique_ptr<base::ListValue> alpn_protocols(new base::ListValue()); | 
| 649       for (const std::string& proto : ssl_options_.alpn_protocols) { | 650       for (const std::string& proto : ssl_options_.alpn_protocols) { | 
| 650         alpn_protocols->AppendString(proto); | 651         alpn_protocols->AppendString(proto); | 
| 651       } | 652       } | 
| 652       arguments->Set("alpn-protocols", std::move(alpn_protocols)); | 653       arguments->Set("alpn-protocols", std::move(alpn_protocols)); | 
| 653     } | 654     } | 
| 654     if (!ssl_options_.npn_protocols.empty()) { | 655     if (!ssl_options_.npn_protocols.empty()) { | 
| 655       std::unique_ptr<base::ListValue> npn_protocols(new base::ListValue()); | 656       std::unique_ptr<base::ListValue> npn_protocols(new base::ListValue()); | 
| 656       for (const std::string& proto : ssl_options_.npn_protocols) { | 657       for (const std::string& proto : ssl_options_.npn_protocols) { | 
| 657         npn_protocols->AppendString(proto); | 658         npn_protocols->AppendString(proto); | 
| 658       } | 659       } | 
| 659       arguments->Set("npn-protocols", std::move(npn_protocols)); | 660       arguments->Set("npn-protocols", std::move(npn_protocols)); | 
| 660     } | 661     } | 
| 661     if (ssl_options_.alert_after_handshake) | 662     if (ssl_options_.alert_after_handshake) | 
| 662       arguments->Set("alert-after-handshake", base::Value::CreateNullValue()); | 663       arguments->Set("alert-after-handshake", base::MakeUnique<base::Value>()); | 
| 663 | 664 | 
| 664     if (ssl_options_.disable_channel_id) | 665     if (ssl_options_.disable_channel_id) | 
| 665       arguments->Set("disable-channel-id", base::Value::CreateNullValue()); | 666       arguments->Set("disable-channel-id", base::MakeUnique<base::Value>()); | 
| 666     if (ssl_options_.disable_extended_master_secret) { | 667     if (ssl_options_.disable_extended_master_secret) { | 
| 667       arguments->Set("disable-extended-master-secret", | 668       arguments->Set("disable-extended-master-secret", | 
| 668                      base::Value::CreateNullValue()); | 669                      base::MakeUnique<base::Value>()); | 
| 669     } | 670     } | 
| 670     if (!ssl_options_.supported_token_binding_params.empty()) { | 671     if (!ssl_options_.supported_token_binding_params.empty()) { | 
| 671       std::unique_ptr<base::ListValue> token_binding_params( | 672       std::unique_ptr<base::ListValue> token_binding_params( | 
| 672           new base::ListValue()); | 673           new base::ListValue()); | 
| 673       arguments->Set( | 674       arguments->Set( | 
| 674           "token-binding-params", | 675           "token-binding-params", | 
| 675           GetTokenBindingParams(ssl_options_.supported_token_binding_params)); | 676           GetTokenBindingParams(ssl_options_.supported_token_binding_params)); | 
| 676     } | 677     } | 
| 677   } | 678   } | 
| 678 | 679 | 
| 679   return GenerateAdditionalArguments(arguments); | 680   return GenerateAdditionalArguments(arguments); | 
| 680 } | 681 } | 
| 681 | 682 | 
| 682 bool BaseTestServer::GenerateAdditionalArguments( | 683 bool BaseTestServer::GenerateAdditionalArguments( | 
| 683     base::DictionaryValue* arguments) const { | 684     base::DictionaryValue* arguments) const { | 
| 684   return true; | 685   return true; | 
| 685 } | 686 } | 
| 686 | 687 | 
| 687 }  // namespace net | 688 }  // namespace net | 
| OLD | NEW | 
|---|