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 |