| 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 WebRequestPermissions* permissions, |
| 202 const net::URLRequest* request) const { | 203 const ExtensionInfoMap* extension_info_map, |
| 203 // TODO(battre): Consider the permission to access requests from the incognito | 204 const std::string& extension_id, |
| 204 // profile. | 205 const net::URLRequest* request, |
| 205 // TODO(battre): There should be a single place to check permissions for both | 206 bool crosses_incognito) const { |
| 206 // the WebRequest API and the Declarative WebRequest API. | 207 if (WebRequestPermissions::HideRequest(request)) |
| 207 if (helpers::HideRequest(request)) | |
| 208 return false; | 208 return false; |
| 209 if (extension && !helpers::CanExtensionAccessURL(extension, request->url())) | 209 |
| 210 return false; | 210 // In unit tests we don't have a permissions object here and skip host |
| 211 // System requests are passed to extensions without host permissions. | 211 // permission checks. |
| 212 // This is the same behavior as found in | 212 if (!permissions) |
| 213 // ExtensionWebRequestEventRouter::GetMatchingListenersImpl. | 213 return true; |
| 214 |
| 215 return permissions->CanExtensionAccessURL( |
| 216 extension_info_map, extension_id, request->url(), crosses_incognito, |
| 217 GetEnforceHostPermissions()); |
| 218 } |
| 219 |
| 220 bool WebRequestAction::GetEnforceHostPermissions() const { |
| 214 return true; | 221 return true; |
| 215 } | 222 } |
| 216 | 223 |
| 217 // static | 224 // static |
| 218 scoped_ptr<WebRequestAction> WebRequestAction::Create( | 225 scoped_ptr<WebRequestAction> WebRequestAction::Create( |
| 219 const base::Value& json_action, | 226 const base::Value& json_action, |
| 220 std::string* error, | 227 std::string* error, |
| 221 bool* bad_message) { | 228 bool* bad_message) { |
| 222 *error = ""; | 229 *error = ""; |
| 223 *bad_message = false; | 230 *bad_message = false; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 WebRequestAction::Create((*i)->value(), error, bad_message); | 272 WebRequestAction::Create((*i)->value(), error, bad_message); |
| 266 if (!error->empty() || *bad_message) | 273 if (!error->empty() || *bad_message) |
| 267 return scoped_ptr<WebRequestActionSet>(NULL); | 274 return scoped_ptr<WebRequestActionSet>(NULL); |
| 268 result.push_back(make_linked_ptr(action.release())); | 275 result.push_back(make_linked_ptr(action.release())); |
| 269 } | 276 } |
| 270 | 277 |
| 271 return scoped_ptr<WebRequestActionSet>(new WebRequestActionSet(result)); | 278 return scoped_ptr<WebRequestActionSet>(new WebRequestActionSet(result)); |
| 272 } | 279 } |
| 273 | 280 |
| 274 std::list<LinkedPtrEventResponseDelta> WebRequestActionSet::CreateDeltas( | 281 std::list<LinkedPtrEventResponseDelta> WebRequestActionSet::CreateDeltas( |
| 275 const extensions::Extension* extension, | 282 const WebRequestPermissions* permissions, |
| 283 const ExtensionInfoMap* extension_info_map, |
| 284 const std::string& extension_id, |
| 276 net::URLRequest* request, | 285 net::URLRequest* request, |
| 286 bool crosses_incognito, |
| 277 RequestStages request_stage, | 287 RequestStages request_stage, |
| 278 const WebRequestRule::OptionalRequestData& optional_request_data, | 288 const WebRequestRule::OptionalRequestData& optional_request_data, |
| 279 const std::string& extension_id, | |
| 280 const base::Time& extension_install_time) const { | 289 const base::Time& extension_install_time) const { |
| 281 std::list<LinkedPtrEventResponseDelta> result; | 290 std::list<LinkedPtrEventResponseDelta> result; |
| 282 for (Actions::const_iterator i = actions_.begin(); i != actions_.end(); ++i) { | 291 for (Actions::const_iterator i = actions_.begin(); i != actions_.end(); ++i) { |
| 283 if (!(*i)->HasPermission(extension, request)) | 292 if (!(*i)->HasPermission(permissions, extension_info_map, extension_id, |
| 293 request, crosses_incognito)) |
| 284 continue; | 294 continue; |
| 285 if ((*i)->GetStages() & request_stage) { | 295 if ((*i)->GetStages() & request_stage) { |
| 286 LinkedPtrEventResponseDelta delta = (*i)->CreateDelta(request, | 296 LinkedPtrEventResponseDelta delta = (*i)->CreateDelta(request, |
| 287 request_stage, optional_request_data, extension_id, | 297 request_stage, optional_request_data, extension_id, |
| 288 extension_install_time); | 298 extension_install_time); |
| 289 if (delta.get()) | 299 if (delta.get()) |
| 290 result.push_back(delta); | 300 result.push_back(delta); |
| 291 } | 301 } |
| 292 } | 302 } |
| 293 return result; | 303 return result; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 | 385 |
| 376 int WebRequestRedirectToTransparentImageAction::GetStages() const { | 386 int WebRequestRedirectToTransparentImageAction::GetStages() const { |
| 377 return ON_BEFORE_REQUEST; | 387 return ON_BEFORE_REQUEST; |
| 378 } | 388 } |
| 379 | 389 |
| 380 WebRequestAction::Type | 390 WebRequestAction::Type |
| 381 WebRequestRedirectToTransparentImageAction::GetType() const { | 391 WebRequestRedirectToTransparentImageAction::GetType() const { |
| 382 return WebRequestAction::ACTION_REDIRECT_TO_TRANSPARENT_IMAGE; | 392 return WebRequestAction::ACTION_REDIRECT_TO_TRANSPARENT_IMAGE; |
| 383 } | 393 } |
| 384 | 394 |
| 385 bool WebRequestRedirectToTransparentImageAction::HasPermission( | 395 bool |
| 386 const extensions::Extension* extension, | 396 WebRequestRedirectToTransparentImageAction::GetEnforceHostPermissions() const { |
| 387 const net::URLRequest* request) const { | 397 return false; |
| 388 // TODO(battre): Consider the permission to access requests from the incognito | |
| 389 // profile. | |
| 390 return true; | |
| 391 } | 398 } |
| 392 | 399 |
| 393 LinkedPtrEventResponseDelta | 400 LinkedPtrEventResponseDelta |
| 394 WebRequestRedirectToTransparentImageAction::CreateDelta( | 401 WebRequestRedirectToTransparentImageAction::CreateDelta( |
| 395 net::URLRequest* request, | 402 net::URLRequest* request, |
| 396 RequestStages request_stage, | 403 RequestStages request_stage, |
| 397 const WebRequestRule::OptionalRequestData& optional_request_data, | 404 const WebRequestRule::OptionalRequestData& optional_request_data, |
| 398 const std::string& extension_id, | 405 const std::string& extension_id, |
| 399 const base::Time& extension_install_time) const { | 406 const base::Time& extension_install_time) const { |
| 400 CHECK(request_stage & GetStages()); | 407 CHECK(request_stage & GetStages()); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 416 | 423 |
| 417 int WebRequestRedirectToEmptyDocumentAction::GetStages() const { | 424 int WebRequestRedirectToEmptyDocumentAction::GetStages() const { |
| 418 return ON_BEFORE_REQUEST; | 425 return ON_BEFORE_REQUEST; |
| 419 } | 426 } |
| 420 | 427 |
| 421 WebRequestAction::Type | 428 WebRequestAction::Type |
| 422 WebRequestRedirectToEmptyDocumentAction::GetType() const { | 429 WebRequestRedirectToEmptyDocumentAction::GetType() const { |
| 423 return WebRequestAction::ACTION_REDIRECT_TO_EMPTY_DOCUMENT; | 430 return WebRequestAction::ACTION_REDIRECT_TO_EMPTY_DOCUMENT; |
| 424 } | 431 } |
| 425 | 432 |
| 426 bool WebRequestRedirectToEmptyDocumentAction::HasPermission( | 433 bool |
| 427 const extensions::Extension* extension, | 434 WebRequestRedirectToEmptyDocumentAction::GetEnforceHostPermissions() const { |
| 428 const net::URLRequest* request) const { | 435 return false; |
| 429 return true; | |
| 430 } | 436 } |
| 431 | 437 |
| 432 LinkedPtrEventResponseDelta | 438 LinkedPtrEventResponseDelta |
| 433 WebRequestRedirectToEmptyDocumentAction::CreateDelta( | 439 WebRequestRedirectToEmptyDocumentAction::CreateDelta( |
| 434 net::URLRequest* request, | 440 net::URLRequest* request, |
| 435 RequestStages request_stage, | 441 RequestStages request_stage, |
| 436 const WebRequestRule::OptionalRequestData& optional_request_data, | 442 const WebRequestRule::OptionalRequestData& optional_request_data, |
| 437 const std::string& extension_id, | 443 const std::string& extension_id, |
| 438 const base::Time& extension_install_time) const { | 444 const base::Time& extension_install_time) const { |
| 439 CHECK(request_stage & GetStages()); | 445 CHECK(request_stage & GetStages()); |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 737 } | 743 } |
| 738 | 744 |
| 739 WebRequestAction::Type WebRequestIgnoreRulesAction::GetType() const { | 745 WebRequestAction::Type WebRequestIgnoreRulesAction::GetType() const { |
| 740 return WebRequestAction::ACTION_IGNORE_RULES; | 746 return WebRequestAction::ACTION_IGNORE_RULES; |
| 741 } | 747 } |
| 742 | 748 |
| 743 int WebRequestIgnoreRulesAction::GetMinimumPriority() const { | 749 int WebRequestIgnoreRulesAction::GetMinimumPriority() const { |
| 744 return minimum_priority_; | 750 return minimum_priority_; |
| 745 } | 751 } |
| 746 | 752 |
| 747 bool WebRequestIgnoreRulesAction::HasPermission( | 753 bool WebRequestIgnoreRulesAction::GetEnforceHostPermissions() const { |
| 748 const extensions::Extension* extension, | 754 return false; |
| 749 const net::URLRequest* request) const { | |
| 750 return true; | |
| 751 } | 755 } |
| 752 | 756 |
| 753 LinkedPtrEventResponseDelta WebRequestIgnoreRulesAction::CreateDelta( | 757 LinkedPtrEventResponseDelta WebRequestIgnoreRulesAction::CreateDelta( |
| 754 net::URLRequest* request, | 758 net::URLRequest* request, |
| 755 RequestStages request_stage, | 759 RequestStages request_stage, |
| 756 const WebRequestRule::OptionalRequestData& optional_request_data, | 760 const WebRequestRule::OptionalRequestData& optional_request_data, |
| 757 const std::string& extension_id, | 761 const std::string& extension_id, |
| 758 const base::Time& extension_install_time) const { | 762 const base::Time& extension_install_time) const { |
| 759 CHECK(request_stage & GetStages()); | 763 CHECK(request_stage & GetStages()); |
| 760 return LinkedPtrEventResponseDelta(NULL); | 764 return LinkedPtrEventResponseDelta(NULL); |
| 761 } | 765 } |
| 762 | 766 |
| 763 } // namespace extensions | 767 } // namespace extensions |
| OLD | NEW |