| Index: chrome/browser/extensions/sandboxed_extension_unpacker.h
|
| diff --git a/chrome/browser/extensions/sandboxed_extension_unpacker.h b/chrome/browser/extensions/sandboxed_extension_unpacker.h
|
| index 3e2fd230b3e3e2a69d60fd41e55f0431dd7c6ff0..1ae5d6218839de4e7440536d0bd0ca95d30b65fc 100644
|
| --- a/chrome/browser/extensions/sandboxed_extension_unpacker.h
|
| +++ b/chrome/browser/extensions/sandboxed_extension_unpacker.h
|
| @@ -1,52 +1,64 @@
|
| -// Copyright (c) 2009 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_SANDBOXED_EXTENSION_UNPACKER_H_
|
| -#define CHROME_BROWSER_EXTENSIONS_SANDBOXED_EXTENSION_UNPACKER_H_
|
| -
|
| -#include <string>
|
| -
|
| -#include "base/file_path.h"
|
| -#include "base/ref_counted.h"
|
| -#include "base/scoped_temp_dir.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/utility_process_host.h"
|
| -
|
| -class Extension;
|
| -class MessageLoop;
|
| -class ResourceDispatcherHost;
|
| -
|
| -class SandboxedExtensionUnpackerClient {
|
| - public:
|
| - // temp_dir - A temporary directoy containing the results of the extension
|
| - // unpacking. The client is responsible for deleting this directory.
|
| - //
|
| - // extension_root - The path to the extension root inside of temp_dir.
|
| - //
|
| - // extension - The extension that was unpacked. The client is responsible
|
| - // for deleting this memory.
|
| - virtual void OnUnpackSuccess(const FilePath& temp_dir,
|
| - const FilePath& extension_root,
|
| - Extension* extension) = 0;
|
| - virtual void OnUnpackFailure(const std::string& error) = 0;
|
| -};
|
| -
|
| -// SandboxedExtensionUnpacker unpacks extensions from the CRX format into a
|
| -// directory. This is done in a sandboxed subprocess to protect the browser
|
| -// process from parsing complex formats like JPEG or JSON from untrusted
|
| -// sources.
|
| -//
|
| -// Unpacking an extension using this class makes minor changes to its source,
|
| -// such as transcoding all images to PNG and rewriting the manifest JSON. As
|
| -// such, it should not be used when the output is not intended to be given back
|
| -// to the author.
|
| -//
|
| -// NOTE: This class should only be used on the file thread.
|
| -
|
| -
|
| -class SandboxedExtensionUnpacker : public UtilityProcessHost::Client {
|
| - public:
|
| +// Copyright (c) 2009 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_SANDBOXED_EXTENSION_UNPACKER_H_
|
| +#define CHROME_BROWSER_EXTENSIONS_SANDBOXED_EXTENSION_UNPACKER_H_
|
| +
|
| +#include <string>
|
| +
|
| +#include "base/file_path.h"
|
| +#include "base/ref_counted.h"
|
| +#include "base/scoped_temp_dir.h"
|
| +#include "base/values.h"
|
| +#include "chrome/browser/utility_process_host.h"
|
| +
|
| +class Extension;
|
| +class MessageLoop;
|
| +class ResourceDispatcherHost;
|
| +
|
| +class SandboxedExtensionUnpackerClient
|
| + : public base::RefCountedThreadSafe<SandboxedExtensionUnpackerClient> {
|
| + public:
|
| + virtual ~SandboxedExtensionUnpackerClient(){
|
| + }
|
| +
|
| + // temp_dir - A temporary directoy containing the results of the extension
|
| + // unpacking. The client is responsible for deleting this directory.
|
| + //
|
| + // extension_root - The path to the extension root inside of temp_dir.
|
| + //
|
| + // extension - The extension that was unpacked. The client is responsible
|
| + // for deleting this memory.
|
| + virtual void OnUnpackSuccess(const FilePath& temp_dir,
|
| + const FilePath& extension_root,
|
| + Extension* extension) = 0;
|
| + virtual void OnUnpackFailure(const std::string& error) = 0;
|
| +};
|
| +
|
| +// SandboxedExtensionUnpacker unpacks extensions from the CRX format into a
|
| +// directory. This is done in a sandboxed subprocess to protect the browser
|
| +// process from parsing complex formats like JPEG or JSON from untrusted
|
| +// sources.
|
| +//
|
| +// Unpacking an extension using this class makes minor changes to its source,
|
| +// such as transcoding all images to PNG and rewriting the manifest JSON. As
|
| +// such, it should not be used when the output is not intended to be given back
|
| +// to the author.
|
| +//
|
| +//
|
| +// Lifetime management:
|
| +//
|
| +// This class is ref-counted by each call it makes to itself on another thread,
|
| +// and by UtilityProcessHost.
|
| +//
|
| +// Additionally, we hold a reference to our own client so that it lives at least
|
| +// long enough to receive the result of unpacking.
|
| +//
|
| +//
|
| +// NOTE: This class should only be used on the file thread.
|
| +class SandboxedExtensionUnpacker : public UtilityProcessHost::Client {
|
| + public:
|
| // The size of the magic character sequence at the beginning of each crx
|
| // file, in bytes. This should be a multiple of 4.
|
| static const size_t kExtensionHeaderMagicSize = 4;
|
| @@ -75,51 +87,51 @@ class SandboxedExtensionUnpacker : public UtilityProcessHost::Client {
|
| // The current version of the crx format.
|
| static const uint32 kCurrentVersion = 2;
|
|
|
| - // Unpacks the extension in |crx_path| into a temporary directory and calls
|
| - // |client| with the result. If |rdh| is provided, unpacking is done in a
|
| - // sandboxed subprocess. Otherwise, it is done in-process.
|
| - SandboxedExtensionUnpacker(const FilePath& crx_path,
|
| - ResourceDispatcherHost* rdh,
|
| - SandboxedExtensionUnpackerClient* cilent);
|
| -
|
| - // Start unpacking the extension. The client is called with the results.
|
| - void Start();
|
| -
|
| - private:
|
| - class ProcessHostClient;
|
| - friend ProcessHostClient;
|
| -
|
| - // Validates the signature of the extension and extract the key to
|
| - // |public_key_|. Returns true if the signature validates, false otherwise.
|
| - //
|
| - // NOTE: Having this method here is a bit ugly. This code should really live
|
| - // in ExtensionUnpacker as it is not specific to sandboxed unpacking. It was
|
| - // put here because we cannot run windows crypto code in the sandbox. But we
|
| - // could still have this method statically on ExtensionUnpacker so that code
|
| - // just for unpacking is there and code just for sandboxing of unpacking is
|
| - // here.
|
| - bool ValidateSignature();
|
| -
|
| - // Starts the utility process that unpacks our extension.
|
| - void StartProcessOnIOThread(const FilePath& temp_crx_path);
|
| -
|
| - // SandboxedExtensionUnpacker
|
| - void OnUnpackExtensionSucceeded(const DictionaryValue& manifest);
|
| - void OnUnpackExtensionFailed(const std::string& error_message);
|
| - void OnProcessCrashed();
|
| -
|
| - void ReportFailure(const std::string& message);
|
| - void ReportSuccess();
|
| -
|
| - FilePath crx_path_;
|
| - MessageLoop* client_loop_;
|
| - ResourceDispatcherHost* rdh_;
|
| - SandboxedExtensionUnpackerClient* client_;
|
| - ScopedTempDir temp_dir_;
|
| - FilePath extension_root_;
|
| - scoped_ptr<Extension> extension_;
|
| - bool got_response_;
|
| - std::string public_key_;
|
| -};
|
| -
|
| -#endif // CHROME_BROWSER_EXTENSIONS_SANDBOXED_EXTENSION_UNPACKER_H_
|
| + // Unpacks the extension in |crx_path| into a temporary directory and calls
|
| + // |client| with the result. If |rdh| is provided, unpacking is done in a
|
| + // sandboxed subprocess. Otherwise, it is done in-process.
|
| + SandboxedExtensionUnpacker(const FilePath& crx_path,
|
| + ResourceDispatcherHost* rdh,
|
| + SandboxedExtensionUnpackerClient* cilent);
|
| +
|
| + // Start unpacking the extension. The client is called with the results.
|
| + void Start();
|
| +
|
| + private:
|
| + class ProcessHostClient;
|
| + friend ProcessHostClient;
|
| +
|
| + // Validates the signature of the extension and extract the key to
|
| + // |public_key_|. Returns true if the signature validates, false otherwise.
|
| + //
|
| + // NOTE: Having this method here is a bit ugly. This code should really live
|
| + // in ExtensionUnpacker as it is not specific to sandboxed unpacking. It was
|
| + // put here because we cannot run windows crypto code in the sandbox. But we
|
| + // could still have this method statically on ExtensionUnpacker so that code
|
| + // just for unpacking is there and code just for sandboxing of unpacking is
|
| + // here.
|
| + bool ValidateSignature();
|
| +
|
| + // Starts the utility process that unpacks our extension.
|
| + void StartProcessOnIOThread(const FilePath& temp_crx_path);
|
| +
|
| + // SandboxedExtensionUnpacker
|
| + void OnUnpackExtensionSucceeded(const DictionaryValue& manifest);
|
| + void OnUnpackExtensionFailed(const std::string& error_message);
|
| + void OnProcessCrashed();
|
| +
|
| + void ReportFailure(const std::string& message);
|
| + void ReportSuccess();
|
| +
|
| + FilePath crx_path_;
|
| + MessageLoop* client_loop_;
|
| + ResourceDispatcherHost* rdh_;
|
| + scoped_refptr<SandboxedExtensionUnpackerClient> client_;
|
| + ScopedTempDir temp_dir_;
|
| + FilePath extension_root_;
|
| + scoped_ptr<Extension> extension_;
|
| + bool got_response_;
|
| + std::string public_key_;
|
| +};
|
| +
|
| +#endif // CHROME_BROWSER_EXTENSIONS_SANDBOXED_EXTENSION_UNPACKER_H_
|
|
|