OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/filename_util.h" | 5 #include "net/base/filename_util.h" |
6 | 6 |
7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
8 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
9 #include "base/path_service.h" | 9 #include "base/path_service.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 // If the URL contains a (possibly empty) query, assume it is a generator, and | 82 // If the URL contains a (possibly empty) query, assume it is a generator, and |
83 // allow the determined extension to be overwritten. | 83 // allow the determined extension to be overwritten. |
84 *should_overwrite_extension = !decoded_filename.empty() && url.has_query(); | 84 *should_overwrite_extension = !decoded_filename.empty() && url.has_query(); |
85 | 85 |
86 return decoded_filename; | 86 return decoded_filename; |
87 } | 87 } |
88 | 88 |
89 // Returns whether the specified extension is automatically integrated into the | 89 // Returns whether the specified extension is automatically integrated into the |
90 // windows shell. | 90 // windows shell. |
91 bool IsShellIntegratedExtension(const base::FilePath::StringType& extension) { | 91 bool IsShellIntegratedExtension(const base::FilePath::StringType& extension) { |
92 base::FilePath::StringType extension_lower = StringToLowerASCII(extension); | 92 base::FilePath::StringType extension_lower = |
| 93 base::StringToLowerASCII(extension); |
93 | 94 |
94 // http://msdn.microsoft.com/en-us/library/ms811694.aspx | 95 // http://msdn.microsoft.com/en-us/library/ms811694.aspx |
95 // Right-clicking on shortcuts can be magical. | 96 // Right-clicking on shortcuts can be magical. |
96 if ((extension_lower == FILE_PATH_LITERAL("local")) || | 97 if ((extension_lower == FILE_PATH_LITERAL("local")) || |
97 (extension_lower == FILE_PATH_LITERAL("lnk"))) | 98 (extension_lower == FILE_PATH_LITERAL("lnk"))) |
98 return true; | 99 return true; |
99 | 100 |
100 // http://www.juniper.net/security/auto/vulnerabilities/vuln2612.html | 101 // http://www.juniper.net/security/auto/vulnerabilities/vuln2612.html |
101 // Files become magical if they end in a CLSID, so block such extensions. | 102 // Files become magical if they end in a CLSID, so block such extensions. |
102 if (!extension_lower.empty() && | 103 if (!extension_lower.empty() && |
103 (extension_lower[0] == FILE_PATH_LITERAL('{')) && | 104 (extension_lower[0] == FILE_PATH_LITERAL('{')) && |
104 (extension_lower[extension_lower.length() - 1] == FILE_PATH_LITERAL('}'))) | 105 (extension_lower[extension_lower.length() - 1] == FILE_PATH_LITERAL('}'))) |
105 return true; | 106 return true; |
106 return false; | 107 return false; |
107 } | 108 } |
108 | 109 |
109 // Returns whether the specified file name is a reserved name on windows. | 110 // Returns whether the specified file name is a reserved name on windows. |
110 // This includes names like "com2.zip" (which correspond to devices) and | 111 // This includes names like "com2.zip" (which correspond to devices) and |
111 // desktop.ini and thumbs.db which have special meaning to the windows shell. | 112 // desktop.ini and thumbs.db which have special meaning to the windows shell. |
112 bool IsReservedName(const base::FilePath::StringType& filename) { | 113 bool IsReservedName(const base::FilePath::StringType& filename) { |
113 // This list is taken from the MSDN article "Naming a file" | 114 // This list is taken from the MSDN article "Naming a file" |
114 // http://msdn2.microsoft.com/en-us/library/aa365247(VS.85).aspx | 115 // http://msdn2.microsoft.com/en-us/library/aa365247(VS.85).aspx |
115 // I also added clock$ because GetSaveFileName seems to consider it as a | 116 // I also added clock$ because GetSaveFileName seems to consider it as a |
116 // reserved name too. | 117 // reserved name too. |
117 static const char* const known_devices[] = { | 118 static const char* const known_devices[] = { |
118 "con", "prn", "aux", "nul", "com1", "com2", "com3", "com4", | 119 "con", "prn", "aux", "nul", "com1", "com2", "com3", "com4", |
119 "com5", "com6", "com7", "com8", "com9", "lpt1", "lpt2", "lpt3", | 120 "com5", "com6", "com7", "com8", "com9", "lpt1", "lpt2", "lpt3", |
120 "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9", "clock$"}; | 121 "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9", "clock$"}; |
121 #if defined(OS_WIN) | 122 #if defined(OS_WIN) |
122 std::string filename_lower = StringToLowerASCII(base::WideToUTF8(filename)); | 123 std::string filename_lower = |
| 124 base::StringToLowerASCII(base::WideToUTF8(filename)); |
123 #elif defined(OS_POSIX) | 125 #elif defined(OS_POSIX) |
124 std::string filename_lower = StringToLowerASCII(filename); | 126 std::string filename_lower = base::StringToLowerASCII(filename); |
125 #endif | 127 #endif |
126 | 128 |
127 for (size_t i = 0; i < arraysize(known_devices); ++i) { | 129 for (size_t i = 0; i < arraysize(known_devices); ++i) { |
128 // Exact match. | 130 // Exact match. |
129 if (filename_lower == known_devices[i]) | 131 if (filename_lower == known_devices[i]) |
130 return true; | 132 return true; |
131 // Starts with "DEVICE.". | 133 // Starts with "DEVICE.". |
132 if (filename_lower.find(std::string(known_devices[i]) + ".") == 0) | 134 if (filename_lower.find(std::string(known_devices[i]) + ".") == 0) |
133 return true; | 135 return true; |
134 } | 136 } |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 base::FilePath generated_name( | 311 base::FilePath generated_name( |
310 base::SysWideToNativeMB(base::UTF16ToWide(file_name))); | 312 base::SysWideToNativeMB(base::UTF16ToWide(file_name))); |
311 #endif | 313 #endif |
312 | 314 |
313 DCHECK(!generated_name.empty()); | 315 DCHECK(!generated_name.empty()); |
314 | 316 |
315 return generated_name; | 317 return generated_name; |
316 } | 318 } |
317 | 319 |
318 } // namespace net | 320 } // namespace net |
OLD | NEW |