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

Unified Diff: extensions/common/api/declarative_net_request/rules_manifest_info.cc

Issue 2881453002: DNR Prototype: With flatbuffers
Patch Set: -- Created 3 years, 6 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
Index: extensions/common/api/declarative_net_request/rules_manifest_info.cc
diff --git a/extensions/common/api/declarative_net_request/rules_manifest_info.cc b/extensions/common/api/declarative_net_request/rules_manifest_info.cc
new file mode 100644
index 0000000000000000000000000000000000000000..b0c984fac313d23f42835d76bef18c9243333425
--- /dev/null
+++ b/extensions/common/api/declarative_net_request/rules_manifest_info.cc
@@ -0,0 +1,109 @@
+// Copyright 2017 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.
+
+#include "extensions/common/api/declarative_net_request/rules_manifest_info.h"
+
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/memory/ptr_util.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "extensions/common/manifest_constants.h"
+#include "extensions/common/manifest_handlers/permissions_parser.h"
+#include "extensions/common/permissions/permissions_data.h"
+
+namespace extensions {
+namespace declarative_net_request {
+
+namespace {
+constexpr char kInvalidManifestKeyValue[] = "Invalid value for key %s. %s";
+constexpr char kJsonFileExtension[] = ".json";
+// TODO is this safe? Constants referring to other constants.
+const auto& kManifestKey = manifest_keys::kDeclarativeNetRequestRulesetLocation;
+}
+
+RulesManifestData::RulesManifestData(base::FilePath path)
+ : json_ruleset_path(std::move(path)) {}
+RulesManifestData::~RulesManifestData() = default;
+
+// static
+const base::FilePath* RulesManifestData::GetJSONRulesetPath(
+ const Extension* extension) {
+ Extension::ManifestData* data = extension->GetManifestData(
+ manifest_keys::kDeclarativeNetRequestRulesetLocation);
+ return data ? &(static_cast<RulesManifestData*>(data)->json_ruleset_path)
+ : nullptr;
+}
+
+RulesManifestHandler::RulesManifestHandler() = default;
+RulesManifestHandler::~RulesManifestHandler() = default;
+
+bool RulesManifestHandler::Parse(Extension* extension, base::string16* error) {
+ // TODO doing this again is redundant for files installed through CrxInstaller
+ // after installation?
+ DCHECK(extension->manifest()->HasKey(kManifestKey));
+
+ std::string json_ruleset_location;
+ if (!extension->manifest()->GetString(kManifestKey, &json_ruleset_location)) {
+ *error = base::UTF8ToUTF16(base::StringPrintf(
+ kInvalidManifestKeyValue, kManifestKey, "It should be a string."));
+ return false;
+ }
+
+ base::FilePath path(json_ruleset_location);
+ if (path.ReferencesParent()) {
+ *error = base::UTF8ToUTF16(
+ base::StringPrintf(kInvalidManifestKeyValue, kManifestKey,
+ "It should not refer the parent directory"));
+ return false;
+ }
+ if (!path.MatchesExtension(kJsonFileExtension)) {
+ *error = base::UTF8ToUTF16(base::StringPrintf(
+ kInvalidManifestKeyValue, kManifestKey, "It should be a json file."));
+ return false;
+ }
+
+ if (path.IsAbsolute()) {
+ *error = base::UTF8ToUTF16(
+ base::StringPrintf(kInvalidManifestKeyValue, kManifestKey,
+ "It should be a relative path."));
+ return false;
+ }
+
+ path = extension->path().Append(path);
+ if (!extension->path().IsParent(path)) {
+ *error = base::UTF8ToUTF16(base::StringPrintf(
+ kInvalidManifestKeyValue, kManifestKey, "Invalid path."));
+ return false;
+ }
+
+ extension->SetManifestData(
+ kManifestKey, base::MakeUnique<RulesManifestData>(std::move(path)));
+
+ // If an extension specifies a rules file, it gets the declarativeNetRequest
+ // permission implicitly.
+ PermissionsParser::AddAPIPermission(extension,
+ APIPermission::kDeclarativeNetRequest);
+ return true;
+}
+
+bool RulesManifestHandler::Validate(
+ const Extension* extension,
+ std::string* error,
+ std::vector<InstallWarning>* warnings) const {
+ const base::FilePath* json_ruleset_path =
+ declarative_net_request::RulesManifestData::GetJSONRulesetPath(extension);
+ if (base::PathExists(*json_ruleset_path))
+ return true;
+ *error = base::StringPrintf(kInvalidManifestKeyValue, kManifestKey,
+ "Invalid path.");
+ return false;
+}
+
+const std::vector<std::string> RulesManifestHandler::Keys() const {
+ return ManifestHandler::SingleKey(kManifestKey);
+}
+
+} // namespace declarative_net_request
+} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698