OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/base/net_util.h" | 5 #include "net/base/net_util.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include <ostream> | 9 #include <ostream> |
10 | 10 |
11 #include "base/files/file_path.h" | 11 #include "base/files/file_path.h" |
12 #include "base/format_macros.h" | 12 #include "base/format_macros.h" |
13 #include "base/scoped_native_library.h" | 13 #include "base/scoped_native_library.h" |
14 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
15 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
16 #include "base/strings/stringprintf.h" | 16 #include "base/strings/stringprintf.h" |
17 #include "base/strings/utf_string_conversions.h" | 17 #include "base/strings/utf_string_conversions.h" |
18 #include "base/sys_byteorder.h" | 18 #include "base/sys_byteorder.h" |
19 #include "base/time/time.h" | 19 #include "base/time/time.h" |
| 20 #include "net/base/ip_endpoint.h" |
20 | 21 |
21 #if !defined(OS_NACL) && !defined(OS_WIN) | 22 #if !defined(OS_NACL) && !defined(OS_WIN) |
22 #include <net/if.h> | 23 #include <net/if.h> |
23 #include <netinet/in.h> | 24 #include <netinet/in.h> |
| 25 #if defined(OS_MACOSX) |
| 26 #include <ifaddrs.h> |
| 27 #if !defined(OS_IOS) |
| 28 #include <netinet/in_var.h> |
| 29 #endif // !OS_IOS |
| 30 #endif // OS_MACOSX |
24 #endif // !OS_NACL && !OS_WIN | 31 #endif // !OS_NACL && !OS_WIN |
25 #include "testing/gtest/include/gtest/gtest.h" | 32 #include "testing/gtest/include/gtest/gtest.h" |
26 #include "url/gurl.h" | 33 #include "url/gurl.h" |
27 | 34 |
28 #if defined(OS_WIN) | 35 #if defined(OS_WIN) |
29 #include <iphlpapi.h> | 36 #include <iphlpapi.h> |
30 #include <objbase.h> | 37 #include <objbase.h> |
31 #include "base/win/windows_version.h" | 38 #include "base/win/windows_version.h" |
32 #include "net/base/net_util_win.h" | 39 #include "net/base/net_util_win.h" |
33 #endif // OS_WIN | 40 #endif // OS_WIN |
34 | 41 |
35 #if !defined(OS_MACOSX) && !defined(OS_NACL) && !defined(OS_WIN) | 42 #if !defined(OS_MACOSX) && !defined(OS_NACL) && !defined(OS_WIN) |
36 #include "net/base/address_tracker_linux.h" | 43 #include "net/base/address_tracker_linux.h" |
37 #endif // !OS_MACOSX && !OS_NACL && !OS_WIN | 44 #endif // !OS_MACOSX && !OS_NACL && !OS_WIN |
38 | 45 |
39 #if !defined(OS_WIN) | 46 #if !defined(OS_WIN) |
40 #include "net/base/net_util_posix.h" | 47 #include "net/base/net_util_posix.h" |
| 48 #if defined(OS_MACOSX) |
| 49 #include "net/base/net_util_mac.h" |
| 50 #else // OS_MACOSX |
| 51 #include "net/base/net_util_linux.h" |
| 52 #endif |
41 #endif // !OS_WIN | 53 #endif // !OS_WIN |
42 | 54 |
43 using base::ASCIIToUTF16; | 55 using base::ASCIIToUTF16; |
44 using base::WideToUTF16; | 56 using base::WideToUTF16; |
45 | 57 |
46 namespace net { | 58 namespace net { |
47 | 59 |
48 namespace { | 60 namespace { |
49 | 61 |
50 struct HeaderCase { | 62 struct HeaderCase { |
(...skipping 27 matching lines...) Expand all Loading... |
78 std::string DumpIPNumber(const IPAddressNumber& v) { | 90 std::string DumpIPNumber(const IPAddressNumber& v) { |
79 std::string out; | 91 std::string out; |
80 for (size_t i = 0; i < v.size(); ++i) { | 92 for (size_t i = 0; i < v.size(); ++i) { |
81 if (i != 0) | 93 if (i != 0) |
82 out.append(","); | 94 out.append(","); |
83 out.append(base::IntToString(static_cast<int>(v[i]))); | 95 out.append(base::IntToString(static_cast<int>(v[i]))); |
84 } | 96 } |
85 return out; | 97 return out; |
86 } | 98 } |
87 | 99 |
| 100 #if defined(OS_MACOSX) |
| 101 class IPAttributesGetterTest : public internal::IPAttributesGetterMac { |
| 102 public: |
| 103 IPAttributesGetterTest() : native_attributes_(0) {} |
| 104 bool IsInitialized() const override { return true; } |
| 105 bool GetIPAttributes(const char* ifname, |
| 106 const sockaddr* sock_addr, |
| 107 int* native_attributes) override { |
| 108 *native_attributes = native_attributes_; |
| 109 return true; |
| 110 } |
| 111 void set_native_attributes(int native_attributes) { |
| 112 native_attributes_ = native_attributes; |
| 113 } |
| 114 |
| 115 private: |
| 116 int native_attributes_; |
| 117 }; |
| 118 |
| 119 // Helper function to create a single valid ifaddrs |
| 120 bool FillIfaddrs(ifaddrs* interfaces, |
| 121 const char* ifname, |
| 122 uint flags, |
| 123 const IPAddressNumber& ip_address, |
| 124 const IPAddressNumber& ip_netmask, |
| 125 sockaddr_storage sock_addrs[2]) { |
| 126 interfaces->ifa_next = NULL; |
| 127 interfaces->ifa_name = const_cast<char*>(ifname); |
| 128 interfaces->ifa_flags = flags; |
| 129 |
| 130 socklen_t sock_len = sizeof(sockaddr_storage); |
| 131 |
| 132 // Convert to sockaddr for next check. |
| 133 if (!IPEndPoint(ip_address, 0) |
| 134 .ToSockAddr(reinterpret_cast<sockaddr*>(&sock_addrs[0]), |
| 135 &sock_len)) { |
| 136 return false; |
| 137 } |
| 138 interfaces->ifa_addr = reinterpret_cast<sockaddr*>(&sock_addrs[0]); |
| 139 |
| 140 sock_len = sizeof(sockaddr_storage); |
| 141 if (!IPEndPoint(ip_netmask, 0) |
| 142 .ToSockAddr(reinterpret_cast<sockaddr*>(&sock_addrs[1]), |
| 143 &sock_len)) { |
| 144 return false; |
| 145 } |
| 146 interfaces->ifa_netmask = reinterpret_cast<sockaddr*>(&sock_addrs[1]); |
| 147 |
| 148 return true; |
| 149 } |
| 150 #endif // OS_MACOSX |
| 151 |
88 } // anonymous namespace | 152 } // anonymous namespace |
89 | 153 |
90 TEST(NetUtilTest, GetIdentityFromURL) { | 154 TEST(NetUtilTest, GetIdentityFromURL) { |
91 struct { | 155 struct { |
92 const char* input_url; | 156 const char* input_url; |
93 const char* expected_username; | 157 const char* expected_username; |
94 const char* expected_password; | 158 const char* expected_password; |
95 } tests[] = { | 159 } tests[] = { |
96 { | 160 { |
97 "http://username:password@google.com", | 161 "http://username:password@google.com", |
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
805 EXPECT_NE(WIFI_PHY_LAYER_PROTOCOL_NONE, GetWifiPHYLayerProtocol()); | 869 EXPECT_NE(WIFI_PHY_LAYER_PROTOCOL_NONE, GetWifiPHYLayerProtocol()); |
806 } | 870 } |
807 #elif !defined(OS_ANDROID) | 871 #elif !defined(OS_ANDROID) |
808 char name[IF_NAMESIZE]; | 872 char name[IF_NAMESIZE]; |
809 EXPECT_TRUE(if_indextoname(it->interface_index, name)); | 873 EXPECT_TRUE(if_indextoname(it->interface_index, name)); |
810 EXPECT_STREQ(it->name.c_str(), name); | 874 EXPECT_STREQ(it->name.c_str(), name); |
811 #endif | 875 #endif |
812 } | 876 } |
813 } | 877 } |
814 | 878 |
| 879 static const char ifname_em1[] = "em1"; |
| 880 static const char ifname_vm[] = "vmnet"; |
| 881 |
| 882 static const unsigned char kIPv6LocalAddr[] = { |
| 883 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; |
| 884 static const unsigned char kIPv6Addr[] = |
| 885 {0x24, 0x01, 0xfa, 0x00, 0x00, 0x04, 0x10, 0x00, 0xbe, 0x30, 0x5b, 0xff, |
| 886 0xfe, 0xe5, 0x00, 0xc3}; |
| 887 static const unsigned char kIPv6Netmask[] = |
| 888 {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 889 0x00, 0x00, 0x00, 0x00}; |
| 890 |
815 #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(OS_NACL) | 891 #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(OS_NACL) |
816 | 892 |
817 char* CopyInterfaceName(const char* ifname, int ifname_size, char* output) { | 893 char* CopyInterfaceName(const char* ifname, int ifname_size, char* output) { |
818 EXPECT_LT(ifname_size, IF_NAMESIZE); | 894 EXPECT_LT(ifname_size, IF_NAMESIZE); |
819 memcpy(output, ifname, ifname_size); | 895 memcpy(output, ifname, ifname_size); |
820 return output; | 896 return output; |
821 } | 897 } |
822 | 898 |
823 static const char ifname_em1[] = "em1"; | |
824 char* GetInterfaceName(unsigned int interface_index, char* ifname) { | 899 char* GetInterfaceName(unsigned int interface_index, char* ifname) { |
825 return CopyInterfaceName(ifname_em1, arraysize(ifname_em1), ifname); | 900 return CopyInterfaceName(ifname_em1, arraysize(ifname_em1), ifname); |
826 } | 901 } |
827 | 902 |
828 static const char ifname_vm[] = "vmnet"; | |
829 char* GetInterfaceNameVM(unsigned int interface_index, char* ifname) { | 903 char* GetInterfaceNameVM(unsigned int interface_index, char* ifname) { |
830 return CopyInterfaceName(ifname_vm, arraysize(ifname_vm), ifname); | 904 return CopyInterfaceName(ifname_vm, arraysize(ifname_vm), ifname); |
831 } | 905 } |
832 | 906 |
833 TEST(NetUtilTest, GetNetworkListTrimming) { | 907 TEST(NetUtilTest, GetNetworkListTrimming) { |
| 908 IPAddressNumber ipv6_local_address( |
| 909 kIPv6LocalAddr, kIPv6LocalAddr + arraysize(kIPv6LocalAddr)); |
| 910 IPAddressNumber ipv6_address(kIPv6Addr, kIPv6Addr + arraysize(kIPv6Addr)); |
| 911 IPAddressNumber ipv6_netmask(kIPv6Netmask, |
| 912 kIPv6Netmask + arraysize(kIPv6Netmask)); |
| 913 |
834 NetworkInterfaceList results; | 914 NetworkInterfaceList results; |
835 ::base::hash_set<int> online_links; | 915 ::base::hash_set<int> online_links; |
836 net::internal::AddressTrackerLinux::AddressMap address_map; | 916 net::internal::AddressTrackerLinux::AddressMap address_map; |
837 | 917 |
838 const unsigned char kIPv6LocalAddr[] = { | |
839 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; | |
840 const unsigned char kIPv6Addr[] = | |
841 {0x24, 0x01, 0xfa, 0x00, 0x00, 0x04, 0x10, 0x00, 0xbe, 0x30, 0x5b, 0xff, | |
842 0xfe, 0xe5, 0x00, 0xc3}; | |
843 | |
844 IPAddressNumber ipv6_local_address( | |
845 kIPv6LocalAddr, kIPv6LocalAddr + arraysize(kIPv6LocalAddr)); | |
846 IPAddressNumber ipv6_address(kIPv6Addr, kIPv6Addr + arraysize(kIPv6Addr)); | |
847 | |
848 // Interface 1 is offline. | 918 // Interface 1 is offline. |
849 struct ifaddrmsg msg = { | 919 struct ifaddrmsg msg = { |
850 AF_INET6, | 920 AF_INET6, |
851 1, /* prefix length */ | 921 1, /* prefix length */ |
852 IFA_F_TEMPORARY, /* address flags */ | 922 IFA_F_TEMPORARY, /* address flags */ |
853 0, /* link scope */ | 923 0, /* link scope */ |
854 1 /* link index */ | 924 1 /* link index */ |
855 }; | 925 }; |
856 | 926 |
857 // Address of offline links should be ignored. | 927 // Address of offline links should be ignored. |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
949 address_map, | 1019 address_map, |
950 GetInterfaceName)); | 1020 GetInterfaceName)); |
951 EXPECT_EQ(results.size(), 1ul); | 1021 EXPECT_EQ(results.size(), 1ul); |
952 EXPECT_EQ(results[0].name, ifname_em1); | 1022 EXPECT_EQ(results[0].name, ifname_em1); |
953 EXPECT_EQ(results[0].network_prefix, 1ul); | 1023 EXPECT_EQ(results[0].network_prefix, 1ul); |
954 EXPECT_EQ(results[0].address, ipv6_address); | 1024 EXPECT_EQ(results[0].address, ipv6_address); |
955 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_DEPRECATED); | 1025 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_DEPRECATED); |
956 results.clear(); | 1026 results.clear(); |
957 } | 1027 } |
958 | 1028 |
959 #endif | 1029 #elif defined(OS_MACOSX) |
| 1030 |
| 1031 TEST(NetUtilTest, GetNetworkListTrimming) { |
| 1032 IPAddressNumber ipv6_local_address( |
| 1033 kIPv6LocalAddr, kIPv6LocalAddr + arraysize(kIPv6LocalAddr)); |
| 1034 IPAddressNumber ipv6_address(kIPv6Addr, kIPv6Addr + arraysize(kIPv6Addr)); |
| 1035 IPAddressNumber ipv6_netmask(kIPv6Netmask, |
| 1036 kIPv6Netmask + arraysize(kIPv6Netmask)); |
| 1037 |
| 1038 NetworkInterfaceList results; |
| 1039 IPAttributesGetterTest ip_attributes_getter; |
| 1040 sockaddr_storage addresses[2]; |
| 1041 ifaddrs interface; |
| 1042 |
| 1043 // Address of offline links should be ignored. |
| 1044 ASSERT_TRUE(FillIfaddrs(&interface, ifname_em1, IFF_UP, ipv6_address, |
| 1045 ipv6_netmask, addresses)); |
| 1046 EXPECT_TRUE(net::internal::GetNetworkListImpl( |
| 1047 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface, |
| 1048 &ip_attributes_getter)); |
| 1049 EXPECT_EQ(results.size(), 0ul); |
| 1050 |
| 1051 // Local address should be trimmed out. |
| 1052 ASSERT_TRUE(FillIfaddrs(&interface, ifname_em1, IFF_RUNNING, |
| 1053 ipv6_local_address, ipv6_netmask, addresses)); |
| 1054 EXPECT_TRUE(net::internal::GetNetworkListImpl( |
| 1055 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface, |
| 1056 &ip_attributes_getter)); |
| 1057 EXPECT_EQ(results.size(), 0ul); |
| 1058 |
| 1059 // vmware address should return by default. |
| 1060 ASSERT_TRUE(FillIfaddrs(&interface, ifname_vm, IFF_RUNNING, ipv6_address, |
| 1061 ipv6_netmask, addresses)); |
| 1062 EXPECT_TRUE(net::internal::GetNetworkListImpl( |
| 1063 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface, |
| 1064 &ip_attributes_getter)); |
| 1065 EXPECT_EQ(results.size(), 1ul); |
| 1066 EXPECT_EQ(results[0].name, ifname_vm); |
| 1067 EXPECT_EQ(results[0].network_prefix, 1ul); |
| 1068 EXPECT_EQ(results[0].address, ipv6_address); |
| 1069 results.clear(); |
| 1070 |
| 1071 // vmware address should be trimmed out if policy specified so. |
| 1072 ASSERT_TRUE(FillIfaddrs(&interface, ifname_vm, IFF_RUNNING, ipv6_address, |
| 1073 ipv6_netmask, addresses)); |
| 1074 EXPECT_TRUE(net::internal::GetNetworkListImpl( |
| 1075 &results, EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface, |
| 1076 &ip_attributes_getter)); |
| 1077 EXPECT_EQ(results.size(), 0ul); |
| 1078 results.clear(); |
| 1079 |
| 1080 #if !defined(OS_IOS) |
| 1081 // Addresses with banned attributes should be ignored. |
| 1082 ip_attributes_getter.set_native_attributes(IN6_IFF_ANYCAST); |
| 1083 ASSERT_TRUE(FillIfaddrs(&interface, ifname_em1, IFF_RUNNING, ipv6_address, |
| 1084 ipv6_netmask, addresses)); |
| 1085 EXPECT_TRUE(net::internal::GetNetworkListImpl( |
| 1086 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface, |
| 1087 &ip_attributes_getter)); |
| 1088 EXPECT_EQ(results.size(), 0ul); |
| 1089 results.clear(); |
| 1090 |
| 1091 // Addresses with allowed attribute IFA_F_TEMPORARY should be returned and |
| 1092 // attributes should be translated correctly. |
| 1093 ip_attributes_getter.set_native_attributes(IN6_IFF_TEMPORARY); |
| 1094 ASSERT_TRUE(FillIfaddrs(&interface, ifname_em1, IFF_RUNNING, ipv6_address, |
| 1095 ipv6_netmask, addresses)); |
| 1096 EXPECT_TRUE(net::internal::GetNetworkListImpl( |
| 1097 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface, |
| 1098 &ip_attributes_getter)); |
| 1099 EXPECT_EQ(results.size(), 1ul); |
| 1100 EXPECT_EQ(results[0].name, ifname_em1); |
| 1101 EXPECT_EQ(results[0].network_prefix, 1ul); |
| 1102 EXPECT_EQ(results[0].address, ipv6_address); |
| 1103 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_TEMPORARY); |
| 1104 results.clear(); |
| 1105 |
| 1106 // Addresses with allowed attribute IFA_F_DEPRECATED should be returned and |
| 1107 // attributes should be translated correctly. |
| 1108 ip_attributes_getter.set_native_attributes(IN6_IFF_DEPRECATED); |
| 1109 ASSERT_TRUE(FillIfaddrs(&interface, ifname_em1, IFF_RUNNING, ipv6_address, |
| 1110 ipv6_netmask, addresses)); |
| 1111 EXPECT_TRUE(net::internal::GetNetworkListImpl( |
| 1112 &results, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES, &interface, |
| 1113 &ip_attributes_getter)); |
| 1114 EXPECT_EQ(results.size(), 1ul); |
| 1115 EXPECT_EQ(results[0].name, ifname_em1); |
| 1116 EXPECT_EQ(results[0].network_prefix, 1ul); |
| 1117 EXPECT_EQ(results[0].address, ipv6_address); |
| 1118 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_DEPRECATED); |
| 1119 results.clear(); |
| 1120 #endif // !OS_IOS |
| 1121 } |
| 1122 |
| 1123 #endif // !OS_MACOSX && !OS_WIN && !OS_NACL |
960 | 1124 |
961 namespace { | 1125 namespace { |
962 | 1126 |
963 #if defined(OS_WIN) | 1127 #if defined(OS_WIN) |
964 bool read_int_or_bool(DWORD data_size, | 1128 bool read_int_or_bool(DWORD data_size, |
965 PVOID data) { | 1129 PVOID data) { |
966 switch (data_size) { | 1130 switch (data_size) { |
967 case 1: | 1131 case 1: |
968 return !!*reinterpret_cast<uint8*>(data); | 1132 return !!*reinterpret_cast<uint8*>(data); |
969 case 4: | 1133 case 4: |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1141 TEST_P(NetUtilNonUniqueNameTest, IsHostnameNonUnique) { | 1305 TEST_P(NetUtilNonUniqueNameTest, IsHostnameNonUnique) { |
1142 const NonUniqueNameTestData& test_data = GetParam(); | 1306 const NonUniqueNameTestData& test_data = GetParam(); |
1143 | 1307 |
1144 EXPECT_EQ(test_data.is_unique, IsUnique(test_data.hostname)); | 1308 EXPECT_EQ(test_data.is_unique, IsUnique(test_data.hostname)); |
1145 } | 1309 } |
1146 | 1310 |
1147 INSTANTIATE_TEST_CASE_P(, NetUtilNonUniqueNameTest, | 1311 INSTANTIATE_TEST_CASE_P(, NetUtilNonUniqueNameTest, |
1148 testing::ValuesIn(kNonUniqueNameTestData)); | 1312 testing::ValuesIn(kNonUniqueNameTestData)); |
1149 | 1313 |
1150 } // namespace net | 1314 } // namespace net |
OLD | NEW |