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