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
3 // found in the LICENSE file.
5 #include "net/base/filename_util.h"
8 #include "base/files/file_path.h"
9 #include "base/i18n/file_util_icu.h"
10 #include "base/strings/string16.h"
11 #include "net/base/filename_util_internal.h"
17 bool IsSafePortablePathComponent(const base::FilePath
& component
) {
18 base::string16 component16
;
19 base::FilePath::StringType sanitized
= component
.value();
20 SanitizeGeneratedFileName(&sanitized
, true);
21 base::FilePath::StringType extension
= component
.Extension();
22 if (!extension
.empty())
23 extension
.erase(extension
.begin()); // Erase preceding '.'.
24 return !component
.empty() && (component
== component
.BaseName()) &&
25 (component
== component
.StripTrailingSeparators()) &&
26 FilePathToString16(component
, &component16
) &&
27 base::i18n::IsFilenameLegal(component16
) &&
28 !IsShellIntegratedExtension(extension
) &&
29 (sanitized
== component
.value()) && !IsReservedName(component
.value());
32 bool IsSafePortableRelativePath(const base::FilePath
& path
) {
33 if (path
.empty() || path
.IsAbsolute() || path
.EndsWithSeparator())
35 std::vector
<base::FilePath::StringType
> components
;
36 path
.GetComponents(&components
);
37 if (components
.empty())
39 for (size_t i
= 0; i
< components
.size() - 1; ++i
) {
40 if (!IsSafePortablePathComponent(base::FilePath(components
[i
])))
43 return IsSafePortablePathComponent(path
.BaseName());
46 base::string16
GetSuggestedFilename(const GURL
& url
,
47 const std::string
& content_disposition
,
48 const std::string
& referrer_charset
,
49 const std::string
& suggested_name
,
50 const std::string
& mime_type
,
51 const std::string
& default_name
) {
52 return GetSuggestedFilenameImpl(
59 base::Bind(&base::i18n::ReplaceIllegalCharactersInPath
));
62 base::FilePath
GenerateFileName(const GURL
& url
,
63 const std::string
& content_disposition
,
64 const std::string
& referrer_charset
,
65 const std::string
& suggested_name
,
66 const std::string
& mime_type
,
67 const std::string
& default_file_name
) {
68 base::FilePath
generated_name(GenerateFileNameImpl(
75 base::Bind(&base::i18n::ReplaceIllegalCharactersInPath
)));
77 #if defined(OS_CHROMEOS)
78 // When doing file manager operations on ChromeOS, the file paths get
79 // normalized in WebKit layer, so let's ensure downloaded files have
80 // normalized names. Otherwise, we won't be able to handle files with NFD
81 // utf8 encoded characters in name.
82 base::i18n::NormalizeFileNameEncoding(&generated_name
);
85 DCHECK(!generated_name
.empty());
87 return generated_name
;