| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_CREATOR_H_ |
| #define CHROME_BROWSER_EXTENSIONS_EXTENSION_CREATOR_H_ |
| |
| #include <stdint.h> |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "base/macros.h" |
| |
| namespace base { |
| class FilePath; |
| } |
| |
| namespace crypto { |
| class RSAPrivateKey; |
| } |
| |
| namespace extensions { |
| |
| // This class create an installable extension (.crx file) given an input |
| // directory that contains a valid manifest.json and the extension's resources |
| // contained within that directory. The output .crx file is always signed with a |
| // private key that is either provided in |private_key_path| or is internal |
| // generated randomly (and optionally written to |output_private_key_path|. |
| class ExtensionCreator { |
| public: |
| ExtensionCreator(); |
| |
| // Settings to specify treatment of special or ignorable error conditions. |
| enum RunFlags { |
| kNoRunFlags = 0x0, |
| kOverwriteCRX = 0x1, |
| kRequireModernManifestVersion = 0x2, |
| }; |
| |
| // Categories of error that may need special handling on the UI end. |
| enum ErrorType { kOtherError, kCRXExists }; |
| |
| bool Run(const base::FilePath& extension_dir, |
| const base::FilePath& crx_path, |
| const base::FilePath& private_key_path, |
| const base::FilePath& private_key_output_path, |
| int run_flags); |
| |
| // Returns the error message that will be present if Run(...) returned false. |
| std::string error_message() { return error_message_; } |
| |
| ErrorType error_type() { return error_type_; } |
| |
| private: |
| // Verifies input directory's existence. |extension_dir| is the source |
| // directory that should contain all the extension resources. |crx_path| is |
| // the path to which final crx will be written. |
| // |private_key_path| is the optional path to an existing private key to sign |
| // the extension. If not provided, a random key will be created (in which case |
| // it is written to |private_key_output_path| -- if provided). |
| // |flags| is a bitset of RunFlags values. |
| bool InitializeInput(const base::FilePath& extension_dir, |
| const base::FilePath& crx_path, |
| const base::FilePath& private_key_path, |
| const base::FilePath& private_key_output_path, |
| int run_flags); |
| |
| // Validates the manifest by trying to load the extension. |
| bool ValidateManifest(const base::FilePath& extension_dir, |
| crypto::RSAPrivateKey* key_pair, |
| int run_flags); |
| |
| // Reads private key from |private_key_path|. |
| std::unique_ptr<crypto::RSAPrivateKey> ReadInputKey( |
| const base::FilePath& private_key_path); |
| |
| // Generates a key pair and writes the private key to |private_key_path| |
| // if provided. |
| std::unique_ptr<crypto::RSAPrivateKey> GenerateKey( |
| const base::FilePath& private_key_path); |
| |
| // Creates temporary zip file for the extension. |
| bool CreateZip(const base::FilePath& extension_dir, |
| const base::FilePath& temp_path, |
| base::FilePath* zip_path); |
| |
| // Creates a CRX file at |crx_path|, signed with |private_key| and with the |
| // contents of the archive at |zip_path|. |
| bool CreateCrx(const base::FilePath& zip_path, |
| crypto::RSAPrivateKey* private_key, |
| const base::FilePath& crx_path); |
| |
| // Holds a message for any error that is raised during Run(...). |
| std::string error_message_; |
| |
| // Type of error that was raised, if any. |
| ErrorType error_type_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ExtensionCreator); |
| }; |
| |
| } // namespace extensions |
| |
| #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_CREATOR_H_ |