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 #ifndef CHROME_UTILITY_EXTENSIONS_UNPACKER_H_ 6 #define CHROME_UTILITY_EXTENSIONS_UNPACKER_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/files/file_path.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "chrome/common/extensions/manifest.h" 14 15 class SkBitmap; 16 17 namespace base { 18 class DictionaryValue; 19 } 20 21 namespace extensions { 22 23 // This class unpacks an extension. It is designed to be used in a sandboxed 24 // child process. We unpack and parse various bits of the extension, then 25 // report back to the browser process, who then transcodes the pre-parsed bits 26 // and writes them back out to disk for later use. 27 class Unpacker { 28 public: 29 Unpacker(const base::FilePath& extension_path, 30 const std::string& extension_id, 31 Manifest::Location location, 32 int creation_flags); 33 ~Unpacker(); 34 35 // Install the extension file at |extension_path|. Returns true on success. 36 // Otherwise, error_message will contain a string explaining what went wrong. 37 bool Run(); 38 39 // Write the decoded images to kDecodedImagesFilename. We do this instead 40 // of sending them over IPC, since they are so large. Returns true on 41 // success. 42 bool DumpImagesToFile(); 43 44 // Write the decoded messages to kDecodedMessageCatalogsFilename. We do this 45 // instead of sending them over IPC, since they are so large. Returns true on 46 // success. 47 bool DumpMessageCatalogsToFile(); 48 49 const string16& error_message() { return error_message_; } 50 base::DictionaryValue* parsed_manifest() { 51 return parsed_manifest_.get(); 52 } 53 base::DictionaryValue* parsed_catalogs() { return parsed_catalogs_.get(); } 54 55 private: 56 // Parse the manifest.json file inside the extension (not in the header). 57 // Caller takes ownership of return value. 58 base::DictionaryValue* ReadManifest(); 59 60 // Parse all _locales/*/messages.json files inside the extension. 61 bool ReadAllMessageCatalogs(const std::string& default_locale); 62 63 // Decodes the image at the given path and puts it in our list of decoded 64 // images. 65 bool AddDecodedImage(const base::FilePath& path); 66 67 // Parses the catalog at the given path and puts it in our list of parsed 68 // catalogs. 69 bool ReadMessageCatalog(const base::FilePath& message_path); 70 71 // Set the error message. 72 void SetError(const std::string& error); 73 void SetUTF16Error(const string16& error); 74 75 // The extension to unpack. 76 base::FilePath extension_path_; 77 78 // The extension ID if known. 79 std::string extension_id_; 80 81 // The location to use for the created extension. 82 Manifest::Location location_; 83 84 // The creation flags to use with the created extension. 85 int creation_flags_; 86 87 // The place we unpacked the extension to. 88 base::FilePath temp_install_dir_; 89 90 // The parsed version of the manifest JSON contained in the extension. 91 scoped_ptr<base::DictionaryValue> parsed_manifest_; 92 93 // A list of decoded images and the paths where those images came from. Paths 94 // are relative to the manifest file. 95 struct InternalData; 96 scoped_ptr<InternalData> internal_data_; 97 98 // Dictionary of relative paths and catalogs per path. Paths are in the form 99 // of _locales/locale, without messages.json base part. 100 scoped_ptr<base::DictionaryValue> parsed_catalogs_; 101 102 // The last error message that was set. Empty if there were no errors. 103 string16 error_message_; 104 105 DISALLOW_COPY_AND_ASSIGN(Unpacker); 106 }; 107 108 } // namespace extensions 109 110 #endif // CHROME_UTILITY_EXTENSIONS_UNPACKER_H_ 111