Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <unicode/regex.h> | 7 #include <unicode/regex.h> |
| 8 #include <unicode/ucnv.h> | 8 #include <unicode/ucnv.h> |
| 9 #include <unicode/uidna.h> | 9 #include <unicode/uidna.h> |
| 10 #include <unicode/ulocdata.h> | 10 #include <unicode/ulocdata.h> |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 151 0xFFFF, // Used to block all invalid port numbers (see | 151 0xFFFF, // Used to block all invalid port numbers (see |
| 152 // third_party/WebKit/Source/WebCore/platform/KURLGoogle.cpp, port()) | 152 // third_party/WebKit/Source/WebCore/platform/KURLGoogle.cpp, port()) |
| 153 }; | 153 }; |
| 154 | 154 |
| 155 // FTP overrides the following restricted ports. | 155 // FTP overrides the following restricted ports. |
| 156 static const int kAllowedFtpPorts[] = { | 156 static const int kAllowedFtpPorts[] = { |
| 157 21, // ftp data | 157 21, // ftp data |
| 158 22, // ssh | 158 22, // ssh |
| 159 }; | 159 }; |
| 160 | 160 |
| 161 // This list should generally match the one in string_util.cc | |
| 162 const char16 kWhitespaceUTF16[] = { | |
|
jschuh
2011/08/17 14:38:46
Seems like we should add missed whitespace charact
| |
| 163 0x0009, /* <control-0009> to <control-000D> */ \ | |
| 164 0x000A, \ | |
| 165 0x000B, \ | |
| 166 0x000C, \ | |
| 167 0x000D, \ | |
| 168 0x0020, /* Space */ \ | |
| 169 0x0085, /* <control-0085> */ \ | |
| 170 0x00A0, /* No-Break Space */ \ | |
| 171 0x1680, /* Ogham Space Mark */ \ | |
| 172 0x180E, /* Mongolian Vowel Separator */ \ | |
| 173 0x2000, /* En Quad to Hair Space */ \ | |
| 174 0x2001, \ | |
| 175 0x2002, \ | |
| 176 0x2003, \ | |
| 177 0x2004, \ | |
| 178 0x2005, \ | |
| 179 0x2006, \ | |
| 180 0x2007, \ | |
| 181 0x2008, \ | |
| 182 0x2009, \ | |
| 183 0x200A, \ | |
| 184 0x200C, /* Zero Width Non-Joiner */ \ | |
| 185 0x2028, /* Line Separator */ \ | |
| 186 0x2029, /* Paragraph Separator */ \ | |
| 187 0x202F, /* Narrow No-Break Space */ \ | |
| 188 0x205F, /* Medium Mathematical Space */ \ | |
| 189 0x3000, /* Ideographic Space */ \ | |
| 190 0 | |
| 191 }; | |
| 192 | |
| 193 static const char* const kHexString = "0123456789ABCDEF"; | |
| 194 inline char IntToHex(int i) { | |
| 195 return kHexString[i & 0xf]; | |
| 196 } | |
| 197 | |
| 198 std::string EscapeCharsInString(const std::string& input) { | |
| 199 std::string escaped_string; | |
| 200 | |
| 201 escaped_string.reserve(input.length() * 3); | |
| 202 for (unsigned int i = 0; i < input.length(); i++) { | |
| 203 unsigned char c = static_cast<unsigned char>(input[i]); | |
| 204 escaped_string.push_back('%'); | |
| 205 escaped_string.push_back(IntToHex(c >> 4)); | |
| 206 escaped_string.push_back(IntToHex(c & 0xf)); | |
| 207 } | |
| 208 return escaped_string; | |
| 209 } | |
| 210 | |
| 211 string16 EscapeCharsInString(const string16& input) { | |
| 212 string16 escaped_string; | |
| 213 | |
| 214 escaped_string.reserve(input.length() * 6); | |
| 215 for (unsigned int i = 0; i < input.length(); i++) { | |
| 216 char16 c = static_cast<char16>(input[i]); | |
| 217 escaped_string.push_back('%'); | |
| 218 escaped_string.push_back('u'); | |
| 219 escaped_string.push_back(IntToHex(c >> 12)); | |
| 220 escaped_string.push_back(IntToHex((c >> 8) & 0xf)); | |
| 221 escaped_string.push_back(IntToHex((c >> 4) & 0xf)); | |
| 222 escaped_string.push_back(IntToHex(c & 0xf)); | |
| 223 } | |
| 224 return escaped_string; | |
| 225 } | |
| 226 | |
| 227 template<typename STR> | |
| 228 void EscapeTrimChars(const STR& input, | |
| 229 const typename STR::value_type escape_chars[], | |
| 230 TrimPositions positions, | |
| 231 STR* output) { | |
| 232 // Find the edges of leading/trailing whitespace as desired. | |
| 233 const typename STR::size_type last_char = input.length() - 1; | |
| 234 const typename STR::size_type first_good_char = (positions & TRIM_LEADING) ? | |
| 235 input.find_first_not_of(escape_chars) : 0; | |
| 236 const typename STR::size_type last_good_char = (positions & TRIM_TRAILING) ? | |
| 237 input.find_last_not_of(escape_chars) : last_char; | |
| 238 STR temp_string; | |
| 239 | |
| 240 if (input.empty()) | |
| 241 return; | |
| 242 | |
| 243 if ((first_good_char == STR::npos) || (last_good_char == STR::npos)) { | |
| 244 // Escapery magic on whole string | |
| 245 return; | |
| 246 } | |
| 247 | |
| 248 temp_string = EscapeCharsInString(input.substr(0,first_good_char)); | |
| 249 temp_string += input.substr(first_good_char, last_good_char - | |
| 250 first_good_char + 1); | |
| 251 if (last_good_char < last_char) | |
| 252 temp_string += EscapeCharsInString(input.substr(last_good_char+1)); | |
| 253 *output = temp_string; | |
| 254 | |
| 255 return; | |
| 256 } | |
| 257 | |
| 161 // Similar to Base64Decode. Decodes a Q-encoded string to a sequence | 258 // Similar to Base64Decode. Decodes a Q-encoded string to a sequence |
| 162 // of bytes. If input is invalid, return false. | 259 // of bytes. If input is invalid, return false. |
| 163 bool QPDecode(const std::string& input, std::string* output) { | 260 bool QPDecode(const std::string& input, std::string* output) { |
| 164 std::string temp; | 261 std::string temp; |
| 165 temp.reserve(input.size()); | 262 temp.reserve(input.size()); |
| 166 std::string::const_iterator it = input.begin(); | 263 std::string::const_iterator it = input.begin(); |
| 167 while (it != input.end()) { | 264 while (it != input.end()) { |
| 168 if (*it == '_') { | 265 if (*it == '_') { |
| 169 temp.push_back(' '); | 266 temp.push_back(' '); |
| 170 } else if (*it == '=') { | 267 } else if (*it == '=') { |
| (...skipping 1227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1398 filename = suggested_name; | 1495 filename = suggested_name; |
| 1399 | 1496 |
| 1400 if (!filename.empty()) { | 1497 if (!filename.empty()) { |
| 1401 // Replace any path information the server may have sent, by changing | 1498 // Replace any path information the server may have sent, by changing |
| 1402 // path separators with underscores. | 1499 // path separators with underscores. |
| 1403 ReplaceSubstringsAfterOffset(&filename, 0, "/", "_"); | 1500 ReplaceSubstringsAfterOffset(&filename, 0, "/", "_"); |
| 1404 ReplaceSubstringsAfterOffset(&filename, 0, "\\", "_"); | 1501 ReplaceSubstringsAfterOffset(&filename, 0, "\\", "_"); |
| 1405 | 1502 |
| 1406 // Next, remove "." from the beginning and end of the file name to avoid | 1503 // Next, remove "." from the beginning and end of the file name to avoid |
| 1407 // tricks with hidden files, "..", and "." | 1504 // tricks with hidden files, "..", and "." |
| 1505 #if defined(OS_WIN) | |
| 1506 EscapeTrimChars(filename, ".", TRIM_ALL, &filename); | |
| 1507 #else | |
| 1408 TrimString(filename, ".", &filename); | 1508 TrimString(filename, ".", &filename); |
| 1509 #endif | |
| 1409 } | 1510 } |
| 1410 | 1511 |
| 1411 if (filename.empty()) { | 1512 if (filename.empty()) { |
| 1412 // about: and data: URLs don't have file names, but esp. data: URLs may | 1513 // about: and data: URLs don't have file names, but esp. data: URLs may |
| 1413 // contain parts that look like ones (i.e., contain a slash). | 1514 // contain parts that look like ones (i.e., contain a slash). |
| 1414 // Therefore we don't attempt to divine a file name out of them. | 1515 // Therefore we don't attempt to divine a file name out of them. |
| 1415 if (url.SchemeIs("about") || url.SchemeIs("data")) { | 1516 if (url.SchemeIs("about") || url.SchemeIs("data")) { |
| 1416 return default_name.empty() ? ASCIIToUTF16(kFinalFallbackName) | 1517 return default_name.empty() ? ASCIIToUTF16(kFinalFallbackName) |
| 1417 : default_name; | 1518 : default_name; |
| 1418 } | 1519 } |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 1432 &decoded_filename); | 1533 &decoded_filename); |
| 1433 } | 1534 } |
| 1434 | 1535 |
| 1435 filename = decoded_filename; | 1536 filename = decoded_filename; |
| 1436 } | 1537 } |
| 1437 } | 1538 } |
| 1438 | 1539 |
| 1439 #if defined(OS_WIN) | 1540 #if defined(OS_WIN) |
| 1440 { // Handle CreateFile() stripping trailing dots and spaces on filenames | 1541 { // Handle CreateFile() stripping trailing dots and spaces on filenames |
| 1441 // http://support.microsoft.com/kb/115827 | 1542 // http://support.microsoft.com/kb/115827 |
| 1442 std::string::size_type pos = filename.find_last_not_of(" ."); | 1543 EscapeTrimChars(filename, " .", TRIM_TRAILING, &filename); |
| 1443 if (pos == std::string::npos) | |
| 1444 filename.resize(0); | |
| 1445 else | |
| 1446 filename.resize(++pos); | |
| 1447 } | 1544 } |
| 1448 #endif | 1545 #endif |
| 1449 // Trim '.' once more. | 1546 // Trim '.' once more. |
| 1450 TrimString(filename, ".", &filename); | 1547 TrimString(filename, ".", &filename); |
| 1451 | 1548 |
| 1452 // If there's no filename or it gets trimed to be empty, use | 1549 // If there's no filename or it gets trimed to be empty, use |
| 1453 // the URL hostname or default_name | 1550 // the URL hostname or default_name |
| 1454 if (filename.empty()) { | 1551 if (filename.empty()) { |
| 1455 if (!default_name.empty()) { | 1552 if (!default_name.empty()) { |
| 1456 return default_name; | 1553 return default_name; |
| 1457 } else if (url.is_valid()) { | 1554 } else if (url.is_valid()) { |
| 1458 // Some schemes (e.g. file) do not have a hostname. Even though it's | 1555 // Some schemes (e.g. file) do not have a hostname. Even though it's |
| 1459 // not likely to reach here, let's hardcode the last fallback name. | 1556 // not likely to reach here, let's hardcode the last fallback name. |
| 1460 // TODO(jungshik) : Decode a 'punycoded' IDN hostname. (bug 1264451) | 1557 // TODO(jungshik) : Decode a 'punycoded' IDN hostname. (bug 1264451) |
| 1461 filename = url.host().empty() ? kFinalFallbackName : url.host(); | 1558 filename = url.host().empty() ? kFinalFallbackName : url.host(); |
| 1462 } else { | 1559 } else { |
| 1463 NOTREACHED(); | 1560 NOTREACHED(); |
| 1464 } | 1561 } |
| 1465 } | 1562 } |
| 1466 | 1563 |
| 1467 #if defined(OS_WIN) | 1564 #if defined(OS_WIN) |
| 1468 string16 path = UTF8ToUTF16(filename); | 1565 string16 path = UTF8ToUTF16(filename); |
| 1566 // On Windows we want to preserve or replace all characters including | |
| 1567 // whitespace to prevent file extension obfuscation on trusted websites | |
| 1568 // e.g. Gmail might think evil.exe. is safe, so we don't want it to become | |
| 1569 // evil.exe when we download it | |
| 1570 EscapeTrimChars(path, kWhitespaceUTF16, TRIM_ALL, &path); | |
| 1469 file_util::ReplaceIllegalCharactersInPath(&path, '-'); | 1571 file_util::ReplaceIllegalCharactersInPath(&path, '-'); |
| 1470 return path; | 1572 return path; |
| 1471 #else | 1573 #else |
| 1472 std::string path = filename; | 1574 std::string path = filename; |
| 1473 file_util::ReplaceIllegalCharactersInPath(&path, '-'); | 1575 file_util::ReplaceIllegalCharactersInPath(&path, '-'); |
| 1474 return UTF8ToUTF16(path); | 1576 return UTF8ToUTF16(path); |
| 1475 #endif | 1577 #endif |
| 1476 } | 1578 } |
| 1477 | 1579 |
| 1478 FilePath GenerateFileName(const GURL& url, | 1580 FilePath GenerateFileName(const GURL& url, |
| (...skipping 924 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2403 | 2505 |
| 2404 NetworkInterface::NetworkInterface(const std::string& name, | 2506 NetworkInterface::NetworkInterface(const std::string& name, |
| 2405 const IPAddressNumber& address) | 2507 const IPAddressNumber& address) |
| 2406 : name(name), address(address) { | 2508 : name(name), address(address) { |
| 2407 } | 2509 } |
| 2408 | 2510 |
| 2409 NetworkInterface::~NetworkInterface() { | 2511 NetworkInterface::~NetworkInterface() { |
| 2410 } | 2512 } |
| 2411 | 2513 |
| 2412 } // namespace net | 2514 } // namespace net |
| OLD | NEW |