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
16namespace extensions {
17
18bool 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