Home | History | Annotate | Download | only in extensions
      1 // Copyright (c) 2011 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 #pragma once
      8 
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/basictypes.h"
     13 
     14 namespace crypto {
     15 class RSAPrivateKey;
     16 }
     17 
     18 class FilePath;
     19 
     20 // This class create an installable extension (.crx file) given an input
     21 // directory that contains a valid manifest.json and the extension's resources
     22 // contained within that directory. The output .crx file is always signed with a
     23 // private key that is either provided in |private_key_path| or is internal
     24 // generated randomly (and optionally written to |output_private_key_path|.
     25 class ExtensionCreator {
     26  public:
     27   ExtensionCreator() {}
     28 
     29   bool Run(const FilePath& extension_dir,
     30            const FilePath& crx_path,
     31            const FilePath& private_key_path,
     32            const FilePath& private_key_output_path);
     33 
     34   // Returns the error message that will be present if Run(...) returned false.
     35   std::string error_message() { return error_message_; }
     36 
     37  private:
     38   // Verifies input directory's existence. |extension_dir| is the source
     39   // directory that should contain all the extension resources.
     40   // |private_key_path| is the optional path to an existing private key to sign
     41   // the extension. If not provided, a random key will be created (in which case
     42   // it is written to |private_key_output_path| -- if provided).
     43   bool InitializeInput(const FilePath& extension_dir,
     44                        const FilePath& private_key_path,
     45                        const FilePath& private_key_output_path);
     46 
     47   // Reads private key from |private_key_path|.
     48   crypto::RSAPrivateKey* ReadInputKey(const FilePath& private_key_path);
     49 
     50   // Generates a key pair and writes the private key to |private_key_path|
     51   // if provided.
     52   crypto::RSAPrivateKey* GenerateKey(const FilePath& private_key_path);
     53 
     54   // Creates temporary zip file for the extension.
     55   bool CreateZip(const FilePath& extension_dir, const FilePath& temp_path,
     56                  FilePath* zip_path);
     57 
     58   // Signs the temporary zip and returns the signature.
     59   bool SignZip(const FilePath& zip_path,
     60                crypto::RSAPrivateKey* private_key,
     61                std::vector<uint8>* signature);
     62 
     63   // Export installable .crx to |crx_path|.
     64   bool WriteCRX(const FilePath& zip_path,
     65                 crypto::RSAPrivateKey* private_key,
     66                 const std::vector<uint8>& signature,
     67                 const FilePath& crx_path);
     68 
     69   // Holds a message for any error that is raised during Run(...).
     70   std::string error_message_;
     71 
     72   DISALLOW_COPY_AND_ASSIGN(ExtensionCreator);
     73 };
     74 
     75 #endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_CREATOR_H_
     76