Home | History | Annotate | Download | only in base
      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.
      4 
      5 #include "net/base/filename_util.h"
      6 
      7 #include "base/bind.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"
     12 
     13 class GURL;
     14 
     15 namespace net {
     16 
     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());
     30 }
     31 
     32 bool IsSafePortableRelativePath(const base::FilePath& path) {
     33   if (path.empty() || path.IsAbsolute() || path.EndsWithSeparator())
     34     return false;
     35   std::vector<base::FilePath::StringType> components;
     36   path.GetComponents(&components);
     37   if (components.empty())
     38     return false;
     39   for (size_t i = 0; i < components.size() - 1; ++i) {
     40     if (!IsSafePortablePathComponent(base::FilePath(components[i])))
     41       return false;
     42   }
     43   return IsSafePortablePathComponent(path.BaseName());
     44 }
     45 
     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(
     53       url,
     54       content_disposition,
     55       referrer_charset,
     56       suggested_name,
     57       mime_type,
     58       default_name,
     59       base::Bind(&base::i18n::ReplaceIllegalCharactersInPath));
     60 }
     61 
     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(
     69       url,
     70       content_disposition,
     71       referrer_charset,
     72       suggested_name,
     73       mime_type,
     74       default_file_name,
     75       base::Bind(&base::i18n::ReplaceIllegalCharactersInPath)));
     76 
     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);
     83 #endif
     84 
     85   DCHECK(!generated_name.empty());
     86 
     87   return generated_name;
     88 }
     89 
     90 }  // namespace net
     91