Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Unified Diff: extensions/browser/content_verifier.cc

Issue 280013003: More implementation details of extension content verification (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merged latest trunk Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « extensions/browser/content_verifier.h ('k') | extensions/browser/content_verifier_delegate.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: extensions/browser/content_verifier.cc
diff --git a/extensions/browser/content_verifier.cc b/extensions/browser/content_verifier.cc
index 879ee2511fdbc340492f96173ba2522616758628..548be16fb7a655ce9dfa3f492b7577cdf09862fa 100644
--- a/extensions/browser/content_verifier.cc
+++ b/extensions/browser/content_verifier.cc
@@ -10,6 +10,9 @@
#include "base/files/file_path.h"
#include "base/metrics/field_trial.h"
#include "content/public/browser/browser_thread.h"
+#include "extensions/browser/content_hash_fetcher.h"
+#include "extensions/browser/content_hash_reader.h"
+#include "extensions/browser/content_verifier_delegate.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/common/switches.h"
@@ -22,70 +25,75 @@ const char kExperimentName[] = "ExtensionContentVerification";
namespace extensions {
ContentVerifier::ContentVerifier(content::BrowserContext* context,
- const ContentVerifierFilter& filter)
+ ContentVerifierDelegate* delegate)
: mode_(GetMode()),
- filter_(filter),
context_(context),
- observers_(new ObserverListThreadSafe<ContentVerifierObserver>) {
+ delegate_(delegate),
+ fetcher_(new ContentHashFetcher(context, delegate)) {
}
ContentVerifier::~ContentVerifier() {
}
void ContentVerifier::Start() {
+ if (mode_ >= BOOTSTRAP)
+ fetcher_->Start();
}
void ContentVerifier::Shutdown() {
- filter_.Reset();
+ fetcher_.reset();
+ delegate_.reset();
}
ContentVerifyJob* ContentVerifier::CreateJobFor(
const std::string& extension_id,
const base::FilePath& extension_root,
const base::FilePath& relative_path) {
- if (filter_.is_null())
+ if (!delegate_)
return NULL;
ExtensionRegistry* registry = ExtensionRegistry::Get(context_);
const Extension* extension =
registry->GetExtensionById(extension_id, ExtensionRegistry::EVERYTHING);
- if (!extension || !filter_.Run(extension))
+ if (!extension || !delegate_->ShouldBeVerified(*extension) ||
+ !extension->version())
return NULL;
return new ContentVerifyJob(
- extension_id,
+ new ContentHashReader(extension_id,
+ *extension->version(),
+ extension_root,
+ relative_path,
+ delegate_->PublicKey()),
base::Bind(&ContentVerifier::VerifyFailed, this, extension->id()));
}
void ContentVerifier::VerifyFailed(const std::string& extension_id,
ContentVerifyJob::FailureReason reason) {
- if (mode_ < ENFORCE)
- return;
-
- if (reason == ContentVerifyJob::NO_HASHES && mode_ < ENFORCE_STRICT) {
+ if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) {
content::BrowserThread::PostTask(
content::BrowserThread::UI,
FROM_HERE,
- base::Bind(&ContentVerifier::RequestFetch, this, extension_id));
+ base::Bind(&ContentVerifier::VerifyFailed, this, extension_id, reason));
return;
}
- // The magic of ObserverListThreadSafe will make sure that observers get
- // called on the same threads that they called AddObserver on.
- observers_->Notify(&ContentVerifierObserver::ContentVerifyFailed,
- extension_id);
-}
-
-void ContentVerifier::AddObserver(ContentVerifierObserver* observer) {
- observers_->AddObserver(observer);
-}
-
-void ContentVerifier::RemoveObserver(ContentVerifierObserver* observer) {
- observers_->RemoveObserver(observer);
-}
+ if (!delegate_ || mode_ < ENFORCE)
+ return;
-void ContentVerifier::RequestFetch(const std::string& extension_id) {
+ if (reason == ContentVerifyJob::NO_HASHES && mode_ < ENFORCE_STRICT &&
+ fetcher_.get()) {
+ // If we failed because there were no hashes yet for this extension, just
+ // request some.
+ ExtensionRegistry* registry = ExtensionRegistry::Get(context_);
+ const Extension* extension =
+ registry->GetExtensionById(extension_id, ExtensionRegistry::EVERYTHING);
+ if (extension)
+ fetcher_->DoFetch(extension);
+ return;
+ }
+ delegate_->VerifyFailed(extension_id);
}
// static
« no previous file with comments | « extensions/browser/content_verifier.h ('k') | extensions/browser/content_verifier_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698