Home | History | Annotate | Download | only in extensions
      1 // Copyright (c) 2012 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 "chrome/browser/extensions/extension_creator_filter.h"
      6 
      7 #include <vector>
      8 #include <set>
      9 
     10 #include "base/files/file_path.h"
     11 
     12 #if defined(OS_WIN)
     13 #include <windows.h>
     14 #endif
     15 
     16 namespace extensions {
     17 
     18 bool ExtensionCreatorFilter::ShouldPackageFile(
     19     const base::FilePath& file_path) {
     20   const base::FilePath& base_name = file_path.BaseName();
     21   if (base_name.empty()) {
     22     return false;
     23   }
     24 
     25   // The file path that contains one of following special components should be
     26   // excluded. See crbug.com/314360 and crbug.com/27840.
     27   const base::FilePath::StringType names_to_exclude[] = {
     28     FILE_PATH_LITERAL(".DS_Store"),
     29     FILE_PATH_LITERAL(".git"),
     30     FILE_PATH_LITERAL(".svn"),
     31     FILE_PATH_LITERAL("__MACOSX"),
     32     FILE_PATH_LITERAL("desktop.ini"),
     33     FILE_PATH_LITERAL("Thumbs.db")
     34   };
     35   std::set<base::FilePath::StringType> names_to_exclude_set(names_to_exclude,
     36       names_to_exclude + arraysize(names_to_exclude));
     37   std::vector<base::FilePath::StringType> components;
     38   file_path.GetComponents(&components);
     39   for (size_t i = 0; i < components.size(); i++) {
     40     if (names_to_exclude_set.count(components[i]))
     41       return false;
     42   }
     43 
     44   base::FilePath::CharType first_character = base_name.value()[0];
     45   base::FilePath::CharType last_character =
     46       base_name.value()[base_name.value().length() - 1];
     47 
     48   // dotfile
     49   if (first_character == '.') {
     50     return false;
     51   }
     52   // Emacs backup file
     53   if (last_character == '~') {
     54     return false;
     55   }
     56   // Emacs auto-save file
     57   if (first_character == '#' && last_character == '#') {
     58     return false;
     59   }
     60 
     61 #if defined(OS_WIN)
     62   // It's correct that we use file_path, not base_name, here, because we
     63   // are working with the actual file.
     64   DWORD file_attributes = ::GetFileAttributes(file_path.value().c_str());
     65   if (file_attributes == INVALID_FILE_ATTRIBUTES) {
     66     return false;
     67   }
     68   if ((file_attributes & FILE_ATTRIBUTE_HIDDEN) != 0) {
     69     return false;
     70   }
     71 #endif
     72 
     73   return true;
     74 }
     75 
     76 }  // namespace extensions
     77