15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_creator_filter.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <vector>
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <set>
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ExtensionCreatorFilter::ShouldPackageFile(
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& file_path) {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& base_name = file_path.BaseName();
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base_name.empty()) {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The file path that contains one of following special components should be
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // excluded. See crbug.com/314360 and crbug.com/27840.
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const base::FilePath::StringType names_to_exclude[] = {
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    FILE_PATH_LITERAL(".DS_Store"),
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    FILE_PATH_LITERAL(".git"),
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    FILE_PATH_LITERAL(".svn"),
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    FILE_PATH_LITERAL("__MACOSX"),
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    FILE_PATH_LITERAL("desktop.ini"),
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    FILE_PATH_LITERAL("Thumbs.db")
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::set<base::FilePath::StringType> names_to_exclude_set(names_to_exclude,
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      names_to_exclude + arraysize(names_to_exclude));
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::vector<base::FilePath::StringType> components;
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  file_path.GetComponents(&components);
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  for (size_t i = 0; i < components.size(); i++) {
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (names_to_exclude_set.count(components[i]))
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return false;
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath::CharType first_character = base_name.value()[0];
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath::CharType last_character =
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base_name.value()[base_name.value().length() - 1];
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dotfile
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (first_character == '.') {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Emacs backup file
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (last_character == '~') {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Emacs auto-save file
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (first_character == '#' && last_character == '#') {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It's correct that we use file_path, not base_name, here, because we
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are working with the actual file.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD file_attributes = ::GetFileAttributes(file_path.value().c_str());
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (file_attributes == INVALID_FILE_ATTRIBUTES) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((file_attributes & FILE_ATTRIBUTE_HIDDEN) != 0) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
77