| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_action
.h" | 5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_action
.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/stringprintf.h" | 11 #include "base/stringprintf.h" |
| 12 #include "base/string_util.h" | 12 #include "base/string_util.h" |
| 13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
| 14 #include "base/values.h" | 14 #include "base/values.h" |
| 15 #include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h" | 15 #include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h" |
| 16 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_consta
nts.h" | 16 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_consta
nts.h" |
| 17 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" | 17 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" |
| 18 #include "chrome/browser/extensions/api/web_request/web_request_permissions.h" |
| 18 #include "chrome/browser/extensions/extension_info_map.h" | 19 #include "chrome/browser/extensions/extension_info_map.h" |
| 19 #include "chrome/common/extensions/extension.h" | 20 #include "chrome/common/extensions/extension.h" |
| 20 #include "net/url_request/url_request.h" | 21 #include "net/url_request/url_request.h" |
| 21 | 22 |
| 22 namespace extensions { | 23 namespace extensions { |
| 23 | 24 |
| 24 namespace helpers = extension_web_request_api_helpers; | 25 namespace helpers = extension_web_request_api_helpers; |
| 25 namespace keys = declarative_webrequest_constants; | 26 namespace keys = declarative_webrequest_constants; |
| 26 | 27 |
| 27 namespace { | 28 namespace { |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 // | 192 // |
| 192 | 193 |
| 193 WebRequestAction::WebRequestAction() {} | 194 WebRequestAction::WebRequestAction() {} |
| 194 | 195 |
| 195 WebRequestAction::~WebRequestAction() {} | 196 WebRequestAction::~WebRequestAction() {} |
| 196 | 197 |
| 197 int WebRequestAction::GetMinimumPriority() const { | 198 int WebRequestAction::GetMinimumPriority() const { |
| 198 return std::numeric_limits<int>::min(); | 199 return std::numeric_limits<int>::min(); |
| 199 } | 200 } |
| 200 | 201 |
| 201 bool WebRequestAction::HasPermission(const extensions::Extension* extension, | 202 bool WebRequestAction::HasPermission(const ExtensionInfoMap* extension_info_map, |
| 202 const net::URLRequest* request) const { | 203 const std::string& extension_id, |
| 203 // TODO(battre): Consider the permission to access requests from the incognito | 204 const net::URLRequest* request, |
| 204 // profile. | 205 bool crosses_incognito) const { |
| 205 // TODO(battre): There should be a single place to check permissions for both | 206 if (WebRequestPermissions::HideRequest(request)) |
| 206 // the WebRequest API and the Declarative WebRequest API. | |
| 207 if (helpers::HideRequest(request)) | |
| 208 return false; | 207 return false; |
| 209 if (extension && !helpers::CanExtensionAccessURL(extension, request->url())) | 208 |
| 210 return false; | 209 // In unit tests we don't have an extension_info_map object here and skip host |
| 211 // System requests are passed to extensions without host permissions. | 210 // permission checks. |
| 212 // This is the same behavior as found in | 211 if (!extension_info_map) |
| 213 // ExtensionWebRequestEventRouter::GetMatchingListenersImpl. | 212 return true; |
| 213 |
| 214 return WebRequestPermissions::CanExtensionAccessURL( |
| 215 extension_info_map, extension_id, request->url(), crosses_incognito, |
| 216 ShouldEnforceHostPermissions()); |
| 217 } |
| 218 |
| 219 bool WebRequestAction::ShouldEnforceHostPermissions() const { |
| 214 return true; | 220 return true; |
| 215 } | 221 } |
| 216 | 222 |
| 217 // static | 223 // static |
| 218 scoped_ptr<WebRequestAction> WebRequestAction::Create( | 224 scoped_ptr<WebRequestAction> WebRequestAction::Create( |
| 219 const base::Value& json_action, | 225 const base::Value& json_action, |
| 220 std::string* error, | 226 std::string* error, |
| 221 bool* bad_message) { | 227 bool* bad_message) { |
| 222 *error = ""; | 228 *error = ""; |
| 223 *bad_message = false; | 229 *bad_message = false; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 WebRequestAction::Create((*i)->value(), error, bad_message); | 271 WebRequestAction::Create((*i)->value(), error, bad_message); |
| 266 if (!error->empty() || *bad_message) | 272 if (!error->empty() || *bad_message) |
| 267 return scoped_ptr<WebRequestActionSet>(NULL); | 273 return scoped_ptr<WebRequestActionSet>(NULL); |
| 268 result.push_back(make_linked_ptr(action.release())); | 274 result.push_back(make_linked_ptr(action.release())); |
| 269 } | 275 } |
| 270 | 276 |
| 271 return scoped_ptr<WebRequestActionSet>(new WebRequestActionSet(result)); | 277 return scoped_ptr<WebRequestActionSet>(new WebRequestActionSet(result)); |
| 272 } | 278 } |
| 273 | 279 |
| 274 std::list<LinkedPtrEventResponseDelta> WebRequestActionSet::CreateDeltas( | 280 std::list<LinkedPtrEventResponseDelta> WebRequestActionSet::CreateDeltas( |
| 275 const extensions::Extension* extension, | 281 const ExtensionInfoMap* extension_info_map, |
| 282 const std::string& extension_id, |
| 276 net::URLRequest* request, | 283 net::URLRequest* request, |
| 284 bool crosses_incognito, |
| 277 RequestStages request_stage, | 285 RequestStages request_stage, |
| 278 const WebRequestRule::OptionalRequestData& optional_request_data, | 286 const WebRequestRule::OptionalRequestData& optional_request_data, |
| 279 const std::string& extension_id, | |
| 280 const base::Time& extension_install_time) const { | 287 const base::Time& extension_install_time) const { |
| 281 std::list<LinkedPtrEventResponseDelta> result; | 288 std::list<LinkedPtrEventResponseDelta> result; |
| 282 for (Actions::const_iterator i = actions_.begin(); i != actions_.end(); ++i) { | 289 for (Actions::const_iterator i = actions_.begin(); i != actions_.end(); ++i) { |
| 283 if (!(*i)->HasPermission(extension, request)) | 290 if (!(*i)->HasPermission(extension_info_map, extension_id, request, |
| 291 crosses_incognito)) |
| 284 continue; | 292 continue; |
| 285 if ((*i)->GetStages() & request_stage) { | 293 if ((*i)->GetStages() & request_stage) { |
| 286 LinkedPtrEventResponseDelta delta = (*i)->CreateDelta(request, | 294 LinkedPtrEventResponseDelta delta = (*i)->CreateDelta(request, |
| 287 request_stage, optional_request_data, extension_id, | 295 request_stage, optional_request_data, extension_id, |
| 288 extension_install_time); | 296 extension_install_time); |
| 289 if (delta.get()) | 297 if (delta.get()) |
| 290 result.push_back(delta); | 298 result.push_back(delta); |
| 291 } | 299 } |
| 292 } | 300 } |
| 293 return result; | 301 return result; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 | 383 |
| 376 int WebRequestRedirectToTransparentImageAction::GetStages() const { | 384 int WebRequestRedirectToTransparentImageAction::GetStages() const { |
| 377 return ON_BEFORE_REQUEST; | 385 return ON_BEFORE_REQUEST; |
| 378 } | 386 } |
| 379 | 387 |
| 380 WebRequestAction::Type | 388 WebRequestAction::Type |
| 381 WebRequestRedirectToTransparentImageAction::GetType() const { | 389 WebRequestRedirectToTransparentImageAction::GetType() const { |
| 382 return WebRequestAction::ACTION_REDIRECT_TO_TRANSPARENT_IMAGE; | 390 return WebRequestAction::ACTION_REDIRECT_TO_TRANSPARENT_IMAGE; |
| 383 } | 391 } |
| 384 | 392 |
| 385 bool WebRequestRedirectToTransparentImageAction::HasPermission( | 393 bool WebRequestRedirectToTransparentImageAction::ShouldEnforceHostPermissions() |
| 386 const extensions::Extension* extension, | 394 const { |
| 387 const net::URLRequest* request) const { | 395 return false; |
| 388 // TODO(battre): Consider the permission to access requests from the incognito | |
| 389 // profile. | |
| 390 return true; | |
| 391 } | 396 } |
| 392 | 397 |
| 393 LinkedPtrEventResponseDelta | 398 LinkedPtrEventResponseDelta |
| 394 WebRequestRedirectToTransparentImageAction::CreateDelta( | 399 WebRequestRedirectToTransparentImageAction::CreateDelta( |
| 395 net::URLRequest* request, | 400 net::URLRequest* request, |
| 396 RequestStages request_stage, | 401 RequestStages request_stage, |
| 397 const WebRequestRule::OptionalRequestData& optional_request_data, | 402 const WebRequestRule::OptionalRequestData& optional_request_data, |
| 398 const std::string& extension_id, | 403 const std::string& extension_id, |
| 399 const base::Time& extension_install_time) const { | 404 const base::Time& extension_install_time) const { |
| 400 CHECK(request_stage & GetStages()); | 405 CHECK(request_stage & GetStages()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 416 | 421 |
| 417 int WebRequestRedirectToEmptyDocumentAction::GetStages() const { | 422 int WebRequestRedirectToEmptyDocumentAction::GetStages() const { |
| 418 return ON_BEFORE_REQUEST; | 423 return ON_BEFORE_REQUEST; |
| 419 } | 424 } |
| 420 | 425 |
| 421 WebRequestAction::Type | 426 WebRequestAction::Type |
| 422 WebRequestRedirectToEmptyDocumentAction::GetType() const { | 427 WebRequestRedirectToEmptyDocumentAction::GetType() const { |
| 423 return WebRequestAction::ACTION_REDIRECT_TO_EMPTY_DOCUMENT; | 428 return WebRequestAction::ACTION_REDIRECT_TO_EMPTY_DOCUMENT; |
| 424 } | 429 } |
| 425 | 430 |
| 426 bool WebRequestRedirectToEmptyDocumentAction::HasPermission( | 431 bool |
| 427 const extensions::Extension* extension, | 432 WebRequestRedirectToEmptyDocumentAction::ShouldEnforceHostPermissions() const { |
| 428 const net::URLRequest* request) const { | 433 return false; |
| 429 return true; | |
| 430 } | 434 } |
| 431 | 435 |
| 432 LinkedPtrEventResponseDelta | 436 LinkedPtrEventResponseDelta |
| 433 WebRequestRedirectToEmptyDocumentAction::CreateDelta( | 437 WebRequestRedirectToEmptyDocumentAction::CreateDelta( |
| 434 net::URLRequest* request, | 438 net::URLRequest* request, |
| 435 RequestStages request_stage, | 439 RequestStages request_stage, |
| 436 const WebRequestRule::OptionalRequestData& optional_request_data, | 440 const WebRequestRule::OptionalRequestData& optional_request_data, |
| 437 const std::string& extension_id, | 441 const std::string& extension_id, |
| 438 const base::Time& extension_install_time) const { | 442 const base::Time& extension_install_time) const { |
| 439 CHECK(request_stage & GetStages()); | 443 CHECK(request_stage & GetStages()); |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 737 } | 741 } |
| 738 | 742 |
| 739 WebRequestAction::Type WebRequestIgnoreRulesAction::GetType() const { | 743 WebRequestAction::Type WebRequestIgnoreRulesAction::GetType() const { |
| 740 return WebRequestAction::ACTION_IGNORE_RULES; | 744 return WebRequestAction::ACTION_IGNORE_RULES; |
| 741 } | 745 } |
| 742 | 746 |
| 743 int WebRequestIgnoreRulesAction::GetMinimumPriority() const { | 747 int WebRequestIgnoreRulesAction::GetMinimumPriority() const { |
| 744 return minimum_priority_; | 748 return minimum_priority_; |
| 745 } | 749 } |
| 746 | 750 |
| 747 bool WebRequestIgnoreRulesAction::HasPermission( | 751 bool WebRequestIgnoreRulesAction::ShouldEnforceHostPermissions() const { |
| 748 const extensions::Extension* extension, | 752 return false; |
| 749 const net::URLRequest* request) const { | |
| 750 return true; | |
| 751 } | 753 } |
| 752 | 754 |
| 753 LinkedPtrEventResponseDelta WebRequestIgnoreRulesAction::CreateDelta( | 755 LinkedPtrEventResponseDelta WebRequestIgnoreRulesAction::CreateDelta( |
| 754 net::URLRequest* request, | 756 net::URLRequest* request, |
| 755 RequestStages request_stage, | 757 RequestStages request_stage, |
| 756 const WebRequestRule::OptionalRequestData& optional_request_data, | 758 const WebRequestRule::OptionalRequestData& optional_request_data, |
| 757 const std::string& extension_id, | 759 const std::string& extension_id, |
| 758 const base::Time& extension_install_time) const { | 760 const base::Time& extension_install_time) const { |
| 759 CHECK(request_stage & GetStages()); | 761 CHECK(request_stage & GetStages()); |
| 760 return LinkedPtrEventResponseDelta(NULL); | 762 return LinkedPtrEventResponseDelta(NULL); |
| 761 } | 763 } |
| 762 | 764 |
| 763 } // namespace extensions | 765 } // namespace extensions |
| OLD | NEW |