| 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 |