diff --git a/DEPS b/DEPS index 55d0b4e..3365dfd1 100644 --- a/DEPS +++ b/DEPS
@@ -43,7 +43,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '23856ea4b7d08657788c72a46483d1ccbd7a6306', + 'v8_revision': '75076c2a96bc67b1c44cc283f85bac40ef456de3', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other.
diff --git a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc index ff15998..e4e11b9 100644 --- a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc +++ b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.cc
@@ -21,6 +21,8 @@ #include "extensions/common/permissions/permissions_data.h" #include "media/audio/audio_device_description.h" #include "media/audio/audio_output_controller.h" +#include "url/gurl.h" +#include "url/origin.h" namespace extensions { @@ -198,7 +200,7 @@ if (media::AudioDeviceDescription::IsDefaultDevice(raw_id)) return media::AudioDeviceDescription::kDefaultDeviceId; - GURL security_origin(source_url().GetOrigin()); + url::Origin security_origin(source_url().GetOrigin()); return content::GetHMACForMediaDeviceID(device_id_salt(), security_origin, raw_id); } @@ -446,7 +448,7 @@ WebrtcAudioPrivateGetAssociatedSinkFunction::GetRawSourceIDOnIOThread() { DCHECK_CURRENTLY_ON(BrowserThread::IO); - GURL security_origin(params_->security_origin); + url::Origin security_origin(GURL(params_->security_origin)); std::string source_id_in_origin(params_->source_id_in_origin); // Find the raw source ID for source_id_in_origin.
diff --git a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h index 2f683a7..a90c4aa 100644 --- a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h +++ b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h
@@ -16,7 +16,6 @@ #include "content/public/browser/resource_context.h" #include "extensions/browser/browser_context_keyed_api_factory.h" #include "media/audio/audio_device_name.h" -#include "url/gurl.h" namespace extensions {
diff --git a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc index 84e173d..8adf942 100644 --- a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc +++ b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_browsertest.cc
@@ -159,8 +159,7 @@ enumeration_event_.Wait(); } else { *id_in_origin = content::GetHMACForMediaDeviceID( - resource_context->GetMediaDeviceIDSalt(), - origin, + resource_context->GetMediaDeviceIDSalt(), url::Origin(origin), raw_device_id); enumeration_event_.Signal(); }
diff --git a/chrome/browser/net/dns_probe_runner.cc b/chrome/browser/net/dns_probe_runner.cc index 82b44908a..68c2b4aa 100644 --- a/chrome/browser/net/dns_probe_runner.cc +++ b/chrome/browser/net/dns_probe_runner.cc
@@ -29,7 +29,6 @@ using net::IPEndPoint; using net::NetLog; using net::NetworkChangeNotifier; -using net::ParseIPLiteralToNumber; namespace chrome_browser_net {
diff --git a/chrome/browser/net/dns_probe_service.cc b/chrome/browser/net/dns_probe_service.cc index 3e2a8724..bdda891 100644 --- a/chrome/browser/net/dns_probe_service.cc +++ b/chrome/browser/net/dns_probe_service.cc
@@ -22,7 +22,6 @@ using error_page::DnsProbeStatus; using net::DnsClient; using net::DnsConfig; -using net::ParseIPLiteralToNumber; using net::NetworkChangeNotifier; namespace chrome_browser_net {
diff --git a/chrome/chrome_common.gypi b/chrome/chrome_common.gypi index fe9ac06..0ee63d68 100644 --- a/chrome/chrome_common.gypi +++ b/chrome/chrome_common.gypi
@@ -566,7 +566,6 @@ 'common/net/x509_certificate_model.cc', 'common/net/x509_certificate_model.h', 'common/net/x509_certificate_model_nss.cc', - 'common/net/x509_certificate_model_openssl.cc', ], 'dependencies': [ '<(DEPTH)/base/base.gyp:base', @@ -592,15 +591,6 @@ 'common/net/x509_certificate_model.cc', ], }], - ['use_openssl_certs == 1 and OS != "android"', { - 'dependencies': [ - '<(DEPTH)/third_party/boringssl/boringssl.gyp:boringssl', - ], - }, { - 'sources!': [ - 'common/net/x509_certificate_model_openssl.cc', - ], - }], ['use_nss_certs == 1', { 'sources': [ # GN version: //chrome/third_party/mozilla_security_manager
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi index 4742da6..d946a69 100644 --- a/chrome/chrome_tests_unit.gypi +++ b/chrome/chrome_tests_unit.gypi
@@ -2728,7 +2728,7 @@ }], ], }], - ['OS != "android" and (use_nss_certs == 1 or use_openssl_certs == 1)', { + ['OS != "android" and use_nss_certs == 1', { 'sources': [ 'common/net/x509_certificate_model_unittest.cc', ],
diff --git a/chrome/common/net/BUILD.gn b/chrome/common/net/BUILD.gn index a6d51519..1268d6a6 100644 --- a/chrome/common/net/BUILD.gn +++ b/chrome/common/net/BUILD.gn
@@ -12,7 +12,6 @@ "x509_certificate_model.cc", "x509_certificate_model.h", "x509_certificate_model_nss.cc", - "x509_certificate_model_openssl.cc", ] configs += [ "//build/config/compiler:no_size_t_to_int_warning" ] @@ -38,12 +37,6 @@ sources -= [ "x509_certificate_model.cc" ] } - if (use_openssl_certs && !is_android) { - deps += [ "//third_party/boringssl" ] - } else { - sources -= [ "x509_certificate_model_openssl.cc" ] - } - if (use_nss_certs) { deps += [ "//chrome/third_party/mozilla_security_manager",
diff --git a/chrome/common/net/x509_certificate_model_openssl.cc b/chrome/common/net/x509_certificate_model_openssl.cc deleted file mode 100644 index 7081713..0000000 --- a/chrome/common/net/x509_certificate_model_openssl.cc +++ /dev/null
@@ -1,1219 +0,0 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/common/net/x509_certificate_model.h" - -#include <limits.h> -#include <openssl/mem.h> -#include <openssl/obj_mac.h> -#include <openssl/sha.h> -#include <openssl/stack.h> -#include <openssl/x509.h> -#include <openssl/x509v3.h> -#include <stddef.h> -#include <stdint.h> - -#include <memory> - -#include "base/i18n/number_formatting.h" -#include "base/lazy_instance.h" -#include "base/logging.h" -#include "base/macros.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/stringprintf.h" -#include "base/strings/utf_string_conversions.h" -#include "chrome/grit/generated_resources.h" -#include "crypto/openssl_bio_string.h" -#include "crypto/openssl_util.h" -#include "crypto/scoped_openssl_types.h" -#include "net/base/address_family.h" -#include "net/cert/x509_util_openssl.h" -#include "ui/base/l10n/l10n_util.h" - -namespace x509_util = net::x509_util; - -namespace x509_certificate_model { - -namespace { - -std::string ProcessRawAsn1String(ASN1_STRING* data) { - return ProcessRawBytes(ASN1_STRING_data(data), ASN1_STRING_length(data)); -} - -std::string ProcessRawAsn1Type(ASN1_TYPE* data) { - int len = i2d_ASN1_TYPE(data, NULL); - if (len <= 0) - return std::string(); - - std::unique_ptr<unsigned char[]> buf(new unsigned char[len]); - unsigned char* bufp = buf.get(); - - len = i2d_ASN1_TYPE(data, &bufp); - - return ProcessRawBytes(buf.get(), len); -} - -std::string ProcessRawBignum(BIGNUM* n) { - int len = BN_num_bytes(n); - std::unique_ptr<unsigned char[]> buf(new unsigned char[len]); - len = BN_bn2bin(n, buf.get()); - return ProcessRawBytes(buf.get(), len); -} - -std::string Asn1StringToUTF8(ASN1_STRING* asn1_string) { - std::string rv; - unsigned char* buf = NULL; - int len = ASN1_STRING_to_UTF8(&buf, asn1_string); - if (len < 0) - return rv; - rv = std::string(reinterpret_cast<const char*>(buf), len); - OPENSSL_free(buf); - return rv; -} - -std::string AlternativeWhenEmpty(const std::string& text, - const std::string& alternative) { - return text.empty() ? alternative : text; -} - -std::string GetKeyValuesFromNameEntry(X509_NAME_ENTRY* entry) { - std::string ret; - std::string key; - std::string value; - if (!x509_util::ParsePrincipalKeyAndValue(entry, &key, &value)) - return ret; - if (OBJ_obj2nid(X509_NAME_ENTRY_get_object(entry)) == NID_commonName) - value = x509_certificate_model::ProcessIDN(value); - ret = base::StringPrintf("%s = %s", key.c_str(), value.c_str()); - return ret; -} - -std::string GetKeyValuesFromNameEntries(STACK_OF(X509_NAME_ENTRY)* entries) { - std::string ret; - size_t rdns = sk_X509_NAME_ENTRY_num(entries); - for (size_t i = rdns - 1; i < rdns; --i) { - X509_NAME_ENTRY* entry = sk_X509_NAME_ENTRY_value(entries, i); - if (!entry) - continue; - base::StringAppendF(&ret, "%s\n", GetKeyValuesFromNameEntry(entry).c_str()); - } - return ret; -} - -std::string GetKeyValuesFromName(X509_NAME* name) { - std::string ret; - size_t rdns = X509_NAME_entry_count(name); - for (size_t i = rdns - 1; i < rdns; --i) { - X509_NAME_ENTRY* entry = X509_NAME_get_entry(name, i); - if (!entry) - continue; - base::StringAppendF(&ret, "%s\n", GetKeyValuesFromNameEntry(entry).c_str()); - } - return ret; -} - -std::string Asn1ObjectToOIDString(ASN1_OBJECT* obj) { - std::string s; - char buf[80]; - int buflen = OBJ_obj2txt(buf, sizeof(buf), obj, 1 /* no_name */); - if (buflen < 0) - return s; - - s = "OID."; - - if (static_cast<size_t>(buflen) < sizeof(buf)) { - s.append(buf, buflen); - return s; - } - - size_t prefix_len = s.size(); - s.resize(prefix_len + buflen + 1, ' '); - buflen = - OBJ_obj2txt(&s[prefix_len], s.size() - prefix_len, obj, 1 /* no_name */); - if (buflen < 0) { - s.clear(); - return s; - } - s.resize(prefix_len + buflen); - return s; -} - -int ms_cert_ext_certtype = -1; -int ms_certsrv_ca_version = -1; -int ms_ntds_replication = -1; -int eku_ms_time_stamping = -1; -int eku_ms_file_recovery = -1; -int eku_ms_windows_hardware_driver_verification = -1; -int eku_ms_qualified_subordination = -1; -int eku_ms_key_recovery = -1; -int eku_ms_document_signing = -1; -int eku_ms_lifetime_signing = -1; -int eku_ms_key_recovery_agent = -1; -int cert_attribute_ev_incorporation_country = -1; -int ns_cert_ext_ca_cert_url = -1; -int ns_cert_ext_homepage_url = -1; -int ns_cert_ext_lost_password_url = -1; -int ns_cert_ext_cert_renewal_time = -1; - -int RegisterDynamicOid(const char* oid_string, const char* short_name) { - int nid = OBJ_txt2nid(oid_string); - if (nid > 0) { - DVLOG(1) << "found already existing nid " << nid << " for " << oid_string; - return nid; - } - return OBJ_create(oid_string, short_name, short_name); -} - -class DynamicOidRegisterer { - public: - DynamicOidRegisterer() { - ms_cert_ext_certtype = - RegisterDynamicOid("1.3.6.1.4.1.311.20.2", "ms_cert_ext_certtype"); - ms_certsrv_ca_version = - RegisterDynamicOid("1.3.6.1.4.1.311.21.1", "ms_certsrv_ca_version"); - ms_ntds_replication = - RegisterDynamicOid("1.3.6.1.4.1.311.25.1", "ms_ntds_replication"); - - eku_ms_time_stamping = - RegisterDynamicOid("1.3.6.1.4.1.311.10.3.2", "eku_ms_time_stamping"); - eku_ms_file_recovery = - RegisterDynamicOid("1.3.6.1.4.1.311.10.3.4.1", "eku_ms_file_recovery"); - eku_ms_windows_hardware_driver_verification = - RegisterDynamicOid("1.3.6.1.4.1.311.10.3.5", - "eku_ms_windows_hardware_driver_verification"); - eku_ms_qualified_subordination = RegisterDynamicOid( - "1.3.6.1.4.1.311.10.3.10", "eku_ms_qualified_subordination"); - eku_ms_key_recovery = - RegisterDynamicOid("1.3.6.1.4.1.311.10.3.11", "eku_ms_key_recovery"); - eku_ms_document_signing = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.12", - "eku_ms_document_signing"); - eku_ms_lifetime_signing = RegisterDynamicOid("1.3.6.1.4.1.311.10.3.13", - "eku_ms_lifetime_signing"); - eku_ms_key_recovery_agent = - RegisterDynamicOid("1.3.6.1.4.1.311.21.6", "eku_ms_key_recovery_agent"); - - cert_attribute_ev_incorporation_country = RegisterDynamicOid( - "1.3.6.1.4.1.311.60.2.1.3", "cert_attribute_ev_incorporation_country"); - - ns_cert_ext_ca_cert_url = RegisterDynamicOid( - "2.16.840.1.113730.1.6", "ns_cert_ext_ca_cert_url"); - ns_cert_ext_homepage_url = RegisterDynamicOid( - "2.16.840.1.113730.1.9", "ns_cert_ext_homepage_url"); - ns_cert_ext_lost_password_url = RegisterDynamicOid( - "2.16.840.1.113730.1.14", "ns_cert_ext_lost_password_url"); - ns_cert_ext_cert_renewal_time = RegisterDynamicOid( - "2.16.840.1.113730.1.15", "ns_cert_ext_cert_renewal_time"); - } -}; - -static base::LazyInstance<DynamicOidRegisterer>::Leaky - g_dynamic_oid_registerer = LAZY_INSTANCE_INITIALIZER; - -std::string Asn1ObjectToString(ASN1_OBJECT* obj) { - g_dynamic_oid_registerer.Get(); - - int string_id; - int nid = OBJ_obj2nid(obj); - switch (nid) { - case NID_commonName: - string_id = IDS_CERT_OID_AVA_COMMON_NAME; - break; - case NID_stateOrProvinceName: - string_id = IDS_CERT_OID_AVA_STATE_OR_PROVINCE; - break; - case NID_organizationName: - string_id = IDS_CERT_OID_AVA_ORGANIZATION_NAME; - break; - case NID_organizationalUnitName: - string_id = IDS_CERT_OID_AVA_ORGANIZATIONAL_UNIT_NAME; - break; - case NID_dnQualifier: - string_id = IDS_CERT_OID_AVA_DN_QUALIFIER; - break; - case NID_countryName: - string_id = IDS_CERT_OID_AVA_COUNTRY_NAME; - break; - case NID_serialNumber: - string_id = IDS_CERT_OID_AVA_SERIAL_NUMBER; - break; - case NID_localityName: - string_id = IDS_CERT_OID_AVA_LOCALITY; - break; - case NID_domainComponent: - string_id = IDS_CERT_OID_AVA_DC; - break; - case NID_rfc822Mailbox: - string_id = IDS_CERT_OID_RFC1274_MAIL; - break; - case NID_userId: - string_id = IDS_CERT_OID_RFC1274_UID; - break; - case NID_pkcs9_emailAddress: - string_id = IDS_CERT_OID_PKCS9_EMAIL_ADDRESS; - break; - case NID_rsaEncryption: - string_id = IDS_CERT_OID_PKCS1_RSA_ENCRYPTION; - break; - case NID_md2WithRSAEncryption: - string_id = IDS_CERT_OID_PKCS1_MD2_WITH_RSA_ENCRYPTION; - break; - case NID_md4WithRSAEncryption: - string_id = IDS_CERT_OID_PKCS1_MD4_WITH_RSA_ENCRYPTION; - break; - case NID_md5WithRSAEncryption: - string_id = IDS_CERT_OID_PKCS1_MD5_WITH_RSA_ENCRYPTION; - break; - case NID_sha1WithRSAEncryption: - string_id = IDS_CERT_OID_PKCS1_SHA1_WITH_RSA_ENCRYPTION; - break; - case NID_sha256WithRSAEncryption: - string_id = IDS_CERT_OID_PKCS1_SHA256_WITH_RSA_ENCRYPTION; - break; - case NID_sha384WithRSAEncryption: - string_id = IDS_CERT_OID_PKCS1_SHA384_WITH_RSA_ENCRYPTION; - break; - case NID_sha512WithRSAEncryption: - string_id = IDS_CERT_OID_PKCS1_SHA512_WITH_RSA_ENCRYPTION; - break; - case NID_netscape_cert_type: - string_id = IDS_CERT_EXT_NS_CERT_TYPE; - break; - case NID_netscape_base_url: - string_id = IDS_CERT_EXT_NS_CERT_BASE_URL; - break; - case NID_netscape_revocation_url: - string_id = IDS_CERT_EXT_NS_CERT_REVOCATION_URL; - break; - case NID_netscape_ca_revocation_url: - string_id = IDS_CERT_EXT_NS_CA_REVOCATION_URL; - break; - case NID_netscape_renewal_url: - string_id = IDS_CERT_EXT_NS_CERT_RENEWAL_URL; - break; - case NID_netscape_ca_policy_url: - string_id = IDS_CERT_EXT_NS_CA_POLICY_URL; - break; - case NID_netscape_ssl_server_name: - string_id = IDS_CERT_EXT_NS_SSL_SERVER_NAME; - break; - case NID_netscape_comment: - string_id = IDS_CERT_EXT_NS_COMMENT; - break; - case NID_subject_directory_attributes: - string_id = IDS_CERT_X509_SUBJECT_DIRECTORY_ATTR; - break; - case NID_subject_key_identifier: - string_id = IDS_CERT_X509_SUBJECT_KEYID; - break; - case NID_key_usage: - string_id = IDS_CERT_X509_KEY_USAGE; - break; - case NID_subject_alt_name: - string_id = IDS_CERT_X509_SUBJECT_ALT_NAME; - break; - case NID_issuer_alt_name: - string_id = IDS_CERT_X509_ISSUER_ALT_NAME; - break; - case NID_basic_constraints: - string_id = IDS_CERT_X509_BASIC_CONSTRAINTS; - break; - case NID_name_constraints: - string_id = IDS_CERT_X509_NAME_CONSTRAINTS; - break; - case NID_crl_distribution_points: - string_id = IDS_CERT_X509_CRL_DIST_POINTS; - break; - case NID_certificate_policies: - string_id = IDS_CERT_X509_CERT_POLICIES; - break; - case NID_policy_mappings: - string_id = IDS_CERT_X509_POLICY_MAPPINGS; - break; - case NID_policy_constraints: - string_id = IDS_CERT_X509_POLICY_CONSTRAINTS; - break; - case NID_authority_key_identifier: - string_id = IDS_CERT_X509_AUTH_KEYID; - break; - case NID_ext_key_usage: - string_id = IDS_CERT_X509_EXT_KEY_USAGE; - break; - case NID_info_access: - string_id = IDS_CERT_X509_AUTH_INFO_ACCESS; - break; - case NID_server_auth: - string_id = IDS_CERT_EKU_TLS_WEB_SERVER_AUTHENTICATION; - break; - case NID_client_auth: - string_id = IDS_CERT_EKU_TLS_WEB_CLIENT_AUTHENTICATION; - break; - case NID_code_sign: - string_id = IDS_CERT_EKU_CODE_SIGNING; - break; - case NID_email_protect: - string_id = IDS_CERT_EKU_EMAIL_PROTECTION; - break; - case NID_time_stamp: - string_id = IDS_CERT_EKU_TIME_STAMPING; - break; - case NID_OCSP_sign: - string_id = IDS_CERT_EKU_OCSP_SIGNING; - break; - case NID_id_qt_cps: - string_id = IDS_CERT_PKIX_CPS_POINTER_QUALIFIER; - break; - case NID_id_qt_unotice: - string_id = IDS_CERT_PKIX_USER_NOTICE_QUALIFIER; - break; - case NID_ms_upn: - string_id = IDS_CERT_EXT_MS_NT_PRINCIPAL_NAME; - break; - case NID_ms_code_ind: - string_id = IDS_CERT_EKU_MS_INDIVIDUAL_CODE_SIGNING; - break; - case NID_ms_code_com: - string_id = IDS_CERT_EKU_MS_COMMERCIAL_CODE_SIGNING; - break; - case NID_ms_ctl_sign: - string_id = IDS_CERT_EKU_MS_TRUST_LIST_SIGNING; - break; - case NID_ms_sgc: - string_id = IDS_CERT_EKU_MS_SERVER_GATED_CRYPTO; - break; - case NID_ms_efs: - string_id = IDS_CERT_EKU_MS_ENCRYPTING_FILE_SYSTEM; - break; - case NID_ms_smartcard_login: - string_id = IDS_CERT_EKU_MS_SMART_CARD_LOGON; - break; - case NID_ns_sgc: - string_id = IDS_CERT_EKU_NETSCAPE_INTERNATIONAL_STEP_UP; - break; - case NID_businessCategory: - string_id = IDS_CERT_OID_BUSINESS_CATEGORY; - break; - case NID_undef: - string_id = -1; - break; - - default: - if (nid == ms_cert_ext_certtype) - string_id = IDS_CERT_EXT_MS_CERT_TYPE; - else if (nid == ms_certsrv_ca_version) - string_id = IDS_CERT_EXT_MS_CA_VERSION; - else if (nid == ms_ntds_replication) - string_id = IDS_CERT_EXT_MS_NTDS_REPLICATION; - else if (nid == eku_ms_time_stamping) - string_id = IDS_CERT_EKU_MS_TIME_STAMPING; - else if (nid == eku_ms_file_recovery) - string_id = IDS_CERT_EKU_MS_FILE_RECOVERY; - else if (nid == eku_ms_windows_hardware_driver_verification) - string_id = IDS_CERT_EKU_MS_WINDOWS_HARDWARE_DRIVER_VERIFICATION; - else if (nid == eku_ms_qualified_subordination) - string_id = IDS_CERT_EKU_MS_QUALIFIED_SUBORDINATION; - else if (nid == eku_ms_key_recovery) - string_id = IDS_CERT_EKU_MS_KEY_RECOVERY; - else if (nid == eku_ms_document_signing) - string_id = IDS_CERT_EKU_MS_DOCUMENT_SIGNING; - else if (nid == eku_ms_lifetime_signing) - string_id = IDS_CERT_EKU_MS_LIFETIME_SIGNING; - else if (nid == eku_ms_key_recovery_agent) - string_id = IDS_CERT_EKU_MS_KEY_RECOVERY_AGENT; - else if (nid == cert_attribute_ev_incorporation_country) - string_id = IDS_CERT_OID_EV_INCORPORATION_COUNTRY; - else if (nid == ns_cert_ext_lost_password_url) - string_id = IDS_CERT_EXT_NS_LOST_PASSWORD_URL; - else if (nid == ns_cert_ext_cert_renewal_time) - string_id = IDS_CERT_EXT_NS_CERT_RENEWAL_TIME; - else - string_id = -1; - break; - } - if (string_id >= 0) - return l10n_util::GetStringUTF8(string_id); - - return Asn1ObjectToOIDString(obj); -} - -struct MaskIdPair { - unsigned int mask; - int string_id; -}; - -std::string ProcessBitField(ASN1_BIT_STRING* bitfield, - const MaskIdPair* string_map, - size_t len, - char separator) { - unsigned int bits = 0; - std::string rv; - for (size_t i = 0; - i < sizeof(bits) && static_cast<int>(i) < ASN1_STRING_length(bitfield); - ++i) - bits |= ASN1_STRING_data(bitfield)[i] << (i * 8); - for (size_t i = 0; i < len; ++i) { - if (bits & string_map[i].mask) { - if (!rv.empty()) - rv += separator; - rv += l10n_util::GetStringUTF8(string_map[i].string_id); - } - } - return rv; -} - -std::string ProcessNSCertTypeExtension(X509_EXTENSION* ex) { - static const MaskIdPair usage_string_map[] = { - {NS_SSL_CLIENT, IDS_CERT_USAGE_SSL_CLIENT}, - {NS_SSL_SERVER, IDS_CERT_USAGE_SSL_SERVER}, - {NS_SMIME, IDS_CERT_EXT_NS_CERT_TYPE_EMAIL}, - {NS_OBJSIGN, IDS_CERT_USAGE_OBJECT_SIGNER}, - {NS_SSL_CA, IDS_CERT_USAGE_SSL_CA}, - {NS_SMIME_CA, IDS_CERT_EXT_NS_CERT_TYPE_EMAIL_CA}, - {NS_OBJSIGN_CA, IDS_CERT_USAGE_OBJECT_SIGNER}, - }; - - crypto::ScopedOpenSSL<ASN1_BIT_STRING, ASN1_BIT_STRING_free> value( - reinterpret_cast<ASN1_BIT_STRING*>(X509V3_EXT_d2i(ex))); - if (!value.get()) - return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); - return ProcessBitField(value.get(), - usage_string_map, - arraysize(usage_string_map), - '\n'); -} - -std::string ProcessKeyUsageExtension(X509_EXTENSION* ex) { - static const MaskIdPair key_usage_string_map[] = { - {KU_DIGITAL_SIGNATURE, IDS_CERT_X509_KEY_USAGE_SIGNING}, - {KU_NON_REPUDIATION, IDS_CERT_X509_KEY_USAGE_NONREP}, - {KU_KEY_ENCIPHERMENT, IDS_CERT_X509_KEY_USAGE_ENCIPHERMENT}, - {KU_DATA_ENCIPHERMENT, IDS_CERT_X509_KEY_USAGE_DATA_ENCIPHERMENT}, - {KU_KEY_AGREEMENT, IDS_CERT_X509_KEY_USAGE_KEY_AGREEMENT}, - {KU_KEY_CERT_SIGN, IDS_CERT_X509_KEY_USAGE_CERT_SIGNER}, - {KU_CRL_SIGN, IDS_CERT_X509_KEY_USAGE_CRL_SIGNER}, - {KU_ENCIPHER_ONLY, IDS_CERT_X509_KEY_USAGE_ENCIPHER_ONLY}, - {KU_DECIPHER_ONLY, IDS_CERT_X509_KEY_USAGE_DECIPHER_ONLY}, - }; - - crypto::ScopedOpenSSL<ASN1_BIT_STRING, ASN1_BIT_STRING_free> value( - reinterpret_cast<ASN1_BIT_STRING*>(X509V3_EXT_d2i(ex))); - if (!value.get()) - return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); - return ProcessBitField(value.get(), - key_usage_string_map, - arraysize(key_usage_string_map), - '\n'); -} - -std::string ProcessBasicConstraints(X509_EXTENSION* ex) { - std::string rv; - crypto::ScopedOpenSSL<BASIC_CONSTRAINTS, BASIC_CONSTRAINTS_free> value( - reinterpret_cast<BASIC_CONSTRAINTS*>(X509V3_EXT_d2i(ex))); - if (!value.get()) - return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); - if (value.get()->ca) - rv = l10n_util::GetStringUTF8(IDS_CERT_X509_BASIC_CONSTRAINT_IS_CA); - else - rv = l10n_util::GetStringUTF8(IDS_CERT_X509_BASIC_CONSTRAINT_IS_NOT_CA); - rv += '\n'; - if (value.get()->ca) { - base::string16 depth; - if (!value.get()->pathlen) { - depth = l10n_util::GetStringUTF16( - IDS_CERT_X509_BASIC_CONSTRAINT_PATH_LEN_UNLIMITED); - } else { - depth = base::FormatNumber(ASN1_INTEGER_get(value.get()->pathlen)); - } - rv += l10n_util::GetStringFUTF8(IDS_CERT_X509_BASIC_CONSTRAINT_PATH_LEN, - depth); - } - return rv; -} - -std::string ProcessExtKeyUsage(X509_EXTENSION* ex) { - std::string rv; - crypto::ScopedOpenSSL<EXTENDED_KEY_USAGE, EXTENDED_KEY_USAGE_free> value( - reinterpret_cast<EXTENDED_KEY_USAGE*>(X509V3_EXT_d2i(ex))); - if (!value.get()) - return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); - for (size_t i = 0; i < sk_ASN1_OBJECT_num(value.get()); i++) { - ASN1_OBJECT* obj = sk_ASN1_OBJECT_value(value.get(), i); - std::string oid_dump = Asn1ObjectToOIDString(obj); - std::string oid_text = Asn1ObjectToString(obj); - - // If oid is one we recognize, oid_text will have a text description of the - // OID, which we display along with the oid_dump. If we don't recognize the - // OID, they will be the same, so just display the OID alone. - if (oid_dump == oid_text) - rv += oid_dump; - else - rv += l10n_util::GetStringFUTF8(IDS_CERT_EXT_KEY_USAGE_FORMAT, - base::UTF8ToUTF16(oid_text), - base::UTF8ToUTF16(oid_dump)); - rv += '\n'; - } - return rv; -} - -std::string ProcessGeneralName(GENERAL_NAME* name) { - std::string key; - std::string value; - - switch (name->type) { - case GEN_OTHERNAME: { - ASN1_OBJECT* oid; - ASN1_TYPE* asn1_value; - GENERAL_NAME_get0_otherName(name, &oid, &asn1_value); - key = Asn1ObjectToString(oid); - // g_dynamic_oid_registerer.Get() will have been run by - // Asn1ObjectToString. - int nid = OBJ_obj2nid(oid); - if (nid == IDS_CERT_EXT_MS_NT_PRINCIPAL_NAME) { - // The type of this name is apparently nowhere explicitly - // documented. However, in the generated templates, it is always - // UTF-8. So try to decode this as UTF-8; if that fails, dump the - // raw data. - if (asn1_value->type == V_ASN1_UTF8STRING) { - value = std::string(reinterpret_cast<char*>(ASN1_STRING_data( - asn1_value->value.utf8string)), - ASN1_STRING_length(asn1_value->value.utf8string)); - } else { - value = ProcessRawAsn1Type(asn1_value); - } - } else if (nid == ms_ntds_replication) { - // This should be a 16-byte GUID. - if (asn1_value->type == V_ASN1_OCTET_STRING && - asn1_value->value.octet_string->length == 16) { - unsigned char* d = asn1_value->value.octet_string->data; - base::SStringPrintf( - &value, - "{%.2x%.2x%.2x%.2x-%.2x%.2x-%.2x%.2x-" - "%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x}", - d[3], d[2], d[1], d[0], d[5], d[4], d[7], d[6], - d[8], d[9], d[10], d[11], d[12], d[13], d[14], d[15]); - } else { - value = ProcessRawAsn1Type(asn1_value); - } - } else { - value = ProcessRawAsn1Type(asn1_value); - } - break; - } - case GEN_EMAIL: - key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_RFC822_NAME); - value = std::string( - reinterpret_cast<char*>(ASN1_STRING_data(name->d.rfc822Name)), - ASN1_STRING_length(name->d.rfc822Name)); - break; - case GEN_DNS: - key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_DNS_NAME); - value = std::string( - reinterpret_cast<char*>(ASN1_STRING_data(name->d.dNSName)), - ASN1_STRING_length(name->d.dNSName)); - value = ProcessIDN(value); - break; - case GEN_X400: - key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_X400_ADDRESS); - value = ProcessRawAsn1Type(name->d.x400Address); - break; - case GEN_DIRNAME: - key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_DIRECTORY_NAME); - value = GetKeyValuesFromName(name->d.directoryName); - break; - case GEN_EDIPARTY: - key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_EDI_PARTY_NAME); - if (name->d.ediPartyName->nameAssigner && - ASN1_STRING_length(name->d.ediPartyName->nameAssigner) > 0) { - value += l10n_util::GetStringFUTF8( - IDS_CERT_EDI_NAME_ASSIGNER, - base::UTF8ToUTF16( - Asn1StringToUTF8(name->d.ediPartyName->nameAssigner))); - value += "\n"; - } - if (name->d.ediPartyName->partyName && - ASN1_STRING_length(name->d.ediPartyName->partyName) > 0) { - value += l10n_util::GetStringFUTF8( - IDS_CERT_EDI_PARTY_NAME, - base::UTF8ToUTF16( - Asn1StringToUTF8(name->d.ediPartyName->partyName))); - value += "\n"; - } - break; - case GEN_URI: - key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_URI); - value = - std::string(reinterpret_cast<char*>( - ASN1_STRING_data(name->d.uniformResourceIdentifier)), - ASN1_STRING_length(name->d.uniformResourceIdentifier)); - break; - case GEN_IPADD: { - key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_IP_ADDRESS); - net::IPAddressNumber ip(ASN1_STRING_data(name->d.iPAddress), - ASN1_STRING_data(name->d.iPAddress) + - ASN1_STRING_length(name->d.iPAddress)); - if (net::GetAddressFamily(ip) != net::ADDRESS_FAMILY_UNSPECIFIED) { - value = net::IPAddressToString(ip); - } else { - // Invalid IP address. - value = ProcessRawBytes(ip.data(), ip.size()); - } - break; - } - case GEN_RID: - key = l10n_util::GetStringUTF8(IDS_CERT_GENERAL_NAME_REGISTERED_ID); - value = Asn1ObjectToString(name->d.registeredID); - break; - } - std::string rv(l10n_util::GetStringFUTF8(IDS_CERT_UNKNOWN_OID_INFO_FORMAT, - base::UTF8ToUTF16(key), - base::UTF8ToUTF16(value))); - rv += '\n'; - return rv; -} - -std::string ProcessGeneralNames(GENERAL_NAMES* names) { - std::string rv; - for (size_t i = 0; i < sk_GENERAL_NAME_num(names); ++i) { - GENERAL_NAME* name = sk_GENERAL_NAME_value(names, i); - rv += ProcessGeneralName(name); - } - return rv; -} - -std::string ProcessAltName(X509_EXTENSION* ex) { - crypto::ScopedOpenSSL<GENERAL_NAMES, GENERAL_NAMES_free> alt_names( - reinterpret_cast<GENERAL_NAMES*>(X509V3_EXT_d2i(ex))); - if (!alt_names.get()) - return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); - - return ProcessGeneralNames(alt_names.get()); -} - -std::string ProcessSubjectKeyId(X509_EXTENSION* ex) { - crypto::ScopedOpenSSL<ASN1_OCTET_STRING, ASN1_OCTET_STRING_free> value( - reinterpret_cast<ASN1_OCTET_STRING*>(X509V3_EXT_d2i(ex))); - if (!value.get()) - return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); - - return l10n_util::GetStringFUTF8( - IDS_CERT_KEYID_FORMAT, - base::ASCIIToUTF16(ProcessRawAsn1String(value.get()))); -} - -std::string ProcessAuthKeyId(X509_EXTENSION* ex) { - std::string rv; - crypto::ScopedOpenSSL<AUTHORITY_KEYID, AUTHORITY_KEYID_free> value( - reinterpret_cast<AUTHORITY_KEYID*>(X509V3_EXT_d2i(ex))); - if (!value.get()) - return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); - - if (value.get()->keyid && ASN1_STRING_length(value.get()->keyid) > 0) { - rv += l10n_util::GetStringFUTF8( - IDS_CERT_KEYID_FORMAT, - base::ASCIIToUTF16(ProcessRawAsn1String(value.get()->keyid))); - rv += '\n'; - } - - if (value.get()->issuer) { - rv += l10n_util::GetStringFUTF8( - IDS_CERT_ISSUER_FORMAT, - base::UTF8ToUTF16(ProcessGeneralNames(value.get()->issuer))); - rv += '\n'; - } - - if (value.get()->serial) { - rv += l10n_util::GetStringFUTF8( - IDS_CERT_SERIAL_NUMBER_FORMAT, - base::ASCIIToUTF16(ProcessRawAsn1String(value.get()->serial))); - rv += '\n'; - } - - return rv; -} - -std::string ProcessUserNotice(USERNOTICE* notice) { - std::string rv; - if (notice->noticeref) { - rv += Asn1StringToUTF8(notice->noticeref->organization); - rv += " - "; - for (size_t i = 0; i < sk_ASN1_INTEGER_num(notice->noticeref->noticenos); - ++i) { - ASN1_INTEGER* info = - sk_ASN1_INTEGER_value(notice->noticeref->noticenos, i); - long number = ASN1_INTEGER_get(info); - if (number != -1) { - if (i != sk_ASN1_INTEGER_num(notice->noticeref->noticenos) - 1) - rv += ", "; - rv += '#'; - rv += base::IntToString(number); - } - } - } - if (notice->exptext && notice->exptext->length != 0) { - rv += "\n "; - rv += Asn1StringToUTF8(notice->exptext); - } - return rv; -} - -std::string ProcessCertificatePolicies(X509_EXTENSION* ex) { - std::string rv; - crypto::ScopedOpenSSL<CERTIFICATEPOLICIES, CERTIFICATEPOLICIES_free> policies( - reinterpret_cast<CERTIFICATEPOLICIES*>(X509V3_EXT_d2i(ex))); - - if (!policies.get()) - return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); - - for (size_t i = 0; i < sk_POLICYINFO_num(policies.get()); ++i) { - POLICYINFO* info = sk_POLICYINFO_value(policies.get(), i); - std::string key = Asn1ObjectToString(info->policyid); - // If we have policy qualifiers, display the oid text - // with a ':', otherwise just put the oid text and a newline. - if (info->qualifiers && sk_POLICYQUALINFO_num(info->qualifiers)) { - rv += l10n_util::GetStringFUTF8(IDS_CERT_MULTILINE_INFO_START_FORMAT, - base::UTF8ToUTF16(key)); - } else { - rv += key; - } - rv += '\n'; - - if (info->qualifiers && sk_POLICYQUALINFO_num(info->qualifiers)) { - // Add all qualifiers on separate lines, indented. - for (size_t i = 0; i < sk_POLICYQUALINFO_num(info->qualifiers); ++i) { - POLICYQUALINFO* qualifier = - sk_POLICYQUALINFO_value(info->qualifiers, i); - rv += " "; - rv += l10n_util::GetStringFUTF8( - IDS_CERT_MULTILINE_INFO_START_FORMAT, - base::UTF8ToUTF16(Asn1ObjectToString(qualifier->pqualid))); - int nid = OBJ_obj2nid(qualifier->pqualid); - switch (nid) { - case NID_id_qt_cps: - rv += " "; - rv += std::string( - reinterpret_cast<char*>(ASN1_STRING_data(qualifier->d.cpsuri)), - ASN1_STRING_length(qualifier->d.cpsuri)); - break; - case NID_id_qt_unotice: - rv += ProcessUserNotice(qualifier->d.usernotice); - break; - default: - rv += ProcessRawAsn1Type(qualifier->d.other); - break; - } - rv += '\n'; - } - } - } - return rv; -} - -std::string ProcessCrlDistPoints(X509_EXTENSION* ex) { - static const MaskIdPair reason_string_map[] = { - // OpenSSL doesn't define contants for these. (The CRL_REASON_ defines in - // x509v3.h are for the "X509v3 CRL Reason Code" extension.) - // These are from RFC5280 section 4.2.1.13. - {0, IDS_CERT_REVOCATION_REASON_UNUSED}, - {1, IDS_CERT_REVOCATION_REASON_KEY_COMPROMISE}, - {2, IDS_CERT_REVOCATION_REASON_CA_COMPROMISE}, - {3, IDS_CERT_REVOCATION_REASON_AFFILIATION_CHANGED}, - {4, IDS_CERT_REVOCATION_REASON_SUPERSEDED}, - {5, IDS_CERT_REVOCATION_REASON_CESSATION_OF_OPERATION}, - {6, IDS_CERT_REVOCATION_REASON_CERTIFICATE_HOLD}, - {7, IDS_CERT_REVOCATION_REASON_PRIVILEGE_WITHDRAWN}, - {8, IDS_CERT_REVOCATION_REASON_AA_COMPROMISE}, - }; - // OpenSSL doesn't define constants for the DIST_POINT type field. These - // values are from reading openssl/crypto/x509v3/v3_crld.c - const int kDistPointFullName = 0; - const int kDistPointRelativeName = 1; - - std::string rv; - crypto::ScopedOpenSSL<CRL_DIST_POINTS, CRL_DIST_POINTS_free> dist_points( - reinterpret_cast<CRL_DIST_POINTS*>(X509V3_EXT_d2i(ex))); - - if (!dist_points.get()) - return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); - - for (size_t i = 0; i < sk_DIST_POINT_num(dist_points.get()); ++i) { - DIST_POINT* point = sk_DIST_POINT_value(dist_points.get(), i); - if (point->distpoint) { - switch (point->distpoint->type) { - case kDistPointFullName: - rv += ProcessGeneralNames(point->distpoint->name.fullname); - break; - case kDistPointRelativeName: - rv += - GetKeyValuesFromNameEntries(point->distpoint->name.relativename); - // TODO(mattm): should something be done with - // point->distpoint->dpname? - break; - } - } - if (point->reasons) { - rv += ' '; - rv += ProcessBitField(point->reasons, - reason_string_map, - arraysize(reason_string_map), - ','); - rv += '\n'; - } - if (point->CRLissuer) { - rv += l10n_util::GetStringFUTF8( - IDS_CERT_ISSUER_FORMAT, - base::UTF8ToUTF16(ProcessGeneralNames(point->CRLissuer))); - } - } - - return rv; -} - -std::string ProcessAuthInfoAccess(X509_EXTENSION* ex) { - std::string rv; - crypto::ScopedOpenSSL<AUTHORITY_INFO_ACCESS, AUTHORITY_INFO_ACCESS_free> aia( - reinterpret_cast<AUTHORITY_INFO_ACCESS*>(X509V3_EXT_d2i(ex))); - - if (!aia.get()) - return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); - - for (size_t i = 0; i < sk_ACCESS_DESCRIPTION_num(aia.get()); ++i) { - ACCESS_DESCRIPTION* desc = sk_ACCESS_DESCRIPTION_value(aia.get(), i); - - base::string16 location_str = - base::UTF8ToUTF16(ProcessGeneralName(desc->location)); - switch (OBJ_obj2nid(desc->method)) { - case NID_ad_OCSP: - rv += l10n_util::GetStringFUTF8(IDS_CERT_OCSP_RESPONDER_FORMAT, - location_str); - break; - case NID_ad_ca_issuers: - rv += - l10n_util::GetStringFUTF8(IDS_CERT_CA_ISSUERS_FORMAT, location_str); - break; - default: - rv += l10n_util::GetStringFUTF8( - IDS_CERT_UNKNOWN_OID_INFO_FORMAT, - base::UTF8ToUTF16(Asn1ObjectToString(desc->method)), - location_str); - break; - } - } - return rv; -} - -std::string ProcessIA5StringData(ASN1_OCTET_STRING* asn1_string) { - const unsigned char* data = ASN1_STRING_data(asn1_string); - crypto::ScopedOpenSSL<ASN1_IA5STRING, ASN1_IA5STRING_free> ia5_string( - d2i_ASN1_IA5STRING(NULL, &data, ASN1_STRING_length(asn1_string))); - - if (!ia5_string.get()) - return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); - - return std::string( - reinterpret_cast<char*>(ASN1_STRING_data(ia5_string.get())), - ASN1_STRING_length(ia5_string.get())); -} - -std::string ProcessBMPStringData(ASN1_OCTET_STRING* asn1_string) { - const unsigned char* data = ASN1_STRING_data(asn1_string); - crypto::ScopedOpenSSL<ASN1_BMPSTRING, ASN1_BMPSTRING_free> bmp_string( - d2i_ASN1_BMPSTRING(NULL, &data, ASN1_STRING_length(asn1_string))); - - if (!bmp_string.get()) - return l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_DUMP_ERROR); - - return Asn1StringToUTF8(bmp_string.get()); -} - -std::string X509ExtensionValueToString(X509_EXTENSION* ex) { - g_dynamic_oid_registerer.Get(); - int nid = OBJ_obj2nid(X509_EXTENSION_get_object(ex)); - switch (nid) { - case NID_netscape_cert_type: - return ProcessNSCertTypeExtension(ex); - case NID_key_usage: - return ProcessKeyUsageExtension(ex); - case NID_basic_constraints: - return ProcessBasicConstraints(ex); - case NID_ext_key_usage: - return ProcessExtKeyUsage(ex); - case NID_issuer_alt_name: - case NID_subject_alt_name: - return ProcessAltName(ex); - case NID_subject_key_identifier: - return ProcessSubjectKeyId(ex); - case NID_authority_key_identifier: - return ProcessAuthKeyId(ex); - case NID_certificate_policies: - return ProcessCertificatePolicies(ex); - case NID_crl_distribution_points: - return ProcessCrlDistPoints(ex); - case NID_info_access: - return ProcessAuthInfoAccess(ex); - case NID_netscape_base_url: - case NID_netscape_revocation_url: - case NID_netscape_ca_revocation_url: - case NID_netscape_renewal_url: - case NID_netscape_ca_policy_url: - case NID_netscape_comment: - case NID_netscape_ssl_server_name: - return ProcessIA5StringData(X509_EXTENSION_get_data(ex)); - default: - if (nid == ns_cert_ext_ca_cert_url || - nid == ns_cert_ext_homepage_url || - nid == ns_cert_ext_lost_password_url) - return ProcessIA5StringData(X509_EXTENSION_get_data(ex)); - if (nid == ms_cert_ext_certtype) - return ProcessBMPStringData(X509_EXTENSION_get_data(ex)); - return ProcessRawAsn1String(X509_EXTENSION_get_data(ex)); - } -} - -} // namespace - -using net::X509Certificate; - -std::string GetCertNameOrNickname(X509Certificate::OSCertHandle cert_handle) { - std::string name = - ProcessIDN(GetSubjectCommonName(cert_handle, std::string())); - if (!name.empty()) - return name; - - crypto::ScopedBIO bio(crypto::BIO_new_string(&name)); - if (!bio.get()) - return name; - X509_NAME_print_ex(bio.get(), - X509_get_subject_name(cert_handle), - 0 /* indent */, - XN_FLAG_RFC2253 & ~ASN1_STRFLGS_ESC_MSB); - return name; -} - -std::string GetTokenName(X509Certificate::OSCertHandle cert_handle) { - // TODO(bulach): implement me. - return ""; -} - -std::string GetVersion(net::X509Certificate::OSCertHandle cert_handle) { - unsigned long version = X509_get_version(cert_handle); - if (version != ULONG_MAX) - return base::UintToString(version + 1); - return ""; -} - -net::CertType GetType(X509Certificate::OSCertHandle os_cert) { - // TODO(bulach): implement me. - return net::OTHER_CERT; -} - -void GetUsageStrings(X509Certificate::OSCertHandle cert_handle, - std::vector<std::string>* usages) { - // TODO(bulach): implement me. -} - -std::string GetSerialNumberHexified( - X509Certificate::OSCertHandle cert_handle, - const std::string& alternative_text) { - ASN1_INTEGER* num = X509_get_serialNumber(cert_handle); - const char kSerialNumberSeparator = ':'; - std::string hex_string = ProcessRawBytesWithSeparators( - num->data, num->length, kSerialNumberSeparator, kSerialNumberSeparator); - return AlternativeWhenEmpty(hex_string, alternative_text); -} - -std::string GetIssuerCommonName( - X509Certificate::OSCertHandle cert_handle, - const std::string& alternative_text) { - std::string ret; - x509_util::ParsePrincipalValueByNID(X509_get_issuer_name(cert_handle), - NID_commonName, &ret); - return AlternativeWhenEmpty(ret, alternative_text); -} - -std::string GetIssuerOrgName( - X509Certificate::OSCertHandle cert_handle, - const std::string& alternative_text) { - std::string ret; - x509_util::ParsePrincipalValueByNID(X509_get_issuer_name(cert_handle), - NID_organizationName, &ret); - return AlternativeWhenEmpty(ret, alternative_text); -} - -std::string GetIssuerOrgUnitName( - X509Certificate::OSCertHandle cert_handle, - const std::string& alternative_text) { - std::string ret; - x509_util::ParsePrincipalValueByNID(X509_get_issuer_name(cert_handle), - NID_organizationalUnitName, &ret); - return AlternativeWhenEmpty(ret, alternative_text); -} - -std::string GetSubjectOrgName( - X509Certificate::OSCertHandle cert_handle, - const std::string& alternative_text) { - std::string ret; - x509_util::ParsePrincipalValueByNID(X509_get_subject_name(cert_handle), - NID_organizationName, &ret); - return AlternativeWhenEmpty(ret, alternative_text); -} - -std::string GetSubjectOrgUnitName( - X509Certificate::OSCertHandle cert_handle, - const std::string& alternative_text) { - std::string ret; - x509_util::ParsePrincipalValueByNID(X509_get_subject_name(cert_handle), - NID_organizationalUnitName, &ret); - return AlternativeWhenEmpty(ret, alternative_text); -} - -std::string GetSubjectCommonName(X509Certificate::OSCertHandle cert_handle, - const std::string& alternative_text) { - std::string ret; - x509_util::ParsePrincipalValueByNID(X509_get_subject_name(cert_handle), - NID_commonName, &ret); - return AlternativeWhenEmpty(ret, alternative_text); -} - -bool GetTimes(X509Certificate::OSCertHandle cert_handle, - base::Time* issued, base::Time* expires) { - return x509_util::ParseDate(X509_get_notBefore(cert_handle), issued) && - x509_util::ParseDate(X509_get_notAfter(cert_handle), expires); -} - -std::string GetTitle(net::X509Certificate::OSCertHandle cert_handle) { - // TODO(mattm): merge GetTitle and GetCertNameOrNickname? - // Is there any reason GetCertNameOrNickname calls ProcessIDN and this - // doesn't? - std::string title = - GetSubjectCommonName(cert_handle, std::string()); - if (!title.empty()) - return title; - - crypto::ScopedBIO bio(crypto::BIO_new_string(&title)); - if (!bio.get()) - return title; - X509_NAME_print_ex(bio.get(), - X509_get_subject_name(cert_handle), - 0 /* indent */, - XN_FLAG_RFC2253 & ~ASN1_STRFLGS_ESC_MSB); - return title; -} - -std::string GetIssuerName(net::X509Certificate::OSCertHandle cert_handle) { - return GetKeyValuesFromName(X509_get_issuer_name(cert_handle)); -} - -std::string GetSubjectName(net::X509Certificate::OSCertHandle cert_handle) { - return GetKeyValuesFromName(X509_get_subject_name(cert_handle)); -} - -void GetExtensions( - const std::string& critical_label, - const std::string& non_critical_label, - net::X509Certificate::OSCertHandle cert_handle, - Extensions* extensions) { - for (int i = 0; i < X509_get_ext_count(cert_handle); ++i) { - X509_EXTENSION* ex = X509_get_ext(cert_handle, i); - ASN1_OBJECT* obj = X509_EXTENSION_get_object(ex); - - Extension extension; - extension.name = Asn1ObjectToString(obj); - extension.value = (X509_EXTENSION_get_critical(ex) ? critical_label - : non_critical_label) + - "\n" + X509ExtensionValueToString(ex); - extensions->push_back(extension); - } -} - -std::string HashCertSHA256(net::X509Certificate::OSCertHandle cert_handle) { - unsigned char sha256_data[SHA256_DIGEST_LENGTH] = {0}; - unsigned int sha256_size = sizeof(sha256_data); - int ret = X509_digest(cert_handle, EVP_sha256(), sha256_data, &sha256_size); - DCHECK(ret); - DCHECK_EQ(sha256_size, sizeof(sha256_data)); - return ProcessRawBytes(sha256_data, sha256_size); -} - -std::string HashCertSHA1(net::X509Certificate::OSCertHandle cert_handle) { - unsigned char sha1_data[SHA_DIGEST_LENGTH] = {0}; - unsigned int sha1_size = sizeof(sha1_data); - int ret = X509_digest(cert_handle, EVP_sha1(), sha1_data, &sha1_size); - DCHECK(ret); - DCHECK_EQ(sha1_size, sizeof(sha1_data)); - return ProcessRawBytes(sha1_data, sha1_size); -} - -std::string GetCMSString(const net::X509Certificate::OSCertHandles& cert_chain, - size_t start, size_t end) { - STACK_OF(X509)* certs = sk_X509_new_null(); - - for (size_t i = start; i < end; ++i) { - sk_X509_push(certs, cert_chain[i]); - } - - CBB pkcs7; - CBB_init(&pkcs7, 1024 * sk_X509_num(certs)); - - uint8_t *pkcs7_data; - size_t pkcs7_len; - if (!PKCS7_bundle_certificates(&pkcs7, certs) || - !CBB_finish(&pkcs7, &pkcs7_data, &pkcs7_len)) { - CBB_cleanup(&pkcs7); - sk_X509_free(certs); - return ""; - } - - std::string ret(reinterpret_cast<char*>(pkcs7_data), pkcs7_len); - OPENSSL_free(pkcs7_data); - sk_X509_free(certs); - - return ret; -} - -std::string ProcessSecAlgorithmSignature( - net::X509Certificate::OSCertHandle cert_handle) { - return Asn1ObjectToString(cert_handle->cert_info->signature->algorithm); -} - -std::string ProcessSecAlgorithmSubjectPublicKey( - net::X509Certificate::OSCertHandle cert_handle) { - return Asn1ObjectToString( - X509_get_X509_PUBKEY(cert_handle)->algor->algorithm); -} - -std::string ProcessSecAlgorithmSignatureWrap( - net::X509Certificate::OSCertHandle cert_handle) { - return Asn1ObjectToString(cert_handle->sig_alg->algorithm); -} - -std::string ProcessSubjectPublicKeyInfo( - net::X509Certificate::OSCertHandle cert_handle) { - std::string rv; - crypto::ScopedEVP_PKEY public_key(X509_get_pubkey(cert_handle)); - if (!public_key.get()) - return rv; - switch (EVP_PKEY_type(public_key.get()->type)) { - case EVP_PKEY_RSA: { - crypto::ScopedRSA rsa_key(EVP_PKEY_get1_RSA(public_key.get())); - if (!rsa_key) - return rv; - rv = l10n_util::GetStringFUTF8( - IDS_CERT_RSA_PUBLIC_KEY_DUMP_FORMAT, - base::UintToString16(BN_num_bits(rsa_key.get()->n)), - base::UTF8ToUTF16(ProcessRawBignum(rsa_key.get()->n)), - base::UintToString16(BN_num_bits(rsa_key.get()->e)), - base::UTF8ToUTF16(ProcessRawBignum(rsa_key.get()->e))); - return rv; - } - default: - rv = ProcessRawAsn1String(X509_get_X509_PUBKEY(cert_handle)->public_key); - return rv; - } -} - -std::string ProcessRawBitsSignatureWrap( - net::X509Certificate::OSCertHandle cert_handle) { - return ProcessRawAsn1String(cert_handle->signature); -} - -} // namespace x509_certificate_model
diff --git a/chrome/common/net/x509_certificate_model_unittest.cc b/chrome/common/net/x509_certificate_model_unittest.cc index 53e253d..9a51f28 100644 --- a/chrome/common/net/x509_certificate_model_unittest.cc +++ b/chrome/common/net/x509_certificate_model_unittest.cc
@@ -37,30 +37,18 @@ net::ImportCertFromFile(net::GetTestCertsDirectory(), "no_subject_common_name_cert.pem")); ASSERT_TRUE(no_cn_cert.get()); -#if defined(USE_OPENSSL_CERTS) - EXPECT_EQ("emailAddress=wtc@google.com", - x509_certificate_model::GetCertNameOrNickname( - no_cn_cert->os_cert_handle())); -#else // Temp cert has no nickname. EXPECT_EQ("", x509_certificate_model::GetCertNameOrNickname( no_cn_cert->os_cert_handle())); -#endif EXPECT_EQ("xn--wgv71a119e.com", x509_certificate_model::GetTitle( punycode_cert->os_cert_handle())); -#if defined(USE_OPENSSL_CERTS) - EXPECT_EQ("emailAddress=wtc@google.com", - x509_certificate_model::GetTitle( - no_cn_cert->os_cert_handle())); -#else EXPECT_EQ("E=wtc@google.com", x509_certificate_model::GetTitle( no_cn_cert->os_cert_handle())); -#endif scoped_refptr<net::X509Certificate> no_cn_cert2(net::ImportCertFromFile( net::GetTestCertsDirectory(), "ct-test-embedded-cert.pem")); @@ -225,11 +213,6 @@ "root_ca_cert.pem")); ASSERT_TRUE(cert.get()); -#if defined(USE_OPENSSL_CERTS) - // Remove this when OpenSSL build implements the necessary functions. - EXPECT_EQ(net::OTHER_CERT, - x509_certificate_model::GetType(cert->os_cert_handle())); -#else EXPECT_EQ(net::CA_CERT, x509_certificate_model::GetType(cert->os_cert_handle())); @@ -246,7 +229,6 @@ EXPECT_EQ(net::CA_CERT, x509_certificate_model::GetType(cert->os_cert_handle())); -#endif } TEST(X509CertificateModelTest, GetTypeServer) { @@ -255,11 +237,6 @@ "google.single.der")); ASSERT_TRUE(cert.get()); -#if defined(USE_OPENSSL_CERTS) - // Remove this when OpenSSL build implements the necessary functions. - EXPECT_EQ(net::OTHER_CERT, - x509_certificate_model::GetType(cert->os_cert_handle())); -#else // Test mozilla_security_manager::GetCertType with server certs and default // trust. Currently this doesn't work. // TODO(mattm): make mozilla_security_manager::GetCertType smarter so we can @@ -286,7 +263,6 @@ EXPECT_EQ(net::SERVER_CERT, x509_certificate_model::GetType(cert->os_cert_handle())); -#endif } // An X.509 v1 certificate with the version field omitted should get @@ -325,15 +301,11 @@ net::X509Certificate::FORMAT_PKCS7); ASSERT_EQ(certs.size(), decoded_certs.size()); -#if defined(USE_OPENSSL_CERTS) - for (size_t i = 0; i < certs.size(); ++i) - EXPECT_TRUE(certs[i]->Equals(decoded_certs[i].get())); -#else + // NSS sorts the certs before writing the file. EXPECT_TRUE(certs[0]->Equals(decoded_certs.back().get())); for (size_t i = 1; i < certs.size(); ++i) EXPECT_TRUE(certs[i]->Equals(decoded_certs[i - 1].get())); -#endif } { @@ -410,11 +382,7 @@ "2A 15 84 49 F1 01 BF 9B 30 06 D0 15 A0 1F 9D 51\n" "91 47 E1 53 5F EF 5E EC C2 61 79 C2 14 9F C4 E3\n" "\n" -#if defined(USE_OPENSSL_CERTS) - " Public Exponent (17 bits):\n" -#else " Public Exponent (24 bits):\n" -#endif " 01 00 01", x509_certificate_model::ProcessSubjectPublicKeyInfo( cert->os_cert_handle()));
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 32678c0..21ad3fa 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -2128,7 +2128,7 @@ "//chrome") } } - if (!is_android && (use_nss_certs || use_openssl_certs)) { + if (!is_android && use_nss_certs) { sources += [ "../common/net/x509_certificate_model_unittest.cc" ] } if (enable_supervised_users) {
diff --git a/content/browser/renderer_host/media/audio_renderer_host.cc b/content/browser/renderer_host/media/audio_renderer_host.cc index 4dc9b44..7e951f1 100644 --- a/content/browser/renderer_host/media/audio_renderer_host.cc +++ b/content/browser/renderer_host/media/audio_renderer_host.cc
@@ -16,7 +16,6 @@ #include "base/process/process.h" #include "content/browser/bad_message.h" #include "content/browser/browser_main_loop.h" -#include "content/browser/child_process_security_policy_impl.h" #include "content/browser/media/audio_stream_monitor.h" #include "content/browser/media/capture/audio_mirroring_manager.h" #include "content/browser/media/media_internals.h" @@ -56,10 +55,6 @@ std::make_pair(authorized, device_unique_id)); } -GURL ConvertToGURL(const url::Origin& origin) { - return origin.unique() ? GURL() : GURL(origin.Serialize()); -} - bool IsValidDeviceId(const std::string& device_id) { static const std::string::size_type kValidLength = 64; @@ -438,10 +433,9 @@ stream_id, true, info->device.matched_output_device_id)); MaybeFixAudioParameters(&output_params); // Hash matched device id and pass it to the renderer - GURL gurl_security_origin = ConvertToGURL(security_origin); Send(new AudioMsg_NotifyDeviceAuthorized( stream_id, media::OUTPUT_DEVICE_STATUS_OK, output_params, - GetHMACForMediaDeviceID(salt_callback_, gurl_security_origin, + GetHMACForMediaDeviceID(salt_callback_, security_origin, info->device.matched_output_device_id))); return; } @@ -449,16 +443,15 @@ authorizations_.insert( MakeAuthorizationData(stream_id, false, std::string())); - GURL gurl_security_origin = ConvertToGURL(security_origin); CheckOutputDeviceAccess( - render_frame_id, device_id, gurl_security_origin, + render_frame_id, device_id, security_origin, base::Bind(&AudioRendererHost::OnDeviceAuthorized, this, stream_id, - device_id, gurl_security_origin)); + device_id, security_origin)); } void AudioRendererHost::OnDeviceAuthorized(int stream_id, const std::string& device_id, - const GURL& gurl_security_origin, + const url::Origin& security_origin, bool have_access) { DCHECK_CURRENTLY_ON(BrowserThread::IO); const auto& auth_data = authorizations_.find(stream_id); @@ -490,7 +483,7 @@ } else { media_stream_manager_->audio_output_device_enumerator()->Enumerate( base::Bind(&AudioRendererHost::TranslateDeviceID, this, device_id, - gurl_security_origin, + security_origin, base::Bind(&AudioRendererHost::OnDeviceIDTranslated, this, stream_id))); } @@ -747,15 +740,15 @@ void AudioRendererHost::CheckOutputDeviceAccess( int render_frame_id, const std::string& device_id, - const GURL& gurl_security_origin, + const url::Origin& security_origin, const OutputDeviceAccessCB& callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); // Check security origin if nondefault device is requested. // Ignore check for default device, which is always authorized. if (!media::AudioDeviceDescription::IsDefaultDevice(device_id) && - !ChildProcessSecurityPolicyImpl::GetInstance()->CanRequestURL( - render_process_id_, gurl_security_origin)) { + !MediaStreamManager::IsOriginAllowed(render_process_id_, + security_origin)) { content::bad_message::ReceivedBadMessage(this, bad_message::ARH_UNAUTHORIZED_URL); return; @@ -773,7 +766,7 @@ // MEDIA_DEVICE_AUDIO_OUTPUT. // TODO(guidou): Change to MEDIA_DEVICE_AUDIO_OUTPUT when support becomes // available. http://crbug.com/498675 - ui_proxy->CheckAccess(gurl_security_origin, MEDIA_DEVICE_AUDIO_CAPTURE, + ui_proxy->CheckAccess(security_origin, MEDIA_DEVICE_AUDIO_CAPTURE, render_process_id_, render_frame_id, base::Bind(&AudioRendererHost::AccessChecked, this, base::Passed(&ui_proxy), callback)); @@ -790,7 +783,7 @@ void AudioRendererHost::TranslateDeviceID( const std::string& device_id, - const GURL& security_origin, + const url::Origin& security_origin, const OutputDeviceInfoCB& callback, const AudioOutputDeviceEnumeration& enumeration) { DCHECK_CURRENTLY_ON(BrowserThread::IO);
diff --git a/content/browser/renderer_host/media/audio_renderer_host.h b/content/browser/renderer_host/media/audio_renderer_host.h index b4e9d3f..4f2747be 100644 --- a/content/browser/renderer_host/media/audio_renderer_host.h +++ b/content/browser/renderer_host/media/audio_renderer_host.h
@@ -147,7 +147,7 @@ int render_frame_id, int session_id, const std::string& device_id, - const url::Origin& gurl_security_origin); + const url::Origin& security_origin); // Creates an audio output stream with the specified format. // Upon success/failure, the peer is notified via the NotifyStreamCreated @@ -173,7 +173,7 @@ // Proceed with device authorization after checking permissions. void OnDeviceAuthorized(int stream_id, const std::string& device_id, - const GURL& security_origin, + const url::Origin& security_origin, bool have_access); // Proceed with device authorization after translating device ID. @@ -219,7 +219,7 @@ // Check if the renderer process has access to the requested output device. void CheckOutputDeviceAccess(int render_frame_id, const std::string& device_id, - const GURL& gurl_security_origin, + const url::Origin& security_origin, const OutputDeviceAccessCB& callback); // Invoke |callback| after permission to use a device has been checked. @@ -229,7 +229,7 @@ // Translate the hashed |device_id| to a unique device ID. void TranslateDeviceID(const std::string& device_id, - const GURL& gurl_security_origin, + const url::Origin& security_origin, const OutputDeviceInfoCB& callback, const AudioOutputDeviceEnumeration& enumeration);
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc index f325e92..1a1323b 100644 --- a/content/browser/renderer_host/media/media_stream_dispatcher_host.cc +++ b/content/browser/renderer_host/media/media_stream_dispatcher_host.cc
@@ -5,7 +5,6 @@ #include "content/browser/renderer_host/media/media_stream_dispatcher_host.h" #include "content/browser/browser_main_loop.h" -#include "content/browser/child_process_security_policy_impl.h" #include "content/common/media/media_stream_messages.h" #include "content/common/media/media_stream_options.h" #include "content/public/browser/render_process_host.h" @@ -129,18 +128,19 @@ MediaStreamDispatcherHost::~MediaStreamDispatcherHost() { } -void MediaStreamDispatcherHost::OnGenerateStream(int render_frame_id, - int page_request_id, - const StreamControls& controls, - const GURL& security_origin, - bool user_gesture) { +void MediaStreamDispatcherHost::OnGenerateStream( + int render_frame_id, + int page_request_id, + const StreamControls& controls, + const url::Origin& security_origin, + bool user_gesture) { DVLOG(1) << "MediaStreamDispatcherHost::OnGenerateStream(" << render_frame_id << ", " << page_request_id << ", [" << " audio:" << controls.audio.requested - << " video:" << controls.video.requested << " ], " - << security_origin.spec() << ", " << user_gesture << ")"; + << " video:" << controls.video.requested << " ], " << security_origin + << ", " << user_gesture << ")"; - if (!IsURLAllowed(security_origin)) + if (!MediaStreamManager::IsOriginAllowed(render_process_id_, security_origin)) return; media_stream_manager_->GenerateStream( @@ -171,14 +171,12 @@ int render_frame_id, int page_request_id, MediaStreamType type, - const GURL& security_origin) { + const url::Origin& security_origin) { DVLOG(1) << "MediaStreamDispatcherHost::OnEnumerateDevices(" - << render_frame_id << ", " - << page_request_id << ", " - << type << ", " - << security_origin.spec() << ")"; + << render_frame_id << ", " << page_request_id << ", " << type << ", " + << security_origin << ")"; - if (!IsURLAllowed(security_origin)) + if (!MediaStreamManager::IsOriginAllowed(render_process_id_, security_origin)) return; media_stream_manager_->EnumerateDevices( @@ -201,15 +199,12 @@ int page_request_id, const std::string& device_id, MediaStreamType type, - const GURL& security_origin) { - DVLOG(1) << "MediaStreamDispatcherHost::OnOpenDevice(" - << render_frame_id << ", " - << page_request_id << ", device_id: " - << device_id.c_str() << ", type: " - << type << ", " - << security_origin.spec() << ")"; + const url::Origin& security_origin) { + DVLOG(1) << "MediaStreamDispatcherHost::OnOpenDevice(" << render_frame_id + << ", " << page_request_id << ", device_id: " << device_id.c_str() + << ", type: " << type << ", " << security_origin << ")"; - if (!IsURLAllowed(security_origin)) + if (!MediaStreamManager::IsOriginAllowed(render_process_id_, security_origin)) return; media_stream_manager_->OpenDevice( @@ -227,14 +222,4 @@ media_stream_manager_->CancelRequest(label); } -bool MediaStreamDispatcherHost::IsURLAllowed(const GURL& url) { - if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanRequestURL( - render_process_id_, url)) { - LOG(ERROR) << "MSDH: Renderer requested a URL it's not allowed to use."; - return false; - } - - return true; -} - } // namespace content
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host.h b/content/browser/renderer_host/media/media_stream_dispatcher_host.h index 088154b..65343a3 100644 --- a/content/browser/renderer_host/media/media_stream_dispatcher_host.h +++ b/content/browser/renderer_host/media/media_stream_dispatcher_host.h
@@ -17,6 +17,10 @@ #include "content/public/browser/browser_message_filter.h" #include "content/public/browser/resource_context.h" +namespace url { +class Origin; +} + namespace content { class MediaStreamManager; @@ -69,7 +73,7 @@ void OnGenerateStream(int render_frame_id, int page_request_id, const StreamControls& controls, - const GURL& security_origin, + const url::Origin& security_origin, bool user_gesture); void OnCancelGenerateStream(int render_frame_id, int page_request_id); @@ -79,7 +83,7 @@ void OnEnumerateDevices(int render_frame_id, int page_request_id, MediaStreamType type, - const GURL& security_origin); + const url::Origin& security_origin); void OnCancelEnumerateDevices(int render_frame_id, int page_request_id); @@ -88,7 +92,7 @@ int page_request_id, const std::string& device_id, MediaStreamType type, - const GURL& security_origin); + const url::Origin& security_origin); void OnCloseDevice(int render_frame_id, const std::string& label); @@ -97,8 +101,6 @@ int page_request_id, const std::string& label); - bool IsURLAllowed(const GURL& url); - int render_process_id_; ResourceContext::SaltCallback salt_callback_; MediaStreamManager* media_stream_manager_;
diff --git a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc index 5560d0e..8e435a7 100644 --- a/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc +++ b/content/browser/renderer_host/media/media_stream_dispatcher_host_unittest.cc
@@ -38,6 +38,8 @@ #include "net/url_request/url_request_context.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" +#include "url/origin.h" #if defined(OS_CHROMEOS) #include "chromeos/audio/cras_audio_handler.h" @@ -81,7 +83,7 @@ void OnGenerateStream(int render_frame_id, int page_request_id, const StreamControls& controls, - const GURL& security_origin, + const url::Origin& security_origin, const base::Closure& quit_closure) { quit_closures_.push(quit_closure); MediaStreamDispatcherHost::OnGenerateStream( @@ -97,7 +99,7 @@ int page_request_id, const std::string& device_id, MediaStreamType type, - const GURL& security_origin, + const url::Origin& security_origin, const base::Closure& quit_closure) { quit_closures_.push(quit_closure); MediaStreamDispatcherHost::OnOpenDevice( @@ -107,7 +109,7 @@ void OnEnumerateDevices(int render_frame_id, int page_request_id, MediaStreamType type, - const GURL& security_origin, + const url::Origin& security_origin, const base::Closure& quit_closure) { quit_closures_.push(quit_closure); MediaStreamDispatcherHost::OnEnumerateDevices( @@ -178,7 +180,7 @@ task_runner_->PostTask(FROM_HERE, base::ResetAndReturn(&quit_closure)); } - label_= ""; + label_ = ""; } void OnDeviceStoppedInternal(const std::string& label, @@ -227,7 +229,7 @@ MediaStreamDispatcherHostTest() : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), old_browser_client_(NULL), - origin_("https://test.com") { + origin_(GURL("https://test.com")) { audio_manager_.reset( new media::MockAudioManager(base::ThreadTaskRunnerHandle::Get())); // Make sure we use fake devices to avoid long delays. @@ -370,7 +372,7 @@ } bool DoesEveryDeviceMapToRawId(const StreamDeviceInfoArray& devices, - const GURL& origin) { + const url::Origin& origin) { for (size_t i = 0; i < devices.size(); ++i) { bool found_match = false; media::AudioDeviceNames::const_iterator audio_it = @@ -432,7 +434,7 @@ content::TestBrowserContext browser_context_; media::AudioDeviceNames physical_audio_devices_; media::VideoCaptureDevice::Names physical_video_devices_; - GURL origin_; + url::Origin origin_; media::FakeVideoCaptureDeviceFactory* video_capture_device_factory_; };
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc index b0609384..1882b0fa 100644 --- a/content/browser/renderer_host/media/media_stream_manager.cc +++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -30,6 +30,7 @@ #include "base/threading/thread_local.h" #include "build/build_config.h" #include "content/browser/browser_main_loop.h" +#include "content/browser/child_process_security_policy_impl.h" #include "content/browser/renderer_host/media/audio_input_device_manager.h" #include "content/browser/renderer_host/media/audio_output_device_enumerator.h" #include "content/browser/renderer_host/media/media_capture_devices_impl.h" @@ -55,6 +56,7 @@ #include "media/base/media_switches.h" #include "media/capture/video/video_capture_device_factory.h" #include "url/gurl.h" +#include "url/origin.h" #if defined(OS_WIN) #include "base/win/scoped_com_initializer.h" @@ -193,6 +195,10 @@ !BrowserThread::IsMessageLoopValid(BrowserThread::IO); } +GURL ConvertToGURL(const url::Origin& origin) { + return origin.unique() ? GURL() : GURL(origin.Serialize()); +} + } // namespace @@ -208,7 +214,7 @@ int requesting_process_id, int requesting_frame_id, int page_request_id, - const GURL& security_origin, + const url::Origin& security_origin, bool user_gesture, MediaStreamRequestType request_type, const StreamControls& controls, @@ -253,16 +259,11 @@ DCHECK(!ui_request_); target_process_id_ = requesting_process_id; target_frame_id_ = requesting_frame_id; - ui_request_.reset(new MediaStreamRequest(requesting_process_id, - requesting_frame_id, - page_request_id, - security_origin, - user_gesture, - request_type, - requested_audio_device_id, - requested_video_device_id, - audio_type_, - video_type_)); + ui_request_.reset(new MediaStreamRequest( + requesting_process_id, requesting_frame_id, page_request_id, + ConvertToGURL(security_origin), user_gesture, request_type, + requested_audio_device_id, requested_video_device_id, audio_type_, + video_type_)); } // Creates a tab capture specific MediaStreamRequest object that is used by @@ -272,16 +273,10 @@ DCHECK(!ui_request_); target_process_id_ = target_render_process_id; target_frame_id_ = target_render_frame_id; - ui_request_.reset(new MediaStreamRequest(target_render_process_id, - target_render_frame_id, - page_request_id, - security_origin, - user_gesture, - request_type, - "", - "", - audio_type_, - video_type_)); + ui_request_.reset(new MediaStreamRequest( + target_render_process_id, target_render_frame_id, page_request_id, + ConvertToGURL(security_origin), user_gesture, request_type, "", "", + audio_type_, video_type_)); } bool HasUIRequest() const { return ui_request_.get() != nullptr; } @@ -306,8 +301,8 @@ return; media_observer->OnMediaRequestStateChanged( - target_process_id_, target_frame_id_, page_request_id, security_origin, - stream_type, new_state); + target_process_id_, target_frame_id_, page_request_id, + ConvertToGURL(security_origin), stream_type, new_state); } MediaRequestState state(MediaStreamType stream_type) const { @@ -332,7 +327,7 @@ // An ID the render frame provided to identify this request. const int page_request_id; - const GURL security_origin; + const url::Origin security_origin; const bool user_gesture; @@ -454,7 +449,7 @@ int render_frame_id, int page_request_id, const StreamControls& controls, - const GURL& security_origin, + const url::Origin& security_origin, const MediaRequestResponseCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); @@ -487,7 +482,7 @@ const ResourceContext::SaltCallback& sc, int page_request_id, const StreamControls& controls, - const GURL& security_origin, + const url::Origin& security_origin, bool user_gesture) { DCHECK_CURRENTLY_ON(BrowserThread::IO); DVLOG(1) << "GenerateStream()"; @@ -667,7 +662,7 @@ const ResourceContext::SaltCallback& sc, int page_request_id, MediaStreamType type, - const GURL& security_origin) { + const url::Origin& security_origin) { DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK(requester); DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || @@ -784,7 +779,7 @@ int page_request_id, const std::string& device_id, MediaStreamType type, - const GURL& security_origin) { + const url::Origin& security_origin) { DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || type == MEDIA_DEVICE_VIDEO_CAPTURE); @@ -820,7 +815,7 @@ bool MediaStreamManager::TranslateSourceIdToDeviceId( MediaStreamType stream_type, const ResourceContext::SaltCallback& sc, - const GURL& security_origin, + const url::Origin& security_origin, const std::string& source_id, std::string* device_id) const { DCHECK(stream_type == MEDIA_DEVICE_AUDIO_CAPTURE || @@ -973,7 +968,7 @@ bool MediaStreamManager::PickDeviceId( MediaStreamType type, const ResourceContext::SaltCallback& salt_callback, - const GURL& security_origin, + const url::Origin& security_origin, const TrackControls& controls, std::string* device_id) const { if (!controls.device_ids.empty()) { @@ -1200,14 +1195,6 @@ return; // This can happen if the request has been canceled. } - if (!request->security_origin.is_valid()) { - LOG(ERROR) << "Invalid security origin. " << request->security_origin; - FinalizeRequestFailed(label, - request, - MEDIA_DEVICE_INVALID_SECURITY_ORIGIN); - return; - } - MediaStreamType audio_type = MEDIA_NO_SERVICE; MediaStreamType video_type = MEDIA_NO_SERVICE; ParseStreamType(request->controls, &audio_type, &video_type); @@ -1458,12 +1445,8 @@ (request->audio_type() == MEDIA_NO_SERVICE && request->video_type() == MEDIA_DEVICE_VIDEO_CAPTURE)); - if (request->security_origin.is_valid()) { - for (StreamDeviceInfo& device_info : request->devices) - TranslateDeviceIdToSourceId(request, &device_info.device); - } else { - request->devices.clear(); - } + for (StreamDeviceInfo& device_info : request->devices) + TranslateDeviceIdToSourceId(request, &device_info.device); if (use_fake_ui_) { if (!fake_ui_) @@ -2125,9 +2108,8 @@ // static std::string MediaStreamManager::GetHMACForMediaDeviceID( const ResourceContext::SaltCallback& sc, - const GURL& security_origin, + const url::Origin& security_origin, const std::string& raw_unique_id) { - DCHECK(security_origin.is_valid()); DCHECK(!raw_unique_id.empty()); if (raw_unique_id == media::AudioDeviceDescription::kDefaultDeviceId || raw_unique_id == media::AudioDeviceDescription::kCommunicationsDeviceId) { @@ -2138,7 +2120,7 @@ const size_t digest_length = hmac.DigestLength(); std::vector<uint8_t> digest(digest_length); std::string salt = sc.Run(); - bool result = hmac.Init(security_origin.spec()) && + bool result = hmac.Init(security_origin.Serialize()) && hmac.Sign(raw_unique_id + salt, &digest[0], digest.size()); DCHECK(result); return base::ToLowerASCII(base::HexEncode(&digest[0], digest.size())); @@ -2147,14 +2129,25 @@ // static bool MediaStreamManager::DoesMediaDeviceIDMatchHMAC( const ResourceContext::SaltCallback& sc, - const GURL& security_origin, + const url::Origin& security_origin, const std::string& device_guid, const std::string& raw_unique_id) { - DCHECK(security_origin.is_valid()); DCHECK(!raw_unique_id.empty()); std::string guid_from_raw_device_id = GetHMACForMediaDeviceID(sc, security_origin, raw_unique_id); return guid_from_raw_device_id == device_guid; } +// static +bool MediaStreamManager::IsOriginAllowed(int render_process_id, + const url::Origin& origin) { + if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanRequestURL( + render_process_id, ConvertToGURL(origin))) { + LOG(ERROR) << "MSM: Renderer requested a URL it's not allowed to use."; + return false; + } + + return true; +} + } // namespace content
diff --git a/content/browser/renderer_host/media/media_stream_manager.h b/content/browser/renderer_host/media/media_stream_manager.h index afca478..a1f2272 100644 --- a/content/browser/renderer_host/media/media_stream_manager.h +++ b/content/browser/renderer_host/media/media_stream_manager.h
@@ -51,6 +51,10 @@ class AudioManager; } +namespace url { +class Origin; +} + namespace content { class AudioInputDeviceManager; @@ -105,7 +109,7 @@ int render_frame_id, int page_request_id, const StreamControls& controls, - const GURL& security_origin, + const url::Origin& security_origin, const MediaRequestResponseCallback& callback); // GenerateStream opens new media devices according to |components|. It @@ -118,7 +122,7 @@ const ResourceContext::SaltCallback& sc, int page_request_id, const StreamControls& controls, - const GURL& security_origin, + const url::Origin& security_origin, bool user_gesture); void CancelRequest(int render_process_id, @@ -150,7 +154,7 @@ const ResourceContext::SaltCallback& sc, int page_request_id, MediaStreamType type, - const GURL& security_origin); + const url::Origin& security_origin); // Open a device identified by |device_id|. |type| must be either // MEDIA_DEVICE_AUDIO_CAPTURE or MEDIA_DEVICE_VIDEO_CAPTURE. @@ -162,14 +166,14 @@ int page_request_id, const std::string& device_id, MediaStreamType type, - const GURL& security_origin); + const url::Origin& security_origin); // Finds and returns the device id corresponding to the given // |source_id|. Returns true if there was a raw device id that matched the // given |source_id|, false if nothing matched it. bool TranslateSourceIdToDeviceId(MediaStreamType stream_type, const ResourceContext::SaltCallback& rc, - const GURL& security_origin, + const url::Origin& security_origin, const std::string& source_id, std::string* device_id) const; @@ -236,17 +240,21 @@ // particular security origin. static std::string GetHMACForMediaDeviceID( const ResourceContext::SaltCallback& sc, - const GURL& security_origin, + const url::Origin& security_origin, const std::string& raw_unique_id); // Convenience method to check if |device_guid| is an HMAC of // |raw_device_id| for |security_origin|. static bool DoesMediaDeviceIDMatchHMAC( const ResourceContext::SaltCallback& sc, - const GURL& security_origin, + const url::Origin& security_origin, const std::string& device_guid, const std::string& raw_unique_id); + // Returns true if the renderer process identified with |render_process_id| + // is allowed to access |origin|. + static bool IsOriginAllowed(int render_process_id, const url::Origin& origin); + private: // Contains all data needed to keep track of requests. class DeviceRequest; @@ -387,7 +395,7 @@ // Otherwise, if no valid device is found, device_id is unchanged. bool PickDeviceId(MediaStreamType type, const ResourceContext::SaltCallback& salt_callback, - const GURL& security_origin, + const url::Origin& security_origin, const TrackControls& controls, std::string* device_id) const;
diff --git a/content/browser/renderer_host/media/media_stream_manager_unittest.cc b/content/browser/renderer_host/media/media_stream_manager_unittest.cc index 5d329e41..ecce174 100644 --- a/content/browser/renderer_host/media/media_stream_manager_unittest.cc +++ b/content/browser/renderer_host/media/media_stream_manager_unittest.cc
@@ -27,6 +27,8 @@ #include "media/base/media_switches.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" +#include "url/origin.h" #if defined(USE_ALSA) #include "media/audio/alsa/audio_manager_alsa.h" @@ -236,7 +238,7 @@ const int render_process_id = 1; const int render_frame_id = 1; const int page_request_id = 1; - const GURL security_origin; + const url::Origin security_origin; MediaStreamManager::MediaRequestResponseCallback callback = base::Bind(&MediaStreamManagerTest::ResponseCallback, base::Unretained(this), index); @@ -281,7 +283,7 @@ int render_process_id = 2; int render_frame_id = 2; int page_request_id = 2; - GURL security_origin; + url::Origin security_origin; StreamControls controls(true, true); MediaStreamManager::MediaRequestResponseCallback callback = base::Bind(&MediaStreamManagerTest::ResponseCallback, @@ -310,7 +312,7 @@ } TEST_F(MediaStreamManagerTest, DeviceID) { - GURL security_origin("http://localhost"); + url::Origin security_origin(GURL("http://localhost")); const std::string unique_default_id( media::AudioDeviceDescription::kDefaultDeviceId); const std::string hashed_default_id = @@ -354,7 +356,7 @@ const int render_process_id = 1; const int render_frame_id = 1; const int page_request_id = 1; - const GURL security_origin("http://localhost"); + const url::Origin security_origin(GURL("http://localhost")); EXPECT_CALL(requester, MockDevicesEnumerated(render_frame_id, page_request_id, _, _)); std::string label = media_stream_manager_->EnumerateDevices( @@ -370,7 +372,7 @@ const int render_process_id = 1; const int render_frame_id = 1; const int page_request_id = 1; - const GURL security_origin("http://localhost"); + const url::Origin security_origin(GURL("http://localhost")); // Check that device change notifications are received {
diff --git a/content/browser/renderer_host/media/media_stream_ui_proxy.cc b/content/browser/renderer_host/media/media_stream_ui_proxy.cc index 79ae89de..9997a76 100644 --- a/content/browser/renderer_host/media/media_stream_ui_proxy.cc +++ b/content/browser/renderer_host/media/media_stream_ui_proxy.cc
@@ -14,9 +14,19 @@ #include "content/public/browser/browser_thread.h" #include "content/public/common/content_switches.h" #include "media/capture/video/fake_video_capture_device.h" +#include "url/gurl.h" +#include "url/origin.h" namespace content { +namespace { + +GURL ConvertToGURL(const url::Origin& origin) { + return origin.unique() ? GURL() : GURL(origin.Serialize()); +} + +} // namespace + void SetAndCheckAncestorFlag(MediaStreamRequest* request) { DCHECK_CURRENTLY_ON(BrowserThread::UI); RenderFrameHostImpl* rfh = @@ -193,7 +203,7 @@ } void MediaStreamUIProxy::CheckAccess( - const GURL& security_origin, + const url::Origin& security_origin, MediaStreamType type, int render_process_id, int render_frame_id, @@ -201,17 +211,12 @@ DCHECK_CURRENTLY_ON(BrowserThread::IO); BrowserThread::PostTaskAndReplyWithResult( - BrowserThread::UI, - FROM_HERE, - base::Bind(&Core::CheckAccess, - base::Unretained(core_.get()), - security_origin, - type, - render_process_id, + BrowserThread::UI, FROM_HERE, + base::Bind(&Core::CheckAccess, base::Unretained(core_.get()), + ConvertToGURL(security_origin), type, render_process_id, render_frame_id), base::Bind(&MediaStreamUIProxy::OnCheckedAccess, - weak_factory_.GetWeakPtr(), - callback)); + weak_factory_.GetWeakPtr(), callback)); } void MediaStreamUIProxy::OnStarted(const base::Closure& stop_callback, @@ -350,7 +355,7 @@ } void FakeMediaStreamUIProxy::CheckAccess( - const GURL& security_origin, + const url::Origin& security_origin, MediaStreamType type, int render_process_id, int render_frame_id,
diff --git a/content/browser/renderer_host/media/media_stream_ui_proxy.h b/content/browser/renderer_host/media/media_stream_ui_proxy.h index a89d35b8..2e2e037 100644 --- a/content/browser/renderer_host/media/media_stream_ui_proxy.h +++ b/content/browser/renderer_host/media/media_stream_ui_proxy.h
@@ -13,6 +13,10 @@ #include "content/public/browser/browser_thread.h" #include "content/public/common/media_stream_request.h" +namespace url { +class Origin; +} + namespace content { class RenderFrameHostDelegate; @@ -23,8 +27,8 @@ class CONTENT_EXPORT MediaStreamUIProxy { public: typedef base::Callback< - void (const MediaStreamDevices& devices, - content::MediaStreamRequestResult result)> + void(const MediaStreamDevices& devices, + content::MediaStreamRequestResult result)> ResponseCallback; typedef base::Callback<void(gfx::NativeViewId window_id)> WindowIdCallback; @@ -46,7 +50,7 @@ // this does not query the user, it checks any stored settings such as policy // or extension permissions. |type| must be MEDIA_DEVICE_AUDIO_CAPTURE // or MEDIA_DEVICE_VIDEO_CAPTURE. - virtual void CheckAccess(const GURL& security_origin, + virtual void CheckAccess(const url::Origin& security_origin, MediaStreamType type, int render_process_id, int render_frame_id, @@ -100,7 +104,7 @@ // MediaStreamUIProxy overrides. void RequestAccess(std::unique_ptr<MediaStreamRequest> request, const ResponseCallback& response_callback) override; - void CheckAccess(const GURL& security_origin, + void CheckAccess(const url::Origin& security_origin, MediaStreamType type, int render_process_id, int render_frame_id,
diff --git a/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc b/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc index a3ce770..0491a0c 100644 --- a/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc +++ b/content/browser/renderer_host/media/media_stream_ui_proxy_unittest.cc
@@ -12,6 +12,8 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/geometry/rect.h" +#include "url/gurl.h" +#include "url/origin.h" using testing::_; using testing::Return; @@ -256,15 +258,13 @@ } TEST_F(MediaStreamUIProxyTest, CheckAccess) { - proxy_->CheckAccess(GURL("http://origin/"), - MEDIA_DEVICE_AUDIO_CAPTURE, - 0, - 0, - base::Bind(&MockResponseCallback::OnCheckResponse, - base::Unretained(&response_callback_))); + proxy_->CheckAccess(url::Origin(GURL("http://origin/")), + MEDIA_DEVICE_AUDIO_CAPTURE, 0, 0, + base::Bind(&MockResponseCallback::OnCheckResponse, + base::Unretained(&response_callback_))); EXPECT_CALL(delegate_, CheckMediaAccessPermission(_, _)); EXPECT_CALL(response_callback_, OnCheckResponse(_)); message_loop_.RunUntilIdle(); } -} // content +} // namespace content
diff --git a/content/browser/renderer_host/media/video_capture_host_unittest.cc b/content/browser/renderer_host/media/video_capture_host_unittest.cc index 93c8d583..fb120a2 100644 --- a/content/browser/renderer_host/media/video_capture_host_unittest.cc +++ b/content/browser/renderer_host/media/video_capture_host_unittest.cc
@@ -315,7 +315,7 @@ const int render_process_id = 1; const int render_frame_id = 1; const int page_request_id = 1; - const GURL security_origin("http://test.com"); + const url::Origin security_origin(GURL("http://test.com")); ASSERT_TRUE(opened_device_label_.empty());
diff --git a/content/browser/speech/speech_recognition_manager_impl.cc b/content/browser/speech/speech_recognition_manager_impl.cc index 7cc9137e..f6b9d5e 100644 --- a/content/browser/speech/speech_recognition_manager_impl.cc +++ b/content/browser/speech/speech_recognition_manager_impl.cc
@@ -27,6 +27,8 @@ #include "content/public/common/speech_recognition_result.h" #include "media/audio/audio_device_description.h" #include "media/audio/audio_manager.h" +#include "url/gurl.h" +#include "url/origin.h" #if defined(OS_ANDROID) #include "content/browser/speech/speech_recognizer_impl_android.h" @@ -186,7 +188,7 @@ SpeechRecognitionSessionContext& context = session->context; context.label = media_stream_manager_->MakeMediaAccessRequest( context.render_process_id, context.render_frame_id, context.request_id, - StreamControls(true, false), GURL(context.context_name), + StreamControls(true, false), url::Origin(GURL(context.context_name)), base::Bind( &SpeechRecognitionManagerImpl::MediaRequestPermissionCallback, weak_factory_.GetWeakPtr(), session_id));
diff --git a/content/common/media/media_stream_messages.h b/content/common/media/media_stream_messages.h index 46acb9b..9a745a1 100644 --- a/content/common/media/media_stream_messages.h +++ b/content/common/media/media_stream_messages.h
@@ -11,7 +11,7 @@ #include "content/common/media/media_stream_options.h" #include "ipc/ipc_message_macros.h" #include "ipc/ipc_platform_file.h" -#include "url/gurl.h" +#include "url/origin.h" #undef IPC_MESSAGE_EXPORT #define IPC_MESSAGE_EXPORT CONTENT_EXPORT @@ -102,7 +102,7 @@ int /* render frame id */, int /* request id */, content::StreamControls /* controls */, - GURL /* security origin */, + url::Origin /* security origin */, bool /* user_gesture */) // Request to cancel the request for a new media stream. @@ -121,7 +121,7 @@ int /* render frame id */, int /* request id */, content::MediaStreamType /* type */, - GURL /* security origin */) + url::Origin /* security origin */) // Request to stop enumerating devices. IPC_MESSAGE_CONTROL2(MediaStreamHostMsg_CancelEnumerateDevices, @@ -134,7 +134,7 @@ int /* request id */, std::string /* device_id */, content::MediaStreamType /* type */, - GURL /* security origin */) + url::Origin /* security origin */) // Request to close a device. IPC_MESSAGE_CONTROL2(MediaStreamHostMsg_CloseDevice,
diff --git a/content/public/browser/media_device_id.cc b/content/public/browser/media_device_id.cc index 876e12ac..d99d0f2 100644 --- a/content/public/browser/media_device_id.cc +++ b/content/public/browser/media_device_id.cc
@@ -9,14 +9,14 @@ namespace content { std::string GetHMACForMediaDeviceID(const ResourceContext::SaltCallback& sc, - const GURL& security_origin, + const url::Origin& security_origin, const std::string& raw_unique_id) { return MediaStreamManager::GetHMACForMediaDeviceID(sc, security_origin, raw_unique_id); } bool DoesMediaDeviceIDMatchHMAC(const ResourceContext::SaltCallback& sc, - const GURL& security_origin, + const url::Origin& security_origin, const std::string& device_guid, const std::string& raw_unique_id) { return MediaStreamManager::DoesMediaDeviceIDMatchHMAC( @@ -25,7 +25,7 @@ bool GetMediaDeviceIDForHMAC(MediaStreamType stream_type, const ResourceContext::SaltCallback& rc, - const GURL& security_origin, + const url::Origin& security_origin, const std::string& source_id, std::string* device_id) { content::MediaStreamManager* manager =
diff --git a/content/public/browser/media_device_id.h b/content/public/browser/media_device_id.h index 3a42060..579d995 100644 --- a/content/public/browser/media_device_id.h +++ b/content/public/browser/media_device_id.h
@@ -15,7 +15,7 @@ #include "content/common/content_export.h" #include "content/public/browser/resource_context.h" #include "content/public/common/media_stream_request.h" -#include "url/gurl.h" +#include "url/origin.h" namespace content { @@ -23,21 +23,21 @@ // particular security origin. CONTENT_EXPORT std::string GetHMACForMediaDeviceID( const ResourceContext::SaltCallback& sc, - const GURL& security_origin, + const url::Origin& security_origin, const std::string& raw_unique_id); // Convenience method to check if |device_guid| is an HMAC of // |raw_device_id| for |security_origin|. CONTENT_EXPORT bool DoesMediaDeviceIDMatchHMAC( const ResourceContext::SaltCallback& sc, - const GURL& security_origin, + const url::Origin& security_origin, const std::string& device_guid, const std::string& raw_unique_id); CONTENT_EXPORT bool GetMediaDeviceIDForHMAC( MediaStreamType stream_type, const ResourceContext::SaltCallback& rc, - const GURL& security_origin, + const url::Origin& security_origin, const std::string& source_id, std::string* device_id);
diff --git a/content/renderer/media/media_stream_dispatcher.cc b/content/renderer/media/media_stream_dispatcher.cc index 65551805..786196f 100644 --- a/content/renderer/media/media_stream_dispatcher.cc +++ b/content/renderer/media/media_stream_dispatcher.cc
@@ -12,7 +12,7 @@ #include "content/renderer/render_thread_impl.h" #include "media/base/audio_parameters.h" #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" -#include "url/gurl.h" +#include "url/origin.h" namespace content { @@ -74,7 +74,7 @@ int request_id, const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, const StreamControls& controls, - const GURL& security_origin) { + const url::Origin& security_origin) { DCHECK(thread_checker_.CalledOnValidThread()); DVLOG(1) << "MediaStreamDispatcher::GenerateStream(" << request_id << ")"; @@ -135,7 +135,7 @@ int request_id, const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, MediaStreamType type, - const GURL& security_origin) { + const url::Origin& security_origin) { DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || type == MEDIA_DEVICE_VIDEO_CAPTURE || @@ -177,7 +177,7 @@ const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, const std::string& device_id, MediaStreamType type, - const GURL& security_origin) { + const url::Origin& security_origin) { DCHECK(thread_checker_.CalledOnValidThread()); DVLOG(1) << "MediaStreamDispatcher::OpenDevice(" << request_id << ")";
diff --git a/content/renderer/media/media_stream_dispatcher.h b/content/renderer/media/media_stream_dispatcher.h index 6c0220e2..a41850d 100644 --- a/content/renderer/media/media_stream_dispatcher.h +++ b/content/renderer/media/media_stream_dispatcher.h
@@ -19,6 +19,10 @@ #include "content/public/renderer/render_frame_observer.h" #include "content/renderer/media/media_stream_dispatcher_eventhandler.h" +namespace url { +class Origin; +} + namespace content { // MediaStreamDispatcher is a delegate for the Media Stream API messages. @@ -40,7 +44,7 @@ int request_id, const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, const StreamControls& controls, - const GURL& security_origin); + const url::Origin& security_origin); // Cancel the request for a new media stream to be created. virtual void CancelGenerateStream( @@ -55,7 +59,7 @@ int request_id, const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, MediaStreamType type, - const GURL& security_origin); + const url::Origin& security_origin); // Request to stop enumerating devices. void StopEnumerateDevices( @@ -68,7 +72,7 @@ const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, const std::string& device_id, MediaStreamType type, - const GURL& security_origin); + const url::Origin& security_origin); // Cancel the request to open a device. virtual void CancelOpenDevice(
diff --git a/content/renderer/media/media_stream_dispatcher_unittest.cc b/content/renderer/media/media_stream_dispatcher_unittest.cc index 5ed18dfd..21b5816 100644 --- a/content/renderer/media/media_stream_dispatcher_unittest.cc +++ b/content/renderer/media/media_stream_dispatcher_unittest.cc
@@ -18,6 +18,7 @@ #include "media/base/audio_parameters.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/gurl.h" +#include "url/origin.h" namespace content { namespace { @@ -116,7 +117,7 @@ MediaStreamDispatcherTest() : dispatcher_(new MediaStreamDispatcherUnderTest()), handler_(new MockMediaStreamDispatcherEventHandler), - security_origin_("http://test.com") {} + security_origin_(url::Origin(GURL("http://test.com"))) {} // Generates a request for a MediaStream and returns the request id that is // used in IPC. Use this returned id in CompleteGenerateStream to identify @@ -175,7 +176,7 @@ base::MessageLoop message_loop_; std::unique_ptr<MediaStreamDispatcherUnderTest> dispatcher_; std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler_; - GURL security_origin_; + url::Origin security_origin_; }; } // namespace @@ -219,7 +220,7 @@ new MockMediaStreamDispatcherEventHandler); std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler2( new MockMediaStreamDispatcherEventHandler); - GURL security_origin; + url::Origin security_origin; int ipc_request_id1 = dispatcher->next_ipc_id_; dispatcher->EnumerateDevices( @@ -308,7 +309,7 @@ std::unique_ptr<MockMediaStreamDispatcherEventHandler> handler( new MockMediaStreamDispatcherEventHandler); StreamControls components(true, true); - GURL security_origin; + url::Origin security_origin; // Test failure when creating a stream. int ipc_request_id1 = dispatcher->next_ipc_id_; @@ -359,9 +360,9 @@ int ipc_request_id1 = dispatcher->next_ipc_id_; dispatcher->GenerateStream(kRequestId1, handler.get()->AsWeakPtr(), - components, GURL()); + components, url::Origin()); dispatcher->GenerateStream(kRequestId2, handler.get()->AsWeakPtr(), - components, GURL()); + components, url::Origin()); EXPECT_EQ(2u, dispatcher->requests_.size()); dispatcher->CancelGenerateStream(kRequestId2, handler.get()->AsWeakPtr());
diff --git a/content/renderer/media/mock_media_stream_dispatcher.cc b/content/renderer/media/mock_media_stream_dispatcher.cc index 739f689..b173192e 100644 --- a/content/renderer/media/mock_media_stream_dispatcher.cc +++ b/content/renderer/media/mock_media_stream_dispatcher.cc
@@ -31,7 +31,7 @@ int request_id, const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, const StreamControls& controls, - const GURL& url) { + const url::Origin& url) { // Audio and video share the same request so we use |audio_input_request_id_| // only. audio_input_request_id_ = request_id; @@ -59,7 +59,7 @@ int request_id, const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, MediaStreamType type, - const GURL& security_origin) { + const url::Origin& security_origin) { if (type == MEDIA_DEVICE_AUDIO_CAPTURE) { audio_input_request_id_ = request_id; audio_input_array_.clear();
diff --git a/content/renderer/media/mock_media_stream_dispatcher.h b/content/renderer/media/mock_media_stream_dispatcher.h index 6c270cea..b02480b 100644 --- a/content/renderer/media/mock_media_stream_dispatcher.h +++ b/content/renderer/media/mock_media_stream_dispatcher.h
@@ -9,7 +9,7 @@ #include "base/macros.h" #include "content/renderer/media/media_stream_dispatcher.h" -#include "url/gurl.h" +#include "url/origin.h" namespace content { @@ -23,7 +23,7 @@ int request_id, const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, const StreamControls& controls, - const GURL& url) override; + const url::Origin& url) override; void CancelGenerateStream( int request_id, const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler) @@ -32,7 +32,7 @@ int request_id, const base::WeakPtr<MediaStreamDispatcherEventHandler>& event_handler, MediaStreamType type, - const GURL& security_origin) override; + const url::Origin& security_origin) override; void StopStreamDevice(const StreamDeviceInfo& device_info) override; bool IsStream(const std::string& label) override; int video_session_id(const std::string& label, int index) override;
diff --git a/content/renderer/media/user_media_client_impl.cc b/content/renderer/media/user_media_client_impl.cc index a19028a..c8f32b1 100644 --- a/content/renderer/media/user_media_client_impl.cc +++ b/content/renderer/media/user_media_client_impl.cc
@@ -205,7 +205,7 @@ int request_id = g_next_request_id++; StreamControls controls; - GURL security_origin; + url::Origin security_origin; bool enable_automatic_output_device_selection = false; // |user_media_request| can't be mocked. So in order to test at all we check @@ -229,8 +229,7 @@ controls.video.requested = true; } CopyBlinkRequestToStreamControls(user_media_request, &controls); - security_origin = blink::WebStringToGURL( - user_media_request.getSecurityOrigin().toString()); + security_origin = user_media_request.getSecurityOrigin(); // ownerDocument may be null if we are in a test. // In that case, it's OK to not check frame(). DCHECK(user_media_request.ownerDocument().isNull() || @@ -244,7 +243,7 @@ << " select associated sink: " << enable_automatic_output_device_selection << ", video=" << (controls.video.requested) << " ], " - << security_origin.spec() << ")"; + << security_origin << ")"; std::string audio_device_id; if (!user_media_request.isNull() && user_media_request.audio()) { @@ -299,16 +298,13 @@ // |media_devices_request| can't be mocked, so in tests it will be empty (the // underlying pointer is null). In order to use this function in a test we // need to check if it isNull. - GURL security_origin; - if (!media_devices_request.isNull()) { - security_origin = blink::WebStringToGURL( - media_devices_request.getSecurityOrigin().toString()); - } + url::Origin security_origin; + if (!media_devices_request.isNull()) + security_origin = media_devices_request.getSecurityOrigin(); DVLOG(1) << "UserMediaClientImpl::requestMediaDevices(" - << audio_input_request_id - << ", " << video_input_request_id << ", " << audio_output_request_id - << ", " << security_origin.spec() << ")"; + << audio_input_request_id << ", " << video_input_request_id << ", " + << audio_output_request_id << ", " << security_origin << ")"; media_devices_requests_.push_back(new MediaDevicesRequestInfo( media_devices_request, @@ -357,14 +353,12 @@ // |sources_request| can't be mocked, so in tests it will be empty (the // underlying pointer is null). In order to use this function in a test we // need to check if it isNull. - GURL security_origin; + url::Origin security_origin; if (!sources_request.isNull()) - security_origin = GURL(sources_request.origin().utf8()); + security_origin = sources_request.origin(); - DVLOG(1) << "UserMediaClientImpl::requestSources(" - << audio_input_request_id - << ", " << video_input_request_id - << ", " << security_origin.spec() << ")"; + DVLOG(1) << "UserMediaClientImpl::requestSources(" << audio_input_request_id + << ", " << video_input_request_id << ", " << security_origin << ")"; media_devices_requests_.push_back(new MediaDevicesRequestInfo( sources_request,
diff --git a/content/renderer/pepper/pepper_media_device_manager.cc b/content/renderer/pepper/pepper_media_device_manager.cc index e4dd1f6a..0b04f28 100644 --- a/content/renderer/pepper/pepper_media_device_manager.cc +++ b/content/renderer/pepper/pepper_media_device_manager.cc
@@ -57,10 +57,9 @@ #if defined(ENABLE_WEBRTC) GetMediaStreamDispatcher()->EnumerateDevices( - request_id, - AsWeakPtr(), + request_id, AsWeakPtr(), PepperMediaDeviceManager::FromPepperDeviceType(type), - document_url.GetOrigin()); + url::Origin(document_url.GetOrigin())); #else base::MessageLoop::current()->PostTask( FROM_HERE, @@ -106,11 +105,9 @@ #if defined(ENABLE_WEBRTC) GetMediaStreamDispatcher()->OpenDevice( - request_id, - AsWeakPtr(), - device_id, + request_id, AsWeakPtr(), device_id, PepperMediaDeviceManager::FromPepperDeviceType(type), - document_url.GetOrigin()); + url::Origin(document_url.GetOrigin())); #else base::MessageLoop::current()->PostTask( FROM_HERE,
diff --git a/extensions/browser/api/webcam_private/webcam_private_api_chromeos.cc b/extensions/browser/api/webcam_private/webcam_private_api_chromeos.cc index bfdc47a..353517c0 100644 --- a/extensions/browser/api/webcam_private/webcam_private_api_chromeos.cc +++ b/extensions/browser/api/webcam_private/webcam_private_api_chromeos.cc
@@ -13,6 +13,7 @@ #include "extensions/browser/process_manager.h" #include "extensions/browser/process_manager_factory.h" #include "extensions/common/api/webcam_private.h" +#include "url/origin.h" namespace webcam_private = extensions::api::webcam_private; @@ -113,8 +114,8 @@ bool WebcamPrivateAPI::GetDeviceId(const std::string& extension_id, const std::string& webcam_id, std::string* device_id) { - GURL security_origin = - extensions::Extension::GetBaseURLFromExtensionId(extension_id); + url::Origin security_origin( + extensions::Extension::GetBaseURLFromExtensionId(extension_id)); return content::GetMediaDeviceIDForHMAC( content::MEDIA_DEVICE_VIDEO_CAPTURE, @@ -126,8 +127,8 @@ std::string WebcamPrivateAPI::GetWebcamId(const std::string& extension_id, const std::string& device_id) { - GURL security_origin = - extensions::Extension::GetBaseURLFromExtensionId(extension_id); + url::Origin security_origin( + extensions::Extension::GetBaseURLFromExtensionId(extension_id)); return content::GetHMACForMediaDeviceID( browser_context_->GetResourceContext()->GetMediaDeviceIDSalt(),
diff --git a/ios/chrome/ios_chrome.gyp b/ios/chrome/ios_chrome.gyp index 9619d45..0e99826 100644 --- a/ios/chrome/ios_chrome.gyp +++ b/ios/chrome/ios_chrome.gyp
@@ -147,9 +147,9 @@ '$(SDKROOT)/System/Library/Frameworks/CoreGraphics.framework', '$(SDKROOT)/System/Library/Frameworks/CoreLocation.framework', '$(SDKROOT)/System/Library/Frameworks/Foundation.framework', + '$(SDKROOT)/System/Library/Frameworks/Photos.framework', '$(SDKROOT)/System/Library/Frameworks/QuartzCore.framework', '$(SDKROOT)/System/Library/Frameworks/UIKit.framework', - '$(SDKROOT)/System/Library/Frameworks/Photos.framework', ], }, 'sources': [
diff --git a/net/base/ip_address.cc b/net/base/ip_address.cc index 7652b3c..ea64065b 100644 --- a/net/base/ip_address.cc +++ b/net/base/ip_address.cc
@@ -4,8 +4,11 @@ #include "net/base/ip_address.h" +#include <limits.h> + #include "base/strings/string_piece.h" #include "base/strings/string_split.h" +#include "base/strings/stringprintf.h" #include "net/base/ip_address_number.h" #include "net/base/parse_number.h" #include "url/gurl.h" @@ -100,6 +103,32 @@ return true; } +bool ParseIPLiteralToBytes(const base::StringPiece& ip_literal, + std::vector<uint8_t>* bytes) { + // |ip_literal| could be either an IPv4 or an IPv6 literal. If it contains + // a colon however, it must be an IPv6 address. + if (ip_literal.find(':') != base::StringPiece::npos) { + // GURL expects IPv6 hostnames to be surrounded with brackets. + std::string host_brackets = "["; + ip_literal.AppendToString(&host_brackets); + host_brackets.push_back(']'); + url::Component host_comp(0, host_brackets.size()); + + // Try parsing the hostname as an IPv6 literal. + bytes->resize(16); // 128 bits. + return url::IPv6AddressToNumber(host_brackets.data(), host_comp, + bytes->data()); + } + + // Otherwise the string is an IPv4 address. + bytes->resize(4); // 32 bits. + url::Component host_comp(0, ip_literal.size()); + int num_components; + url::CanonHostInfo::Family family = url::IPv4AddressToNumber( + ip_literal.data(), host_comp, bytes->data(), &num_components); + return family == url::CanonHostInfo::IPV4; +} + } // namespace namespace net { @@ -178,13 +207,10 @@ return IsIPv6() && IPAddressStartsWith(*this, kIPv4MappedPrefix); } -std::string IPAddress::ToString() const { - return IPAddressToString(ip_address_); -} - bool IPAddress::AssignFromIPLiteral(const base::StringPiece& ip_literal) { std::vector<uint8_t> number; - if (!ParseIPLiteralToNumber(ip_literal, &number)) + + if (!ParseIPLiteralToBytes(ip_literal, &number)) return false; std::swap(number, ip_address_); @@ -236,12 +262,35 @@ return ip_address_ < that.ip_address_; } +std::string IPAddress::ToString() const { + std::string str; + url::StdStringCanonOutput output(&str); + + if (IsIPv4()) { + url::AppendIPv4Address(ip_address_.data(), &output); + } else if (IsIPv6()) { + url::AppendIPv6Address(ip_address_.data(), &output); + } + + output.Complete(); + return str; +} + std::string IPAddressToStringWithPort(const IPAddress& address, uint16_t port) { - return IPAddressToStringWithPort(address.bytes(), port); + std::string address_str = address.ToString(); + if (address_str.empty()) + return address_str; + + if (address.IsIPv6()) { + // Need to bracket IPv6 addresses since they contain colons. + return base::StringPrintf("[%s]:%d", address_str.c_str(), port); + } + return base::StringPrintf("%s:%d", address_str.c_str(), port); } std::string IPAddressToPackedString(const IPAddress& address) { - return IPAddressToPackedString(address.bytes()); + return std::string(reinterpret_cast<const char*>(address.bytes().data()), + address.size()); } IPAddress ConvertIPv4ToIPv4MappedIPv6(const IPAddress& address) { @@ -333,11 +382,24 @@ } unsigned CommonPrefixLength(const IPAddress& a1, const IPAddress& a2) { - return CommonPrefixLength(a1.bytes(), a2.bytes()); + DCHECK_EQ(a1.size(), a2.size()); + for (size_t i = 0; i < a1.size(); ++i) { + unsigned diff = a1.bytes()[i] ^ a2.bytes()[i]; + if (!diff) + continue; + for (unsigned j = 0; j < CHAR_BIT; ++j) { + if (diff & (1 << (CHAR_BIT - 1))) + return i * CHAR_BIT + j; + diff <<= 1; + } + NOTREACHED(); + } + return a1.size() * CHAR_BIT; } unsigned MaskPrefixLength(const IPAddress& mask) { - return MaskPrefixLength(mask.bytes()); + std::vector<uint8_t> all_ones(mask.size(), 0xFF); + return CommonPrefixLength(mask, IPAddress(all_ones)); } } // namespace net
diff --git a/net/base/ip_address.h b/net/base/ip_address.h index 50bfb2b..5ccddde 100644 --- a/net/base/ip_address.h +++ b/net/base/ip_address.h
@@ -134,10 +134,6 @@ using IPAddressList = std::vector<IPAddress>; -// TODO(Martijnc): These utility functions currently forward the calls to -// the IPAddressNumber implementations. Move the implementations over when -// the IPAddressNumber migration is complete. https://crbug.com/496258. - // Returns the canonical string representation of an IP address along with its // port. For example: "192.168.0.1:99" or "[::1]:80". NET_EXPORT std::string IPAddressToStringWithPort(const IPAddress& address,
diff --git a/net/base/ip_address_number.cc b/net/base/ip_address_number.cc deleted file mode 100644 index 8564888..0000000 --- a/net/base/ip_address_number.cc +++ /dev/null
@@ -1,109 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/base/ip_address_number.h" - -#include <limits.h> - -#include "base/logging.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_piece.h" -#include "base/strings/string_split.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" -#include "url/gurl.h" -#include "url/url_canon_ip.h" - -namespace net { - -std::string IPAddressToString(const uint8_t* address, size_t address_len) { - std::string str; - url::StdStringCanonOutput output(&str); - - if (address_len == kIPv4AddressSize) { - url::AppendIPv4Address(address, &output); - } else if (address_len == kIPv6AddressSize) { - url::AppendIPv6Address(address, &output); - } - - output.Complete(); - return str; -} - -std::string IPAddressToStringWithPort(const uint8_t* address, - size_t address_len, - uint16_t port) { - std::string address_str = IPAddressToString(address, address_len); - if (address_str.empty()) - return address_str; - - if (address_len == kIPv6AddressSize) { - // Need to bracket IPv6 addresses since they contain colons. - return base::StringPrintf("[%s]:%d", address_str.c_str(), port); - } - return base::StringPrintf("%s:%d", address_str.c_str(), port); -} - -std::string IPAddressToString(const IPAddressNumber& addr) { - return IPAddressToString(addr.data(), addr.size()); -} - -std::string IPAddressToStringWithPort(const IPAddressNumber& addr, - uint16_t port) { - return IPAddressToStringWithPort(addr.data(), addr.size(), port); -} - -std::string IPAddressToPackedString(const IPAddressNumber& addr) { - return std::string(reinterpret_cast<const char*>(addr.data()), addr.size()); -} - -bool ParseIPLiteralToNumber(const base::StringPiece& ip_literal, - IPAddressNumber* ip_number) { - // |ip_literal| could be either a IPv4 or an IPv6 literal. If it contains - // a colon however, it must be an IPv6 address. - if (ip_literal.find(':') != base::StringPiece::npos) { - // GURL expects IPv6 hostnames to be surrounded with brackets. - std::string host_brackets = "["; - ip_literal.AppendToString(&host_brackets); - host_brackets.push_back(']'); - url::Component host_comp(0, host_brackets.size()); - - // Try parsing the hostname as an IPv6 literal. - ip_number->resize(16); // 128 bits. - return url::IPv6AddressToNumber(host_brackets.data(), host_comp, - &(*ip_number)[0]); - } - - // Otherwise the string is an IPv4 address. - ip_number->resize(4); // 32 bits. - url::Component host_comp(0, ip_literal.size()); - int num_components; - url::CanonHostInfo::Family family = url::IPv4AddressToNumber( - ip_literal.data(), host_comp, &(*ip_number)[0], &num_components); - return family == url::CanonHostInfo::IPV4; -} - -unsigned CommonPrefixLength(const IPAddressNumber& a1, - const IPAddressNumber& a2) { - DCHECK_EQ(a1.size(), a2.size()); - for (size_t i = 0; i < a1.size(); ++i) { - unsigned diff = a1[i] ^ a2[i]; - if (!diff) - continue; - for (unsigned j = 0; j < CHAR_BIT; ++j) { - if (diff & (1 << (CHAR_BIT - 1))) - return i * CHAR_BIT + j; - diff <<= 1; - } - NOTREACHED(); - } - return a1.size() * CHAR_BIT; -} - -unsigned MaskPrefixLength(const IPAddressNumber& mask) { - IPAddressNumber all_ones(mask.size(), 0xFF); - return CommonPrefixLength(mask, all_ones); -} - -} // namespace net
diff --git a/net/base/ip_address_number.h b/net/base/ip_address_number.h index a0894b6..4f8c249 100644 --- a/net/base/ip_address_number.h +++ b/net/base/ip_address_number.h
@@ -5,15 +5,8 @@ #ifndef NET_BASE_IP_ADDRESS_NUMBER_H_ #define NET_BASE_IP_ADDRESS_NUMBER_H_ -#include <stddef.h> -#include <stdint.h> - -#include <string> #include <vector> -#include "base/strings/string_piece.h" -#include "net/base/net_export.h" - namespace net { // IPAddressNumber is used to represent an IP address's numeric value as an @@ -30,41 +23,6 @@ static const size_t kIPv4AddressSize = 4; static const size_t kIPv6AddressSize = 16; -// Returns the string representation of an IP address. -// For example: "192.168.0.1" or "::1". Returns the empty string when |address| -// is invalid. -NET_EXPORT std::string IPAddressToString(const uint8_t* address, - size_t address_len); - -// Returns the string representation of an IP address along with its port. -// For example: "192.168.0.1:99" or "[::1]:80". Returns the empty string when -// |address| is invalid (the port will be ignored). -NET_EXPORT std::string IPAddressToStringWithPort(const uint8_t* address, - size_t address_len, - uint16_t port); - -// Same as IPAddressToString() but for an IPAddressNumber. -NET_EXPORT std::string IPAddressToString(const IPAddressNumber& addr); - -// Same as IPAddressToStringWithPort() but for an IPAddressNumber. -NET_EXPORT std::string IPAddressToStringWithPort(const IPAddressNumber& addr, - uint16_t port); - -// Returns the address as a sequence of bytes in network-byte-order. -NET_EXPORT std::string IPAddressToPackedString(const IPAddressNumber& addr); - -// Parses an IP address literal (either IPv4 or IPv6) to its numeric value. -// Returns true on success and fills |ip_number| with the numeric value. -NET_EXPORT bool ParseIPLiteralToNumber(const base::StringPiece& ip_literal, - IPAddressNumber* ip_number); - -// Returns number of matching initial bits between the addresses |a1| and |a2|. -unsigned CommonPrefixLength(const IPAddressNumber& a1, - const IPAddressNumber& a2); - -// Computes the number of leading 1-bits in |mask|. -unsigned MaskPrefixLength(const IPAddressNumber& mask); - } // namespace net #endif // NET_BASE_IP_ADDRESS_NUMBER_H_
diff --git a/net/base/ip_address_number_unittest.cc b/net/base/ip_address_number_unittest.cc deleted file mode 100644 index cc68a25..0000000 --- a/net/base/ip_address_number_unittest.cc +++ /dev/null
@@ -1,87 +0,0 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "net/base/ip_address_number.h" - -#include "base/strings/string_number_conversions.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace net { - -namespace { - -// Helper to strignize an IP number (used to define expectations). -std::string DumpIPNumber(const IPAddressNumber& v) { - std::string out; - for (size_t i = 0; i < v.size(); ++i) { - if (i != 0) - out.append(","); - out.append(base::IntToString(static_cast<int>(v[i]))); - } - return out; -} - -TEST(IpAddressNumberTest, IPAddressToString) { - uint8_t addr1[4] = {0, 0, 0, 0}; - EXPECT_EQ("0.0.0.0", IPAddressToString(addr1, sizeof(addr1))); - - uint8_t addr2[4] = {192, 168, 0, 1}; - EXPECT_EQ("192.168.0.1", IPAddressToString(addr2, sizeof(addr2))); - - uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98}; - EXPECT_EQ("fedc:ba98::", IPAddressToString(addr3, sizeof(addr3))); - - // IPAddressToString() shouldn't crash on invalid addresses. - uint8_t addr4[2]; - EXPECT_EQ("", IPAddressToString(addr4, sizeof(addr4))); -} - -TEST(IpAddressNumberTest, IPAddressToStringWithPort) { - uint8_t addr1[4] = {0, 0, 0, 0}; - EXPECT_EQ("0.0.0.0:3", IPAddressToStringWithPort(addr1, sizeof(addr1), 3)); - - uint8_t addr2[4] = {192, 168, 0, 1}; - EXPECT_EQ("192.168.0.1:99", - IPAddressToStringWithPort(addr2, sizeof(addr2), 99)); - - uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98}; - EXPECT_EQ("[fedc:ba98::]:8080", - IPAddressToStringWithPort(addr3, sizeof(addr3), 8080)); - - // IPAddressToStringWithPort() shouldn't crash on invalid addresses. - uint8_t addr4[2]; - EXPECT_EQ("", IPAddressToStringWithPort(addr4, sizeof(addr4), 8080)); -} - -// Test that invalid IP literals fail to parse. -TEST(IpAddressNumberTest, ParseIPLiteralToNumber_FailParse) { - IPAddressNumber number; - - EXPECT_FALSE(ParseIPLiteralToNumber("bad value", &number)); - EXPECT_FALSE(ParseIPLiteralToNumber("bad:value", &number)); - EXPECT_FALSE(ParseIPLiteralToNumber(std::string(), &number)); - EXPECT_FALSE(ParseIPLiteralToNumber("192.168.0.1:30", &number)); - EXPECT_FALSE(ParseIPLiteralToNumber(" 192.168.0.1 ", &number)); - EXPECT_FALSE(ParseIPLiteralToNumber("[::1]", &number)); -} - -// Test parsing an IPv4 literal. -TEST(IpAddressNumberTest, ParseIPLiteralToNumber_IPv4) { - IPAddressNumber number; - EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &number)); - EXPECT_EQ("192,168,0,1", DumpIPNumber(number)); - EXPECT_EQ("192.168.0.1", IPAddressToString(number)); -} - -// Test parsing an IPv6 literal. -TEST(IpAddressNumberTest, ParseIPLiteralToNumber_IPv6) { - IPAddressNumber number; - EXPECT_TRUE(ParseIPLiteralToNumber("1:abcd::3:4:ff", &number)); - EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", DumpIPNumber(number)); - EXPECT_EQ("1:abcd::3:4:ff", IPAddressToString(number)); -} - -} // anonymous namespace - -} // namespace net
diff --git a/net/base/ip_address_unittest.cc b/net/base/ip_address_unittest.cc index c001b70..09ff745 100644 --- a/net/base/ip_address_unittest.cc +++ b/net/base/ip_address_unittest.cc
@@ -308,25 +308,53 @@ } TEST(IPAddressTest, ToString) { - uint8_t addr1[4] = {0, 0, 0, 0}; - IPAddress ip_address1(addr1); - EXPECT_EQ("0.0.0.0", ip_address1.ToString()); + EXPECT_EQ("0.0.0.0", IPAddress::IPv4AllZeros().ToString()); - uint8_t addr2[4] = {192, 168, 0, 1}; - IPAddress ip_address2(addr2); - EXPECT_EQ("192.168.0.1", ip_address2.ToString()); + IPAddress address(192, 168, 0, 1); + EXPECT_EQ("192.168.0.1", address.ToString()); - uint8_t addr3[16] = {0xFE, 0xDC, 0xBA, 0x98}; - IPAddress ip_address3(addr3); - EXPECT_EQ("fedc:ba98::", ip_address3.ToString()); + IPAddress address2(0xFE, 0xDC, 0xBA, 0x98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0); + EXPECT_EQ("fedc:ba98::", address2.ToString()); // ToString() shouldn't crash on invalid addresses. uint8_t addr4[2]; - IPAddress ip_address4(addr4); - EXPECT_EQ("", ip_address4.ToString()); + IPAddress address4(addr4); + EXPECT_EQ("", address4.ToString()); - IPAddress ip_address5; - EXPECT_EQ("", ip_address5.ToString()); + IPAddress address5; + EXPECT_EQ("", address5.ToString()); +} + +TEST(IPAddressTest, IPAddressToStringWithPort) { + EXPECT_EQ("0.0.0.0:3", + IPAddressToStringWithPort(IPAddress::IPv4AllZeros(), 3)); + + IPAddress address1(192, 168, 0, 1); + EXPECT_EQ("192.168.0.1:99", IPAddressToStringWithPort(address1, 99)); + + IPAddress address2(0xFE, 0xDC, 0xBA, 0x98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0); + EXPECT_EQ("[fedc:ba98::]:8080", IPAddressToStringWithPort(address2, 8080)); + + // IPAddressToStringWithPort() shouldn't crash on invalid addresses. + uint8_t addr3[2]; + EXPECT_EQ("", IPAddressToStringWithPort(IPAddress(addr3), 8080)); +} + +TEST(IPAddressTest, IPAddressToPackedString) { + IPAddress ipv4_address; + EXPECT_TRUE(ipv4_address.AssignFromIPLiteral("4.31.198.44")); + std::string expected_ipv4_address("\x04\x1f\xc6\x2c", 4); + EXPECT_EQ(expected_ipv4_address, IPAddressToPackedString(ipv4_address)); + + IPAddress ipv6_address; + EXPECT_TRUE(ipv6_address.AssignFromIPLiteral("2001:0700:0300:1800::000f")); + std::string expected_ipv6_address( + "\x20\x01\x07\x00\x03\x00\x18\x00" + "\x00\x00\x00\x00\x00\x00\x00\x0f", + 16); + EXPECT_EQ(expected_ipv6_address, IPAddressToPackedString(ipv6_address)); } // Test that invalid IP literals fail to parse. @@ -394,39 +422,6 @@ EXPECT_FALSE(ip_address3 < ip_address1); } -TEST(IPAddressTest, IPAddressToStringWithPort) { - IPAddress address1; - EXPECT_TRUE(address1.AssignFromIPLiteral("0.0.0.0")); - EXPECT_EQ("0.0.0.0:3", IPAddressToStringWithPort(address1, 3)); - - IPAddress address2; - EXPECT_TRUE(address2.AssignFromIPLiteral("192.168.0.1")); - EXPECT_EQ("192.168.0.1:99", IPAddressToStringWithPort(address2, 99)); - - IPAddress address3; - EXPECT_TRUE(address3.AssignFromIPLiteral("fedc:ba98::")); - EXPECT_EQ("[fedc:ba98::]:8080", IPAddressToStringWithPort(address3, 8080)); - - // ToString() shouldn't crash on invalid addresses. - IPAddress address4; - EXPECT_EQ("", IPAddressToStringWithPort(address4, 8080)); -} - -TEST(IPAddressTest, IPAddressToPackedString) { - IPAddress ipv4_address; - EXPECT_TRUE(ipv4_address.AssignFromIPLiteral("4.31.198.44")); - std::string expected_ipv4_address("\x04\x1f\xc6\x2c", 4); - EXPECT_EQ(expected_ipv4_address, IPAddressToPackedString(ipv4_address)); - - IPAddress ipv6_address; - EXPECT_TRUE(ipv6_address.AssignFromIPLiteral("2001:0700:0300:1800::000f")); - std::string expected_ipv6_address( - "\x20\x01\x07\x00\x03\x00\x18\x00" - "\x00\x00\x00\x00\x00\x00\x00\x0f", - 16); - EXPECT_EQ(expected_ipv6_address, IPAddressToPackedString(ipv6_address)); -} - // Test mapping an IPv4 address to an IPv6 address. TEST(IPAddressTest, ConvertIPv4ToIPv4MappedIPv6) { IPAddress ipv4_address(192, 168, 0, 1);
diff --git a/net/base/ip_endpoint.cc b/net/base/ip_endpoint.cc index 9b4695b1..150093c0 100644 --- a/net/base/ip_endpoint.cc +++ b/net/base/ip_endpoint.cc
@@ -164,7 +164,7 @@ } std::string IPEndPoint::ToString() const { - return IPAddressToStringWithPort(address_.bytes(), port_); + return IPAddressToStringWithPort(address_, port_); } std::string IPEndPoint::ToStringWithoutPort() const {
diff --git a/net/net.gypi b/net/net.gypi index 657582f7..b3868c1 100644 --- a/net/net.gypi +++ b/net/net.gypi
@@ -30,7 +30,6 @@ 'base/io_buffer.h', 'base/ip_address.cc', 'base/ip_address.h', - 'base/ip_address_number.cc', 'base/ip_address_number.h', 'base/ip_endpoint.cc', 'base/ip_endpoint.h', @@ -1318,7 +1317,6 @@ 'base/host_mapping_rules_unittest.cc', 'base/host_port_pair_unittest.cc', 'base/int128_unittest.cc', - 'base/ip_address_number_unittest.cc', 'base/ip_address_unittest.cc', 'base/ip_endpoint_unittest.cc', 'base/ip_pattern_unittest.cc',
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-object-preview-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-object-preview-expected.txt index d4e510d..c39ef5c679 100644 --- a/third_party/WebKit/LayoutTests/inspector/console/console-object-preview-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/console/console-object-preview-expected.txt
@@ -36,22 +36,22 @@ console-object-preview.html:20 [0, 0, 1] console-message-text source-code > console-message-url webkit-html-resource-link > object-value-array source-code > console-object-preview > object-value-number > object-value-number > object-value-number console-object-preview.html:20 [0, 0, 2] console-message-text source-code > console-message-url webkit-html-resource-link > object-value-array source-code > console-object-preview > object-value-number > object-value-number > object-value-number console-object-preview.html:23 Object with many properties console-message-text source-code > console-message-url webkit-html-resource-link -console-object-preview.html:28 Object {property_0: 0, property_1: 1, property_2: 2, property_3: 3, property_4: 4…} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > object-info-state-note > children +console-object-preview.html:28 Object {property_0: 0, property_1: 1, property_2: 2, property_3: 3, property_4: 4…} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > object-state-note info-note > children console-object-preview.html:30 Array with many properties console-message-text source-code > console-message-url webkit-html-resource-link -console-object-preview.html:35 [0, 1, property_0: 0, property_1: 1, property_2: 2, property_3: 3, property_4: 4…] console-message-text source-code > console-message-url webkit-html-resource-link > object-value-array source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > object-value-number > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > object-info-state-note > children +console-object-preview.html:35 [0, 1, property_0: 0, property_1: 1, property_2: 2, property_3: 3, property_4: 4…] console-message-text source-code > console-message-url webkit-html-resource-link > object-value-array source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > object-value-number > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > object-state-note info-note > children console-object-preview.html:37 Object with proto console-message-text source-code > console-message-url webkit-html-resource-link -console-object-preview.html:40 Object {d: 1} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-number > object-info-state-note > children +console-object-preview.html:40 Object {d: 1} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-number > object-state-note info-note > children console-object-preview.html:42 Sparse array console-message-text source-code > console-message-url webkit-html-resource-link console-object-preview.html:45 [50: 50] console-message-text source-code > console-message-url webkit-html-resource-link > object-value-array source-code > console-object-preview > name > object-value-number console-object-preview.html:47 Dense array with indexes and propeties console-message-text source-code > console-message-url webkit-html-resource-link -console-object-preview.html:53 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99…] console-message-text source-code > console-message-url webkit-html-resource-link > object-value-array source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-info-state-note > children +console-object-preview.html:53 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99…] console-message-text source-code > console-message-url webkit-html-resource-link > object-value-array source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-value-number > object-state-note info-note > children console-object-preview.html:55 Object with properties containing whitespaces console-message-text source-code > console-message-url webkit-html-resource-link console-object-preview.html:62 Object {" a b ": " a b ", c d: "c d", "": "", " ": " ", "a↵↵b↵c": "a↵↵b↵c"} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-object-preview > name > object-value-string > name > object-value-string > name > object-value-string > name > object-value-string > name > object-value-string console-object-preview.html:64 Object with a document.all property console-message-text source-code > console-message-url webkit-html-resource-link -console-object-preview.html:65 Object {all: HTMLAllCollection[7]} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-array > object-info-state-note > children +console-object-preview.html:65 Object {all: HTMLAllCollection[7]} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-array > object-state-note info-note > children console-object-preview.html:67 Object with special numbers console-message-text source-code > console-message-url webkit-html-resource-link console-object-preview.html:69 Object {nan: NaN, posInf: Infinity, negInf: -Infinity, negZero: -0} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-object-preview > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number console-object-preview.html:71 Object with exactly 5 properties: expected to be lossless console-message-text source-code > console-message-url webkit-html-resource-link console-object-preview.html:72 Object {a: 1, b: 2, c: 3, d: 4, e: 5} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-object-preview > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number > name > object-value-number -console-object-preview.html:74 Object {null: null, undef: undefined, regexp: /^[regexp]$/g, bool: false} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-null > name > object-value-undefined > name > object-value-regexp > name > object-value-boolean > object-info-state-note > children +console-object-preview.html:74 Object {null: null, undef: undefined, regexp: /^[regexp]$/g, bool: false} console-message-text source-code > console-message-url webkit-html-resource-link > object-value-object source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > console-object-preview > name > object-value-null > name > object-value-undefined > name > object-value-regexp > name > object-value-boolean > object-state-note info-note > children
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-proxy-expected.txt b/third_party/WebKit/LayoutTests/inspector/console/console-proxy-expected.txt new file mode 100644 index 0000000..b306800 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/console/console-proxy-expected.txt
@@ -0,0 +1,12 @@ +CONSOLE MESSAGE: line 20: [object Proxy] +Tests that console logging dumps proxy properly. + +warning-note display: inline-block +info-note display: none +console-proxy.html:20 Proxy console-message-text source-code > console-message-url webkit-html-resource-link > object-value-proxy source-code > console-view-object-properties-section > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element > selection fill > object-state-note warning-note > object-state-note info-note > children +window.accessedGet = false +warning-note display: none +info-note display: inline-block +console-proxy.html:20 Proxy__proto__: Object console-message-text source-code > console-message-url webkit-html-resource-link > object-value-proxy source-code > console-view-object-properties-section expanded > tree-outline-disclosure tree-outline-disclosure-hide-overflow > tree-outline source-code object-properties-section > parent object-properties-section-root-element expanded > selection fill > object-state-note warning-note > object-state-note info-note > children expanded > parent > selection fill > name object-properties-section-dimmed > object-properties-section-separator > value object-value-object > children +window.accessedGet = true +
diff --git a/third_party/WebKit/LayoutTests/inspector/console/console-proxy.html b/third_party/WebKit/LayoutTests/inspector/console/console-proxy.html new file mode 100644 index 0000000..f72667a3 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/console/console-proxy.html
@@ -0,0 +1,78 @@ +<html> +<head> +<script src="../../http/tests/inspector/inspector-test.js"></script> +<script src="../../http/tests/inspector/console-test.js"></script> +<script> + +window.accessedGet = false; +function testFunction() +{ + let proxied = new Proxy({}, { + get: function (target, name, receiver) { + window.accessedGet = true; + return target[name]; + }, + set: function(target, name, value, receiver) { + target[name] = value; + return value; + } + }); + console.log(proxied); +} + +function test() +{ + InspectorTest.waitUntilMessageReceived(dumpMessages); + InspectorTest.evaluateInPage("testFunction()"); + + function dumpMessages() + { + var consoleView = WebInspector.ConsoleView.instance(); + consoleView._viewport.invalidate() + var element = consoleView._visibleViewMessages[0].contentElement(); + dumpNoteVisible(element, "warning-note"); + dumpNoteVisible(element, "info-note"); + + InspectorTest.dumpConsoleMessages(false, true); + InspectorTest.evaluateInPage("window.accessedGet", dumpAccessedGetAndExpand); + } + + function dumpAccessedGetAndExpand(result) + { + InspectorTest.addResult("window.accessedGet = " + result.value); + InspectorTest.expandConsoleMessages(dumpExpandedConsoleMessages); + } + + function dumpExpandedConsoleMessages() + { + var element = WebInspector.ConsoleView.instance()._visibleViewMessages[0].contentElement(); + dumpNoteVisible(element, "warning-note"); + dumpNoteVisible(element, "info-note"); + + InspectorTest.dumpConsoleMessages(false, true); + InspectorTest.evaluateInPage("window.accessedGet", dumpAccessedGetAndCompleteTest); + } + + function dumpAccessedGetAndCompleteTest(result) + { + InspectorTest.addResult("window.accessedGet = " + result.value); + InspectorTest.completeTest(); + } + + function dumpNoteVisible(element, name) + { + var note = window.getComputedStyle(element.querySelector('.object-state-note.' + name)).display; + InspectorTest.addResult(name + " display: " + note); + } +} + +</script> +</head> + +<body onload="runTest()"> +<p> +Tests that console logging dumps proxy properly. +</p> + +</body> +</html>
diff --git a/third_party/WebKit/Source/core/inspector/ScriptArguments.cpp b/third_party/WebKit/Source/core/inspector/ScriptArguments.cpp index bdf3370..bec35a0 100644 --- a/third_party/WebKit/Source/core/inspector/ScriptArguments.cpp +++ b/third_party/WebKit/Source/core/inspector/ScriptArguments.cpp
@@ -95,6 +95,10 @@ m_builder.append("[object Window]"); return true; } + if (value->IsProxy()) { + m_builder.append("[object Proxy]"); + return true; + } if (value->IsObject() && !value->IsDate() && !value->IsFunction()
diff --git a/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js b/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js index 052c0727..a5ee48b 100644 --- a/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js +++ b/third_party/WebKit/Source/devtools/front_end/console/ConsoleViewMessage.js
@@ -56,6 +56,7 @@ "map": this._formatParameterAsObject, "node": this._formatParameterAsNode, "object": this._formatParameterAsObject, + "proxy": this._formatParameterAsObject, "set": this._formatParameterAsObject, "string": this._formatParameterAsString }; @@ -424,7 +425,13 @@ titleElement.createTextChild(obj.description || ""); } } - var note = titleElement.createChild("span", "object-info-state-note"); + if (obj.subtype === "proxy") { + var warning = titleElement.createChild("span", "object-state-note"); + warning.classList.add("warning-note"); + warning.title = WebInspector.UIString("Expansion of the Proxy object can lead to JavaScript execution."); + } + var note = titleElement.createChild("span", "object-state-note"); + note.classList.add("info-note"); note.title = WebInspector.UIString("Object value at left was snapshotted when logged, value below was evaluated just now."); var section = new WebInspector.ObjectPropertiesSection(obj, titleElement); section.enableContextMenu();
diff --git a/third_party/WebKit/Source/devtools/front_end/console/consoleView.css b/third_party/WebKit/Source/devtools/front_end/console/consoleView.css index 773921b..b37f0a6 100644 --- a/third_party/WebKit/Source/devtools/front_end/console/consoleView.css +++ b/third_party/WebKit/Source/devtools/front_end/console/consoleView.css
@@ -425,11 +425,10 @@ white-space: nowrap !important; } -.object-info-state-note { +.object-state-note { display: inline-block; width: 11px; height: 11px; - background-color: rgb(179, 203, 247); color: white; text-align: center; border-radius: 3px; @@ -438,14 +437,30 @@ font-size: 9px; } -.-theme-with-dark-background .object-info-state-note { +.-theme-with-dark-background .object-state-note { background-color: hsl(230, 100%, 80%); } -.object-info-state-note::before { +.info-note { + background-color: rgb(179, 203, 247); +} + +.info-note::before { content: "i"; } -.console-view-object-properties-section:not(.expanded) .object-info-state-note { +.warning-note { + background-color: rgb(255, 161, 45); +} + +.warning-note::before { + content: "!"; +} + +.console-view-object-properties-section:not(.expanded) .info-note { + display: none; +} + +.console-view-object-properties-section.expanded .warning-note { display: none; }
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp index 5ac92a7..7cbafd9 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.cpp
@@ -51,9 +51,9 @@ { } -String MediaStreamTrackSourcesRequestImpl::origin() +PassRefPtr<SecurityOrigin> MediaStreamTrackSourcesRequestImpl::origin() { - return m_executionContext->getSecurityOrigin()->toString(); + return m_executionContext->getSecurityOrigin()->isolatedCopy(); } void MediaStreamTrackSourcesRequestImpl::requestSucceeded(const WebVector<WebSourceInfo>& webSourceInfos)
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.h b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.h index 80651ff..475bd09 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.h +++ b/third_party/WebKit/Source/modules/mediastream/MediaStreamTrackSourcesRequestImpl.h
@@ -33,6 +33,7 @@ class ExecutionContext; class MediaStreamTrackSourcesCallback; +class SecurityOrigin; class WebSourceInfo; template<typename T> class WebVector; @@ -41,7 +42,7 @@ static MediaStreamTrackSourcesRequestImpl* create(ExecutionContext&, MediaStreamTrackSourcesCallback*); ~MediaStreamTrackSourcesRequestImpl(); - String origin() override; + PassRefPtr<SecurityOrigin> origin() override; void requestSucceeded(const WebVector<WebSourceInfo>&) override; DECLARE_VIRTUAL_TRACE();
diff --git a/third_party/WebKit/Source/platform/exported/WebMediaStreamTrackSourcesRequest.cpp b/third_party/WebKit/Source/platform/exported/WebMediaStreamTrackSourcesRequest.cpp index 1b4ecdb0..8e9b69b 100644 --- a/third_party/WebKit/Source/platform/exported/WebMediaStreamTrackSourcesRequest.cpp +++ b/third_party/WebKit/Source/platform/exported/WebMediaStreamTrackSourcesRequest.cpp
@@ -26,6 +26,7 @@ #include "public/platform/WebMediaStreamTrackSourcesRequest.h" #include "platform/mediastream/MediaStreamTrackSourcesRequest.h" +#include "platform/weborigin/SecurityOrigin.h" #include "public/platform/WebSourceInfo.h" #include "wtf/PassOwnPtr.h" #include "wtf/text/WTFString.h" @@ -47,7 +48,7 @@ m_private.reset(); } -WebString WebMediaStreamTrackSourcesRequest::origin() const +WebSecurityOrigin WebMediaStreamTrackSourcesRequest::origin() const { ASSERT(m_private.get()); return m_private->origin();
diff --git a/third_party/WebKit/Source/platform/mediastream/MediaStreamTrackSourcesRequest.h b/third_party/WebKit/Source/platform/mediastream/MediaStreamTrackSourcesRequest.h index 1b6c7ea..34591ab 100644 --- a/third_party/WebKit/Source/platform/mediastream/MediaStreamTrackSourcesRequest.h +++ b/third_party/WebKit/Source/platform/mediastream/MediaStreamTrackSourcesRequest.h
@@ -32,13 +32,14 @@ namespace blink { +class SecurityOrigin; class WebSourceInfo; class MediaStreamTrackSourcesRequest : public GarbageCollectedFinalized<MediaStreamTrackSourcesRequest> { public: virtual ~MediaStreamTrackSourcesRequest() { } - virtual String origin() = 0; + virtual PassRefPtr<SecurityOrigin> origin() = 0; virtual void requestSucceeded(const WebVector<WebSourceInfo>&) = 0; DEFINE_INLINE_VIRTUAL_TRACE() { }
diff --git a/third_party/WebKit/Source/platform/network/NetworkUtilsTest.cpp b/third_party/WebKit/Source/platform/network/NetworkUtilsTest.cpp index 5562cfe..d5d84f93 100644 --- a/third_party/WebKit/Source/platform/network/NetworkUtilsTest.cpp +++ b/third_party/WebKit/Source/platform/network/NetworkUtilsTest.cpp
@@ -4,7 +4,7 @@ #include "platform/network/NetworkUtils.h" -#include "net/base/ip_address_number.h" +#include "net/base/ip_address.h" #include "testing/gtest/include/gtest/gtest.h" #include "wtf/text/WTFString.h" @@ -46,10 +46,9 @@ EXPECT_FALSE(NetworkUtils::isReservedIPAddress("127.0.0.1.example.com")); // Moar IPv4 - uint8_t address[4] = { 0, 0, 0, 1 }; for (int i = 0; i < 256; i++) { - address[0] = i; - std::string addressString = net::IPAddressToString(address, sizeof(address)); + net::IPAddress address(i, 0, 0, 1); + std::string addressString = address.ToString(); if (i == 0 || i == 10 || i == 127 || i > 223) { EXPECT_TRUE(NetworkUtils::isReservedIPAddress( String::fromUTF8(addressString.data(),
diff --git a/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js b/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js index 1a9ae17f..9c7d693 100644 --- a/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js +++ b/third_party/WebKit/Source/platform/v8_inspector/InjectedScriptSource.js
@@ -726,6 +726,9 @@ return description; } + if (subtype === "proxy") + return "Proxy"; + var className = InjectedScriptHost.internalConstructorName(obj); if (subtype === "array") { if (typeof obj.length === "number") @@ -833,7 +836,7 @@ this.className = className; this.description = injectedScript._describe(object); - if (generatePreview && this.type === "object" && this.subtype !== "node") + if (generatePreview && this.type === "object" && this.subtype !== "node" && this.subtype !== "proxy") this.preview = this._generatePreview(object, undefined, columnNames, isTable, skipEntriesPreview); if (injectedScript._customObjectFormatterEnabled) {
diff --git a/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp b/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp index 24d416d..040d28e 100644 --- a/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp +++ b/third_party/WebKit/Source/platform/v8_inspector/V8InjectedScriptHost.cpp
@@ -116,11 +116,14 @@ info.GetReturnValue().Set(toV8StringInternalized(isolate, "generator")); return; } - if (value->IsNativeError()) { info.GetReturnValue().Set(toV8StringInternalized(isolate, "error")); return; } + if (value->IsProxy()) { + info.GetReturnValue().Set(toV8StringInternalized(isolate, "proxy")); + return; + } String16 subtype = unwrapDebugger(info)->client()->valueSubtype(value); if (!subtype.isEmpty()) { info.GetReturnValue().Set(toV8String(isolate, subtype));
diff --git a/third_party/WebKit/Source/web/AssociatedURLLoader.cpp b/third_party/WebKit/Source/web/AssociatedURLLoader.cpp index 2c4d3a3ac..b8e12ec 100644 --- a/third_party/WebKit/Source/web/AssociatedURLLoader.cpp +++ b/third_party/WebKit/Source/web/AssociatedURLLoader.cpp
@@ -248,9 +248,12 @@ if (!m_client) return; - m_loader->disposeObserver(); + m_loader->clientAdapterDone(); - m_client->didFinishLoading(m_loader, finishTime, WebURLLoaderClient::kUnknownEncodedDataLength); + auto client = m_client; + m_client = nullptr; + client->didFinishLoading(m_loader, finishTime, WebURLLoaderClient::kUnknownEncodedDataLength); + // |this| may be dead here. } void AssociatedURLLoader::ClientAdapter::didFail(const ResourceError& error) @@ -258,7 +261,7 @@ if (!m_client) return; - m_loader->disposeObserver(); + m_loader->clientAdapterDone(); m_didFail = true; m_error = WebURLError(error); @@ -287,7 +290,10 @@ if (!m_client) return; - m_client->didFail(m_loader, m_error); + auto client = m_client; + m_client = nullptr; + client->didFail(m_loader, m_error); + // |this| may be dead here. } class AssociatedURLLoader::Observer final : public GarbageCollected<Observer>, public ContextLifecycleObserver { @@ -320,7 +326,8 @@ }; AssociatedURLLoader::AssociatedURLLoader(WebLocalFrameImpl* frameImpl, const WebURLLoaderOptions& options) - : m_options(options) + : m_client(nullptr) + , m_options(options) , m_observer(new Observer(this, frameImpl->frame()->document())) { } @@ -349,6 +356,7 @@ void AssociatedURLLoader::loadAsynchronously(const WebURLRequest& request, WebURLLoaderClient* client) { + DCHECK(!m_client); DCHECK(!m_loader); DCHECK(!m_clientAdapter); @@ -367,6 +375,7 @@ } } + m_client = client; m_clientAdapter = ClientAdapter::create(this, client, m_options); if (allowLoad) { @@ -402,7 +411,18 @@ void AssociatedURLLoader::cancel() { disposeObserver(); + cancelLoader(); + m_client = nullptr; +} +void AssociatedURLLoader::clientAdapterDone() +{ + disposeObserver(); + m_client = nullptr; +} + +void AssociatedURLLoader::cancelLoader() +{ if (!m_clientAdapter) return; @@ -429,9 +449,15 @@ void AssociatedURLLoader::documentDestroyed() { - cancel(); + disposeObserver(); + cancelLoader(); - m_client->didFail(this, ResourceError()); + if (!m_client) + return; + + WebURLLoaderClient* client = m_client; + m_client = nullptr; + client->didFail(this, ResourceError()); // |this| may be dead here. }
diff --git a/third_party/WebKit/Source/web/AssociatedURLLoader.h b/third_party/WebKit/Source/web/AssociatedURLLoader.h index 3555962..499cb81 100644 --- a/third_party/WebKit/Source/web/AssociatedURLLoader.h +++ b/third_party/WebKit/Source/web/AssociatedURLLoader.h
@@ -60,12 +60,17 @@ // Called by |m_observer| to handle destruction of the Document associated // with the frame given to the constructor. void documentDestroyed(); - void disposeObserver(); + + // Called by ClientAdapter to handle completion of loading. + void clientAdapterDone(); private: class ClientAdapter; class Observer; + void cancelLoader(); + void disposeObserver(); + WebURLLoaderClient* m_client; WebURLLoaderOptions m_options;
diff --git a/third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h b/third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h index 9eda45b..4351775 100644 --- a/third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h +++ b/third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h
@@ -29,7 +29,7 @@ #include "WebCommon.h" #include "WebNonCopyable.h" #include "WebPrivatePtr.h" -#include "WebString.h" +#include "WebSecurityOrigin.h" #include "WebVector.h" namespace blink { @@ -54,7 +54,7 @@ BLINK_PLATFORM_EXPORT void reset(); bool isNull() const { return m_private.isNull(); } - BLINK_PLATFORM_EXPORT WebString origin() const; + BLINK_PLATFORM_EXPORT WebSecurityOrigin origin() const; BLINK_PLATFORM_EXPORT void requestSucceeded(const WebVector<WebSourceInfo>&) const; #if INSIDE_BLINK