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_BROWSER_EXTENSIONS_EXTENSION_CREATOR_H_ 6#define CHROME_BROWSER_EXTENSIONS_EXTENSION_CREATOR_H_ 7 8#include <string> 9#include <vector> 10 11#include "base/basictypes.h" 12 13namespace base { 14class FilePath; 15} 16 17namespace crypto { 18class RSAPrivateKey; 19} 20 21namespace extensions { 22 23// This class create an installable extension (.crx file) given an input 24// directory that contains a valid manifest.json and the extension's resources 25// contained within that directory. The output .crx file is always signed with a 26// private key that is either provided in |private_key_path| or is internal 27// generated randomly (and optionally written to |output_private_key_path|. 28class ExtensionCreator { 29 public: 30 ExtensionCreator(); 31 32 // Settings to specify treatment of special or ignorable error conditions. 33 enum RunFlags { 34 kNoRunFlags = 0x0, 35 kOverwriteCRX = 0x1, 36 kRequireModernManifestVersion = 0x2, 37 }; 38 39 // Categories of error that may need special handling on the UI end. 40 enum ErrorType { kOtherError, kCRXExists }; 41 42 bool Run(const base::FilePath& extension_dir, 43 const base::FilePath& crx_path, 44 const base::FilePath& private_key_path, 45 const base::FilePath& private_key_output_path, 46 int run_flags); 47 48 // Returns the error message that will be present if Run(...) returned false. 49 std::string error_message() { return error_message_; } 50 51 ErrorType error_type() { return error_type_; } 52 53 private: 54 // Verifies input directory's existence. |extension_dir| is the source 55 // directory that should contain all the extension resources. |crx_path| is 56 // the path to which final crx will be written. 57 // |private_key_path| is the optional path to an existing private key to sign 58 // the extension. If not provided, a random key will be created (in which case 59 // it is written to |private_key_output_path| -- if provided). 60 // |flags| is a bitset of RunFlags values. 61 bool InitializeInput(const base::FilePath& extension_dir, 62 const base::FilePath& crx_path, 63 const base::FilePath& private_key_path, 64 const base::FilePath& private_key_output_path, 65 int run_flags); 66 67 // Validates the manifest by trying to load the extension. 68 bool ValidateManifest(const base::FilePath& extension_dir, 69 crypto::RSAPrivateKey* key_pair, 70 int run_flags); 71 72 // Reads private key from |private_key_path|. 73 crypto::RSAPrivateKey* ReadInputKey(const base::FilePath& private_key_path); 74 75 // Generates a key pair and writes the private key to |private_key_path| 76 // if provided. 77 crypto::RSAPrivateKey* GenerateKey(const base::FilePath& private_key_path); 78 79 // Creates temporary zip file for the extension. 80 bool CreateZip(const base::FilePath& extension_dir, const base::FilePath& temp_path, 81 base::FilePath* zip_path); 82 83 // Signs the temporary zip and returns the signature. 84 bool SignZip(const base::FilePath& zip_path, 85 crypto::RSAPrivateKey* private_key, 86 std::vector<uint8>* signature); 87 88 // Export installable .crx to |crx_path|. 89 bool WriteCRX(const base::FilePath& zip_path, 90 crypto::RSAPrivateKey* private_key, 91 const std::vector<uint8>& signature, 92 const base::FilePath& crx_path); 93 94 // Holds a message for any error that is raised during Run(...). 95 std::string error_message_; 96 97 // Type of error that was raised, if any. 98 ErrorType error_type_; 99 100 DISALLOW_COPY_AND_ASSIGN(ExtensionCreator); 101}; 102 103} // namespace extensions 104 105#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_CREATOR_H_ 106