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 |