| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <unicode/regex.h> | 9 #include <unicode/regex.h> |
| 10 #include <unicode/ucnv.h> | 10 #include <unicode/ucnv.h> |
| (...skipping 1034 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1045 } // namespace | 1045 } // namespace |
| 1046 | 1046 |
| 1047 const FormatUrlType kFormatUrlOmitNothing = 0; | 1047 const FormatUrlType kFormatUrlOmitNothing = 0; |
| 1048 const FormatUrlType kFormatUrlOmitUsernamePassword = 1 << 0; | 1048 const FormatUrlType kFormatUrlOmitUsernamePassword = 1 << 0; |
| 1049 const FormatUrlType kFormatUrlOmitHTTP = 1 << 1; | 1049 const FormatUrlType kFormatUrlOmitHTTP = 1 << 1; |
| 1050 const FormatUrlType kFormatUrlOmitTrailingSlashOnBareHostname = 1 << 2; | 1050 const FormatUrlType kFormatUrlOmitTrailingSlashOnBareHostname = 1 << 2; |
| 1051 const FormatUrlType kFormatUrlOmitAll = kFormatUrlOmitUsernamePassword | | 1051 const FormatUrlType kFormatUrlOmitAll = kFormatUrlOmitUsernamePassword | |
| 1052 kFormatUrlOmitHTTP | kFormatUrlOmitTrailingSlashOnBareHostname; | 1052 kFormatUrlOmitHTTP | kFormatUrlOmitTrailingSlashOnBareHostname; |
| 1053 | 1053 |
| 1054 // TODO(viettrungluu): We don't want non-POD globals; change this. | 1054 // TODO(viettrungluu): We don't want non-POD globals; change this. |
| 1055 std::set<int> explicitly_allowed_ports; | 1055 std::multiset<int> explicitly_allowed_ports; |
| 1056 | 1056 |
| 1057 GURL FilePathToFileURL(const FilePath& path) { | 1057 GURL FilePathToFileURL(const FilePath& path) { |
| 1058 // Produce a URL like "file:///C:/foo" for a regular file, or | 1058 // Produce a URL like "file:///C:/foo" for a regular file, or |
| 1059 // "file://///server/path" for UNC. The URL canonicalizer will fix up the | 1059 // "file://///server/path" for UNC. The URL canonicalizer will fix up the |
| 1060 // latter case to be the canonical UNC form: "file://server/path" | 1060 // latter case to be the canonical UNC form: "file://server/path" |
| 1061 FilePath::StringType url_string(kFileURLPrefix); | 1061 FilePath::StringType url_string(kFileURLPrefix); |
| 1062 url_string.append(path.value()); | 1062 url_string.append(path.value()); |
| 1063 | 1063 |
| 1064 // Now do replacement of some characters. Since we assume the input is a | 1064 // Now do replacement of some characters. Since we assume the input is a |
| 1065 // literal filename, anything the URL parser might consider special should | 1065 // literal filename, anything the URL parser might consider special should |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1489 } | 1489 } |
| 1490 } | 1490 } |
| 1491 // Port not explicitly allowed by FTP, so return the default restrictions. | 1491 // Port not explicitly allowed by FTP, so return the default restrictions. |
| 1492 return IsPortAllowedByDefault(port); | 1492 return IsPortAllowedByDefault(port); |
| 1493 } | 1493 } |
| 1494 | 1494 |
| 1495 bool IsPortAllowedByOverride(int port) { | 1495 bool IsPortAllowedByOverride(int port) { |
| 1496 if (explicitly_allowed_ports.empty()) | 1496 if (explicitly_allowed_ports.empty()) |
| 1497 return false; | 1497 return false; |
| 1498 | 1498 |
| 1499 std::set<int>::const_iterator it = | 1499 return explicitly_allowed_ports.count(port) > 0; |
| 1500 std::find(explicitly_allowed_ports.begin(), | |
| 1501 explicitly_allowed_ports.end(), | |
| 1502 port); | |
| 1503 | |
| 1504 return it != explicitly_allowed_ports.end(); | |
| 1505 } | 1500 } |
| 1506 | 1501 |
| 1507 int SetNonBlocking(int fd) { | 1502 int SetNonBlocking(int fd) { |
| 1508 #if defined(OS_WIN) | 1503 #if defined(OS_WIN) |
| 1509 unsigned long no_block = 1; | 1504 unsigned long no_block = 1; |
| 1510 return ioctlsocket(fd, FIONBIO, &no_block); | 1505 return ioctlsocket(fd, FIONBIO, &no_block); |
| 1511 #elif defined(OS_POSIX) | 1506 #elif defined(OS_POSIX) |
| 1512 int flags = fcntl(fd, F_GETFL, 0); | 1507 int flags = fcntl(fd, F_GETFL, 0); |
| 1513 if (-1 == flags) | 1508 if (-1 == flags) |
| 1514 return flags; | 1509 return flags; |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1719 replacements.ClearRef(); | 1714 replacements.ClearRef(); |
| 1720 return url.ReplaceComponents(replacements); | 1715 return url.ReplaceComponents(replacements); |
| 1721 } | 1716 } |
| 1722 | 1717 |
| 1723 // Specifies a comma separated list of port numbers that should be accepted | 1718 // Specifies a comma separated list of port numbers that should be accepted |
| 1724 // despite bans. If the string is invalid no allowed ports are stored. | 1719 // despite bans. If the string is invalid no allowed ports are stored. |
| 1725 void SetExplicitlyAllowedPorts(const std::string& allowed_ports) { | 1720 void SetExplicitlyAllowedPorts(const std::string& allowed_ports) { |
| 1726 if (allowed_ports.empty()) | 1721 if (allowed_ports.empty()) |
| 1727 return; | 1722 return; |
| 1728 | 1723 |
| 1729 std::set<int> ports; | 1724 std::multiset<int> ports; |
| 1730 size_t last = 0; | 1725 size_t last = 0; |
| 1731 size_t size = allowed_ports.size(); | 1726 size_t size = allowed_ports.size(); |
| 1732 // The comma delimiter. | 1727 // The comma delimiter. |
| 1733 const std::string::value_type kComma = ','; | 1728 const std::string::value_type kComma = ','; |
| 1734 | 1729 |
| 1735 // Overflow is still possible for evil user inputs. | 1730 // Overflow is still possible for evil user inputs. |
| 1736 for (size_t i = 0; i <= size; ++i) { | 1731 for (size_t i = 0; i <= size; ++i) { |
| 1737 // The string should be composed of only digits and commas. | 1732 // The string should be composed of only digits and commas. |
| 1738 if (i != size && !IsAsciiDigit(allowed_ports[i]) && | 1733 if (i != size && !IsAsciiDigit(allowed_ports[i]) && |
| 1739 (allowed_ports[i] != kComma)) | 1734 (allowed_ports[i] != kComma)) |
| 1740 return; | 1735 return; |
| 1741 if (i == size || allowed_ports[i] == kComma) { | 1736 if (i == size || allowed_ports[i] == kComma) { |
| 1742 if (i > last) { | 1737 if (i > last) { |
| 1743 int port; | 1738 int port; |
| 1744 base::StringToInt(allowed_ports.begin() + last, | 1739 base::StringToInt(allowed_ports.begin() + last, |
| 1745 allowed_ports.begin() + i, | 1740 allowed_ports.begin() + i, |
| 1746 &port); | 1741 &port); |
| 1747 ports.insert(port); | 1742 ports.insert(port); |
| 1748 } | 1743 } |
| 1749 last = i + 1; | 1744 last = i + 1; |
| 1750 } | 1745 } |
| 1751 } | 1746 } |
| 1752 explicitly_allowed_ports = ports; | 1747 explicitly_allowed_ports = ports; |
| 1753 } | 1748 } |
| 1754 | 1749 |
| 1750 ScopedPortException::ScopedPortException(int port) : port_(port) { |
| 1751 explicitly_allowed_ports.insert(port); |
| 1752 } |
| 1753 |
| 1754 ScopedPortException::~ScopedPortException() { |
| 1755 std::multiset<int>::iterator it = explicitly_allowed_ports.find(port_); |
| 1756 if (it != explicitly_allowed_ports.end()) |
| 1757 explicitly_allowed_ports.erase(it); |
| 1758 else |
| 1759 NOTREACHED(); |
| 1760 } |
| 1761 |
| 1755 enum IPv6SupportStatus { | 1762 enum IPv6SupportStatus { |
| 1756 IPV6_CANNOT_CREATE_SOCKETS, | 1763 IPV6_CANNOT_CREATE_SOCKETS, |
| 1757 IPV6_CAN_CREATE_SOCKETS, | 1764 IPV6_CAN_CREATE_SOCKETS, |
| 1758 IPV6_GETIFADDRS_FAILED, | 1765 IPV6_GETIFADDRS_FAILED, |
| 1759 IPV6_GLOBAL_ADDRESS_MISSING, | 1766 IPV6_GLOBAL_ADDRESS_MISSING, |
| 1760 IPV6_GLOBAL_ADDRESS_PRESENT, | 1767 IPV6_GLOBAL_ADDRESS_PRESENT, |
| 1761 IPV6_INTERFACE_ARRAY_TOO_SHORT, | 1768 IPV6_INTERFACE_ARRAY_TOO_SHORT, |
| 1762 IPV6_SUPPORT_MAX // Bounding values for enumeration. | 1769 IPV6_SUPPORT_MAX // Bounding values for enumeration. |
| 1763 }; | 1770 }; |
| 1764 | 1771 |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2053 } | 2060 } |
| 2054 | 2061 |
| 2055 int GetPortFromAddrinfo(const struct addrinfo* info) { | 2062 int GetPortFromAddrinfo(const struct addrinfo* info) { |
| 2056 uint16* port_field = GetPortFieldFromAddrinfo(info); | 2063 uint16* port_field = GetPortFieldFromAddrinfo(info); |
| 2057 if (!port_field) | 2064 if (!port_field) |
| 2058 return -1; | 2065 return -1; |
| 2059 return ntohs(*port_field); | 2066 return ntohs(*port_field); |
| 2060 } | 2067 } |
| 2061 | 2068 |
| 2062 } // namespace net | 2069 } // namespace net |
| OLD | NEW |