Commit f0503a1f authored by mkwst@chromium.org's avatar mkwst@chromium.org

Wire 'blink::Platform::isHostnameReservedIPAddress()' to 'net::IsReservedIPAddress()'.

This is a fairly straightforward patch which wires up the Blink platform
API over to the network stack.

BUG=378566

Review URL: https://codereview.chromium.org/430193002

Cr-Commit-Position: refs/heads/master@{#288327}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@288327 0039d316-1c4b-4281-b951-d872f2087c98
parent d0d33588
...@@ -42,10 +42,13 @@ ...@@ -42,10 +42,13 @@
#include "net/base/data_url.h" #include "net/base/data_url.h"
#include "net/base/mime_util.h" #include "net/base/mime_util.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
#include "net/base/net_util.h"
#include "third_party/WebKit/public/platform/WebConvertableToTraceFormat.h" #include "third_party/WebKit/public/platform/WebConvertableToTraceFormat.h"
#include "third_party/WebKit/public/platform/WebData.h" #include "third_party/WebKit/public/platform/WebData.h"
#include "third_party/WebKit/public/platform/WebString.h" #include "third_party/WebKit/public/platform/WebString.h"
#include "third_party/WebKit/public/platform/WebURL.h"
#include "third_party/WebKit/public/platform/WebWaitableEvent.h" #include "third_party/WebKit/public/platform/WebWaitableEvent.h"
#include "third_party/WebKit/public/web/WebSecurityOrigin.h"
#include "ui/base/layout.h" #include "ui/base/layout.h"
#if defined(OS_ANDROID) #if defined(OS_ANDROID)
...@@ -151,6 +154,13 @@ class ConvertableToTraceFormatWrapper ...@@ -151,6 +154,13 @@ class ConvertableToTraceFormatWrapper
blink::WebConvertableToTraceFormat convertable_; blink::WebConvertableToTraceFormat convertable_;
}; };
bool isHostnameReservedIPAddress(const std::string& host) {
net::IPAddressNumber address;
if (!net::ParseURLHostnameToNumber(host, &address))
return false;
return net::IsIPAddressReserved(address);
}
} // namespace } // namespace
static int ToMessageID(WebLocalizedString::Name name) { static int ToMessageID(WebLocalizedString::Name name) {
...@@ -439,6 +449,15 @@ WebURLError BlinkPlatformImpl::cancelledError( ...@@ -439,6 +449,15 @@ WebURLError BlinkPlatformImpl::cancelledError(
return WebURLLoaderImpl::CreateError(unreachableURL, false, net::ERR_ABORTED); return WebURLLoaderImpl::CreateError(unreachableURL, false, net::ERR_ABORTED);
} }
bool BlinkPlatformImpl::isReservedIPAddress(
const blink::WebSecurityOrigin& securityOrigin) const {
return isHostnameReservedIPAddress(securityOrigin.host().utf8());
}
bool BlinkPlatformImpl::isReservedIPAddress(const blink::WebURL& url) const {
return isHostnameReservedIPAddress(GURL(url).host());
}
blink::WebThread* BlinkPlatformImpl::createThread(const char* name) { blink::WebThread* BlinkPlatformImpl::createThread(const char* name) {
return new WebThreadImpl(name); return new WebThreadImpl(name);
} }
......
...@@ -81,6 +81,9 @@ class CONTENT_EXPORT BlinkPlatformImpl ...@@ -81,6 +81,9 @@ class CONTENT_EXPORT BlinkPlatformImpl
const blink::WebURL& url, blink::WebString& mimetype, const blink::WebURL& url, blink::WebString& mimetype,
blink::WebString& charset); blink::WebString& charset);
virtual blink::WebURLError cancelledError(const blink::WebURL& url) const; virtual blink::WebURLError cancelledError(const blink::WebURL& url) const;
virtual bool isReservedIPAddress(
const blink::WebSecurityOrigin&) const OVERRIDE;
virtual bool isReservedIPAddress(const blink::WebURL&) const OVERRIDE;
virtual blink::WebThread* createThread(const char* name); virtual blink::WebThread* createThread(const char* name);
virtual blink::WebThread* currentThread(); virtual blink::WebThread* currentThread();
virtual blink::WebWaitableEvent* createWaitableEvent(); virtual blink::WebWaitableEvent* createWaitableEvent();
......
...@@ -5,7 +5,10 @@ ...@@ -5,7 +5,10 @@
#include "base/run_loop.h" #include "base/run_loop.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "content/child/blink_platform_impl.h" #include "content/child/blink_platform_impl.h"
#include "net/base/net_util.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "third_party/WebKit/public/platform/WebString.h"
#include "third_party/WebKit/public/web/WebSecurityOrigin.h"
namespace content { namespace content {
...@@ -64,4 +67,130 @@ TEST(BlinkPlatformTest, SuspendResumeSharedTimer) { ...@@ -64,4 +67,130 @@ TEST(BlinkPlatformTest, SuspendResumeSharedTimer) {
EXPECT_TRUE(base::TimeDelta() == platform_impl.shared_timer_delay()); EXPECT_TRUE(base::TimeDelta() == platform_impl.shared_timer_delay());
} }
TEST(BlinkPlatformTest, IsReservedIPAddress_WebURL) {
TestBlinkPlatformImpl platform_impl;
// Unreserved IPv4 addresses (in various forms).
EXPECT_FALSE(platform_impl.isReservedIPAddress(GURL("http://8.8.8.8/")));
EXPECT_FALSE(platform_impl.isReservedIPAddress(GURL("http://99.64.0.0/")));
EXPECT_FALSE(platform_impl.isReservedIPAddress(GURL("http://212.15.0.0/")));
EXPECT_FALSE(platform_impl.isReservedIPAddress(GURL("http://212.15/")));
EXPECT_FALSE(platform_impl.isReservedIPAddress(GURL("http://212.15.0/")));
EXPECT_FALSE(platform_impl.isReservedIPAddress(GURL("http://3557752832/")));
// Reserved IPv4 addresses (in various forms).
EXPECT_TRUE(platform_impl.isReservedIPAddress(GURL("http://192.168.0.0/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(GURL("http://192.168.0.6/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(GURL("http://10.0.0.5/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(GURL("http://10.0.0/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(GURL("http://10.0/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(GURL("http://3232235526/")));
// Unreserved IPv6 addresses.
EXPECT_FALSE(platform_impl.isReservedIPAddress(
GURL("http://[FFC0:ba98:7654:3210:FEDC:BA98:7654:3210]/")));
EXPECT_FALSE(platform_impl.isReservedIPAddress(
GURL("http://[2000:ba98:7654:2301:EFCD:BA98:7654:3210]/")));
// Reserved IPv6 addresses.
EXPECT_TRUE(platform_impl.isReservedIPAddress(GURL("http://[::1]/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(GURL("http://[::192.9.5.5]/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(GURL("http://[FEED::BEEF]/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(
GURL("http://[FEC0:ba98:7654:3210:FEDC:BA98:7654:3210]/")));
// Not IP addresses at all.
EXPECT_FALSE(platform_impl.isReservedIPAddress(GURL("http://example.com/")));
EXPECT_FALSE(
platform_impl.isReservedIPAddress(GURL("http://127.0.0.1.example.com/")));
// Moar IPv4
uint8 address[4] = {0, 0, 0, 1};
for (int i = 0; i < 256; i++) {
address[0] = i;
std::string addressString =
net::IPAddressToString(address, sizeof(address));
if (i == 0 || i == 10 || i == 127 || i > 223) {
EXPECT_TRUE(
platform_impl.isReservedIPAddress(GURL("http://" + addressString)));
} else {
EXPECT_FALSE(
platform_impl.isReservedIPAddress(GURL("http://" + addressString)));
}
}
}
TEST(BlinkPlatformTest, IsReservedIPAddress_WebSecurityOrigin) {
TestBlinkPlatformImpl platform_impl;
// Unreserved IPv4 addresses (in various forms).
EXPECT_FALSE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://8.8.8.8/")));
EXPECT_FALSE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://99.64.0.0/")));
EXPECT_FALSE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://212.15.0.0/")));
EXPECT_FALSE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://212.15/")));
EXPECT_FALSE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://212.15.0/")));
EXPECT_FALSE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://3557752832/")));
// Reserved IPv4 addresses (in various forms).
EXPECT_TRUE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://192.168.0.0/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://192.168.0.6/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://10.0.0.5/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://10.0.0/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://10.0/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://3232235526/")));
// Unreserved IPv6 addresses.
EXPECT_FALSE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString(
"http://[FFC0:ba98:7654:3210:FEDC:BA98:7654:3210]/")));
EXPECT_FALSE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString(
"http://[2000:ba98:7654:2301:EFCD:BA98:7654:3210]/")));
// Reserved IPv6 addresses.
EXPECT_TRUE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://[::1]/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://[::192.9.5.5]/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://[FEED::BEEF]/")));
EXPECT_TRUE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString(
"http://[FEC0:ba98:7654:3210:FEDC:BA98:7654:3210]/")));
// Not IP addresses at all.
EXPECT_FALSE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString("http://example.com/")));
EXPECT_FALSE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString(
"http://127.0.0.1.example.com/")));
// Moar IPv4
uint8 address[4] = {0, 0, 0, 1};
for (int i = 0; i < 256; i++) {
address[0] = i;
blink::WebString addressString = blink::WebString::fromUTF8(
"http://" + net::IPAddressToString(address, sizeof(address)) + "/");
if (i == 0 || i == 10 || i == 127 || i > 223) {
EXPECT_TRUE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString(addressString)));
} else {
EXPECT_FALSE(platform_impl.isReservedIPAddress(
blink::WebSecurityOrigin::createFromString(addressString)));
}
}
}
} // namespace content } // namespace content
...@@ -799,6 +799,28 @@ int ConvertAddressFamily(AddressFamily address_family) { ...@@ -799,6 +799,28 @@ int ConvertAddressFamily(AddressFamily address_family) {
return AF_UNSPEC; return AF_UNSPEC;
} }
bool ParseURLHostnameToNumber(const std::string& hostname,
IPAddressNumber* ip_number) {
// |hostname| is an already canoncalized hostname, conforming to RFC 3986.
// For an IP address, this is defined in Section 3.2.2 of RFC 3986, with
// the canonical form for IPv6 addresses defined in Section 4 of RFC 5952.
url::Component host_comp(0, hostname.size());
// If it has a bracket, try parsing it as an IPv6 address.
if (hostname[0] == '[') {
ip_number->resize(16); // 128 bits.
return url::IPv6AddressToNumber(
hostname.data(), host_comp, &(*ip_number)[0]);
}
// Otherwise, try IPv4.
ip_number->resize(4); // 32 bits.
int num_components;
url::CanonHostInfo::Family family = url::IPv4AddressToNumber(
hostname.data(), host_comp, &(*ip_number)[0], &num_components);
return family == url::CanonHostInfo::IPV4;
}
bool ParseIPLiteralToNumber(const std::string& ip_literal, bool ParseIPLiteralToNumber(const std::string& ip_literal,
IPAddressNumber* ip_number) { IPAddressNumber* ip_number) {
// |ip_literal| could be either a IPv4 or an IPv6 literal. If it contains // |ip_literal| could be either a IPv4 or an IPv6 literal. If it contains
......
...@@ -372,6 +372,11 @@ NET_EXPORT_PRIVATE AddressFamily GetAddressFamily( ...@@ -372,6 +372,11 @@ NET_EXPORT_PRIVATE AddressFamily GetAddressFamily(
// Maps the given AddressFamily to either AF_INET, AF_INET6 or AF_UNSPEC. // Maps the given AddressFamily to either AF_INET, AF_INET6 or AF_UNSPEC.
NET_EXPORT_PRIVATE int ConvertAddressFamily(AddressFamily address_family); NET_EXPORT_PRIVATE int ConvertAddressFamily(AddressFamily address_family);
// Parses a URL-safe IP literal (see RFC 3986, Sec 3.2.2) to its numeric value.
// Returns true on success, and fills |ip_number| with the numeric value
NET_EXPORT bool ParseURLHostnameToNumber(const std::string& hostname,
IPAddressNumber* ip_number);
// Parses an IP address literal (either IPv4 or IPv6) to its numeric value. // 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. // Returns true on success and fills |ip_number| with the numeric value.
NET_EXPORT bool ParseIPLiteralToNumber(const std::string& ip_literal, NET_EXPORT bool ParseIPLiteralToNumber(const std::string& ip_literal,
......
...@@ -524,6 +524,31 @@ TEST(NetUtilTest, ConvertIPv4NumberToIPv6Number) { ...@@ -524,6 +524,31 @@ TEST(NetUtilTest, ConvertIPv4NumberToIPv6Number) {
EXPECT_EQ("::ffff:c0a8:1", IPAddressToString(ipv6_number)); EXPECT_EQ("::ffff:c0a8:1", IPAddressToString(ipv6_number));
} }
TEST(NetUtilTest, ParseURLHostnameToNumber_FailParse) {
IPAddressNumber number;
EXPECT_FALSE(ParseURLHostnameToNumber("bad value", &number));
EXPECT_FALSE(ParseURLHostnameToNumber("bad:value", &number));
EXPECT_FALSE(ParseURLHostnameToNumber(std::string(), &number));
EXPECT_FALSE(ParseURLHostnameToNumber("192.168.0.1:30", &number));
EXPECT_FALSE(ParseURLHostnameToNumber(" 192.168.0.1 ", &number));
EXPECT_FALSE(ParseURLHostnameToNumber("::1", &number));
}
TEST(NetUtilTest, ParseURLHostnameToNumber_IPv4) {
IPAddressNumber number;
EXPECT_TRUE(ParseURLHostnameToNumber("192.168.0.1", &number));
EXPECT_EQ("192,168,0,1", DumpIPNumber(number));
EXPECT_EQ("192.168.0.1", IPAddressToString(number));
}
TEST(NetUtilTest, ParseURLHostnameToNumber_IPv6) {
IPAddressNumber number;
EXPECT_TRUE(ParseURLHostnameToNumber("[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));
}
TEST(NetUtilTest, IsIPv4Mapped) { TEST(NetUtilTest, IsIPv4Mapped) {
IPAddressNumber ipv4_number; IPAddressNumber ipv4_number;
EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &ipv4_number)); EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &ipv4_number));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment