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.
5 #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_CREATOR_H_
6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_CREATOR_H_
11 #include "base/basictypes.h"
21 namespace extensions
{
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|.
28 class ExtensionCreator
{
32 // Settings to specify treatment of special or ignorable error conditions.
36 kRequireModernManifestVersion
= 0x2,
39 // Categories of error that may need special handling on the UI end.
40 enum ErrorType
{ kOtherError
, kCRXExists
};
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
,
48 // Returns the error message that will be present if Run(...) returned false.
49 std::string
error_message() { return error_message_
; }
51 ErrorType
error_type() { return error_type_
; }
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
,
67 // Validates the manifest by trying to load the extension.
68 bool ValidateManifest(const base::FilePath
& extension_dir
,
69 crypto::RSAPrivateKey
* key_pair
,
72 // Reads private key from |private_key_path|.
73 crypto::RSAPrivateKey
* ReadInputKey(const base::FilePath
& private_key_path
);
75 // Generates a key pair and writes the private key to |private_key_path|
77 crypto::RSAPrivateKey
* GenerateKey(const base::FilePath
& private_key_path
);
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
);
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
);
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
);
94 // Holds a message for any error that is raised during Run(...).
95 std::string error_message_
;
97 // Type of error that was raised, if any.
98 ErrorType error_type_
;
100 DISALLOW_COPY_AND_ASSIGN(ExtensionCreator
);
103 } // namespace extensions
105 #endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_CREATOR_H_