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)#ifndef CHROME_BROWSER_EXTENSIONS_EXTERNAL_PREF_LOADER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_EXTERNAL_PREF_LOADER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/external_loader.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A specialization of the ExternalLoader that uses a json file to
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// look up which external extensions are registered.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Instances of this class are expected to be created and destroyed on the UI
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread and they are expecting public method calls from the UI thread.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExternalPrefLoader : public ExternalLoader {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Options {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NONE = 0,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Ensure that only root can force an external install by checking
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // that all components of the path to external extensions files are
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // owned by root and not writable by any non-root user.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ENSURE_PATH_CONTROLLED_BY_ADMIN = 1 << 0
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |base_path_id| is the directory containing the external_extensions.json
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // file or the standalone extension manifest files. Relative file paths to
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension files are resolved relative to this path.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExternalPrefLoader(int base_path_id, Options options);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const base::FilePath GetBaseCrxFilePath() OVERRIDE;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  virtual ~ExternalPrefLoader() {}
4258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartLoading() OVERRIDE;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsOptionSet(Options option) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (options_ & option) != 0;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // The resource id of the base path with the information about the json
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // file containing which extensions to load.
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const int base_path_id_;
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const Options options_;
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<ExternalLoader>;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Actually searches for and loads candidate standalone extension preference
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // files in the path corresponding to |base_path_id|.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must be called on the file thread.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadOnFileThread();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extracts the information contained in an external_extension.json file
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // regarding which extensions to install. |prefs| will be modified to
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // receive the extracted extension information.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must be called from the File thread.
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ReadExternalExtensionPrefFile(base::DictionaryValue* prefs);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Extracts the information contained in standalone external extension
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // json files (<extension id>.json) regarding what external extensions
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to install. |prefs| will be modified to receive the extracted extension
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // information.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Must be called from the File thread.
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ReadStandaloneExtensionPrefFiles(base::DictionaryValue* prefs);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The path (coresponding to |base_path_id_| containing the json files
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // describing which extensions to load.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath base_path_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExternalPrefLoader);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simplified version of ExternalPrefLoader that loads the dictionary
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from json data specified in a string.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExternalTestingLoader : public ExternalLoader {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExternalTestingLoader(const std::string& json_data,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const base::FilePath& fake_base_path);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const base::FilePath GetBaseCrxFilePath() OVERRIDE;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartLoading() OVERRIDE;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<ExternalLoader>;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExternalTestingLoader();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath fake_base_path_;
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::DictionaryValue> testing_prefs_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExternalTestingLoader);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_EXTERNAL_PREF_LOADER_H_
108