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 3 // found in the LICENSE file. 4 5 #ifndef EXTENSIONS_BROWSER_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_ACTION_H_ 6 #define EXTENSIONS_BROWSER_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_ACTION_H_ 7 8 #include <list> 9 #include <string> 10 #include <vector> 11 12 #include "base/compiler_specific.h" 13 #include "base/memory/linked_ptr.h" 14 #include "base/memory/ref_counted.h" 15 #include "extensions/browser/api/declarative/declarative_rule.h" 16 #include "extensions/browser/api/declarative_webrequest/request_stage.h" 17 #include "extensions/browser/api/web_request/web_request_api_helpers.h" 18 #include "extensions/common/api/events.h" 19 #include "url/gurl.h" 20 21 class WebRequestPermission; 22 23 namespace base { 24 class DictionaryValue; 25 class Time; 26 class Value; 27 } 28 29 namespace extension_web_request_api_helpers { 30 struct EventResponseDelta; 31 } 32 33 namespace extensions { 34 class Extension; 35 class InfoMap; 36 struct WebRequestData; 37 } 38 39 namespace net { 40 class URLRequest; 41 } 42 43 namespace re2 { 44 class RE2; 45 } 46 47 namespace extensions { 48 49 typedef linked_ptr<extension_web_request_api_helpers::EventResponseDelta> 50 LinkedPtrEventResponseDelta; 51 52 // Base class for all WebRequestActions of the declarative Web Request API. 53 class WebRequestAction : public base::RefCounted<WebRequestAction> { 54 public: 55 // Type identifiers for concrete WebRequestActions. If you add a new type, 56 // also update the unittest WebRequestActionTest.GetName, and add a 57 // WebRequestActionWithThreadsTest.Permission* unittest. 58 enum Type { 59 ACTION_CANCEL_REQUEST, 60 ACTION_REDIRECT_REQUEST, 61 ACTION_REDIRECT_TO_TRANSPARENT_IMAGE, 62 ACTION_REDIRECT_TO_EMPTY_DOCUMENT, 63 ACTION_REDIRECT_BY_REGEX_DOCUMENT, 64 ACTION_SET_REQUEST_HEADER, 65 ACTION_REMOVE_REQUEST_HEADER, 66 ACTION_ADD_RESPONSE_HEADER, 67 ACTION_REMOVE_RESPONSE_HEADER, 68 ACTION_IGNORE_RULES, 69 ACTION_MODIFY_REQUEST_COOKIE, 70 ACTION_MODIFY_RESPONSE_COOKIE, 71 ACTION_SEND_MESSAGE_TO_EXTENSION, 72 }; 73 74 // Strategies for checking host permissions. 75 enum HostPermissionsStrategy { 76 STRATEGY_NONE, // Do not check host permissions. 77 STRATEGY_DEFAULT, // Check for host permissions for all URLs 78 // before creating the delta. 79 STRATEGY_HOST, // Check that host permissions match the URL 80 // of the request. 81 }; 82 83 // Information necessary to decide how to apply a WebRequestAction 84 // inside a matching rule. 85 struct ApplyInfo { 86 const InfoMap* extension_info_map; 87 const WebRequestData& request_data; 88 bool crosses_incognito; 89 // Modified by each applied action: 90 std::list<LinkedPtrEventResponseDelta>* deltas; 91 std::set<std::string>* ignored_tags; 92 }; 93 94 int stages() const { 95 return stages_; 96 } 97 98 Type type() const { 99 return type_; 100 } 101 102 // Compares the Type of two WebRequestActions, needs to be overridden for 103 // parameterized types. 104 virtual bool Equals(const WebRequestAction* other) const; 105 106 // Return the JavaScript type name corresponding to type(). If there are 107 // more names, they are returned separated by a colon. 108 virtual std::string GetName() const = 0; 109 110 int minimum_priority() const { 111 return minimum_priority_; 112 } 113 114 HostPermissionsStrategy host_permissions_strategy() const { 115 return host_permissions_strategy_; 116 } 117 118 // Returns whether the specified extension has permission to execute this 119 // action on |request|. Checks the host permission if the host permissions 120 // strategy is STRATEGY_DEFAULT. 121 // |extension_info_map| may only be NULL for during testing, in which case 122 // host permissions are ignored. |crosses_incognito| specifies 123 // whether the request comes from a different profile than |extension_id| 124 // but was processed because the extension is in spanning mode. 125 virtual bool HasPermission(const InfoMap* extension_info_map, 126 const std::string& extension_id, 127 const net::URLRequest* request, 128 bool crosses_incognito) const; 129 130 // Factory method that instantiates a concrete WebRequestAction 131 // implementation according to |json_action|, the representation of the 132 // WebRequestAction as received from the extension API. 133 // Sets |error| and returns NULL in case of a semantic error that cannot 134 // be caught by schema validation. Sets |bad_message| and returns NULL 135 // in case the input is syntactically unexpected. 136 static scoped_refptr<const WebRequestAction> Create( 137 content::BrowserContext* browser_context, 138 const Extension* extension, 139 const base::Value& json_action, 140 std::string* error, 141 bool* bad_message); 142 143 // Returns a description of the modification to the request caused by 144 // this action. 145 virtual LinkedPtrEventResponseDelta CreateDelta( 146 const WebRequestData& request_data, 147 const std::string& extension_id, 148 const base::Time& extension_install_time) const = 0; 149 150 // Applies this action to a request, recording the results into 151 // apply_info.deltas. 152 void Apply(const std::string& extension_id, 153 base::Time extension_install_time, 154 ApplyInfo* apply_info) const; 155 156 protected: 157 friend class base::RefCounted<WebRequestAction>; 158 virtual ~WebRequestAction(); 159 WebRequestAction(int stages, 160 Type type, 161 int minimum_priority, 162 HostPermissionsStrategy strategy); 163 164 private: 165 // A bit vector representing a set of extensions::RequestStage during which 166 // the condition can be tested. 167 const int stages_; 168 169 const Type type_; 170 171 // The minimum priority of rules that may be evaluated after the rule 172 // containing this action. 173 const int minimum_priority_; 174 175 // Defaults to STRATEGY_DEFAULT. 176 const HostPermissionsStrategy host_permissions_strategy_; 177 }; 178 179 typedef DeclarativeActionSet<WebRequestAction> WebRequestActionSet; 180 181 // 182 // The following are concrete actions. 183 // 184 185 // Action that instructs to cancel a network request. 186 class WebRequestCancelAction : public WebRequestAction { 187 public: 188 WebRequestCancelAction(); 189 190 // Implementation of WebRequestAction: 191 virtual std::string GetName() const OVERRIDE; 192 virtual LinkedPtrEventResponseDelta CreateDelta( 193 const WebRequestData& request_data, 194 const std::string& extension_id, 195 const base::Time& extension_install_time) const OVERRIDE; 196 197 private: 198 virtual ~WebRequestCancelAction(); 199 DISALLOW_COPY_AND_ASSIGN(WebRequestCancelAction); 200 }; 201 202 // Action that instructs to redirect a network request. 203 class WebRequestRedirectAction : public WebRequestAction { 204 public: 205 explicit WebRequestRedirectAction(const GURL& redirect_url); 206 207 // Implementation of WebRequestAction: 208 virtual bool Equals(const WebRequestAction* other) const OVERRIDE; 209 virtual std::string GetName() const OVERRIDE; 210 virtual LinkedPtrEventResponseDelta CreateDelta( 211 const WebRequestData& request_data, 212 const std::string& extension_id, 213 const base::Time& extension_install_time) const OVERRIDE; 214 215 private: 216 virtual ~WebRequestRedirectAction(); 217 218 GURL redirect_url_; // Target to which the request shall be redirected. 219 220 DISALLOW_COPY_AND_ASSIGN(WebRequestRedirectAction); 221 }; 222 223 // Action that instructs to redirect a network request to a transparent image. 224 class WebRequestRedirectToTransparentImageAction : public WebRequestAction { 225 public: 226 WebRequestRedirectToTransparentImageAction(); 227 228 // Implementation of WebRequestAction: 229 virtual std::string GetName() const OVERRIDE; 230 virtual LinkedPtrEventResponseDelta CreateDelta( 231 const WebRequestData& request_data, 232 const std::string& extension_id, 233 const base::Time& extension_install_time) const OVERRIDE; 234 235 private: 236 virtual ~WebRequestRedirectToTransparentImageAction(); 237 DISALLOW_COPY_AND_ASSIGN(WebRequestRedirectToTransparentImageAction); 238 }; 239 240 241 // Action that instructs to redirect a network request to an empty document. 242 class WebRequestRedirectToEmptyDocumentAction : public WebRequestAction { 243 public: 244 WebRequestRedirectToEmptyDocumentAction(); 245 246 // Implementation of WebRequestAction: 247 virtual std::string GetName() const OVERRIDE; 248 virtual LinkedPtrEventResponseDelta CreateDelta( 249 const WebRequestData& request_data, 250 const std::string& extension_id, 251 const base::Time& extension_install_time) const OVERRIDE; 252 253 private: 254 virtual ~WebRequestRedirectToEmptyDocumentAction(); 255 DISALLOW_COPY_AND_ASSIGN(WebRequestRedirectToEmptyDocumentAction); 256 }; 257 258 // Action that instructs to redirect a network request. 259 class WebRequestRedirectByRegExAction : public WebRequestAction { 260 public: 261 // The |to_pattern| has to be passed in RE2 syntax with the exception that 262 // capture groups are referenced in Perl style ($1, $2, ...). 263 explicit WebRequestRedirectByRegExAction(scoped_ptr<re2::RE2> from_pattern, 264 const std::string& to_pattern); 265 266 // Conversion of capture group styles between Perl style ($1, $2, ...) and 267 // RE2 (\1, \2, ...). 268 static std::string PerlToRe2Style(const std::string& perl); 269 270 // Implementation of WebRequestAction: 271 virtual bool Equals(const WebRequestAction* other) const OVERRIDE; 272 virtual std::string GetName() const OVERRIDE; 273 virtual LinkedPtrEventResponseDelta CreateDelta( 274 const WebRequestData& request_data, 275 const std::string& extension_id, 276 const base::Time& extension_install_time) const OVERRIDE; 277 278 private: 279 virtual ~WebRequestRedirectByRegExAction(); 280 281 scoped_ptr<re2::RE2> from_pattern_; 282 std::string to_pattern_; 283 284 DISALLOW_COPY_AND_ASSIGN(WebRequestRedirectByRegExAction); 285 }; 286 287 // Action that instructs to set a request header. 288 class WebRequestSetRequestHeaderAction : public WebRequestAction { 289 public: 290 WebRequestSetRequestHeaderAction(const std::string& name, 291 const std::string& value); 292 293 // Implementation of WebRequestAction: 294 virtual bool Equals(const WebRequestAction* other) const OVERRIDE; 295 virtual std::string GetName() const OVERRIDE; 296 virtual LinkedPtrEventResponseDelta CreateDelta( 297 const WebRequestData& request_data, 298 const std::string& extension_id, 299 const base::Time& extension_install_time) const OVERRIDE; 300 301 private: 302 virtual ~WebRequestSetRequestHeaderAction(); 303 304 std::string name_; 305 std::string value_; 306 DISALLOW_COPY_AND_ASSIGN(WebRequestSetRequestHeaderAction); 307 }; 308 309 // Action that instructs to remove a request header. 310 class WebRequestRemoveRequestHeaderAction : public WebRequestAction { 311 public: 312 explicit WebRequestRemoveRequestHeaderAction(const std::string& name); 313 314 // Implementation of WebRequestAction: 315 virtual bool Equals(const WebRequestAction* other) const OVERRIDE; 316 virtual std::string GetName() const OVERRIDE; 317 virtual LinkedPtrEventResponseDelta CreateDelta( 318 const WebRequestData& request_data, 319 const std::string& extension_id, 320 const base::Time& extension_install_time) const OVERRIDE; 321 322 private: 323 virtual ~WebRequestRemoveRequestHeaderAction(); 324 325 std::string name_; 326 DISALLOW_COPY_AND_ASSIGN(WebRequestRemoveRequestHeaderAction); 327 }; 328 329 // Action that instructs to add a response header. 330 class WebRequestAddResponseHeaderAction : public WebRequestAction { 331 public: 332 WebRequestAddResponseHeaderAction(const std::string& name, 333 const std::string& value); 334 335 // Implementation of WebRequestAction: 336 virtual bool Equals(const WebRequestAction* other) const OVERRIDE; 337 virtual std::string GetName() const OVERRIDE; 338 virtual LinkedPtrEventResponseDelta CreateDelta( 339 const WebRequestData& request_data, 340 const std::string& extension_id, 341 const base::Time& extension_install_time) const OVERRIDE; 342 343 private: 344 virtual ~WebRequestAddResponseHeaderAction(); 345 346 std::string name_; 347 std::string value_; 348 DISALLOW_COPY_AND_ASSIGN(WebRequestAddResponseHeaderAction); 349 }; 350 351 // Action that instructs to remove a response header. 352 class WebRequestRemoveResponseHeaderAction : public WebRequestAction { 353 public: 354 explicit WebRequestRemoveResponseHeaderAction(const std::string& name, 355 const std::string& value, 356 bool has_value); 357 358 // Implementation of WebRequestAction: 359 virtual bool Equals(const WebRequestAction* other) const OVERRIDE; 360 virtual std::string GetName() const OVERRIDE; 361 virtual LinkedPtrEventResponseDelta CreateDelta( 362 const WebRequestData& request_data, 363 const std::string& extension_id, 364 const base::Time& extension_install_time) const OVERRIDE; 365 366 private: 367 virtual ~WebRequestRemoveResponseHeaderAction(); 368 369 std::string name_; 370 std::string value_; 371 bool has_value_; 372 DISALLOW_COPY_AND_ASSIGN(WebRequestRemoveResponseHeaderAction); 373 }; 374 375 // Action that instructs to ignore rules below a certain priority. 376 class WebRequestIgnoreRulesAction : public WebRequestAction { 377 public: 378 explicit WebRequestIgnoreRulesAction(int minimum_priority, 379 const std::string& ignore_tag); 380 381 // Implementation of WebRequestAction: 382 virtual bool Equals(const WebRequestAction* other) const OVERRIDE; 383 virtual std::string GetName() const OVERRIDE; 384 virtual LinkedPtrEventResponseDelta CreateDelta( 385 const WebRequestData& request_data, 386 const std::string& extension_id, 387 const base::Time& extension_install_time) const OVERRIDE; 388 const std::string& ignore_tag() const { return ignore_tag_; } 389 390 private: 391 virtual ~WebRequestIgnoreRulesAction(); 392 393 // Rules are ignored if they have a tag matching |ignore_tag_| and 394 // |ignore_tag_| is non-empty. 395 std::string ignore_tag_; 396 DISALLOW_COPY_AND_ASSIGN(WebRequestIgnoreRulesAction); 397 }; 398 399 // Action that instructs to modify (add, edit, remove) a request cookie. 400 class WebRequestRequestCookieAction : public WebRequestAction { 401 public: 402 typedef extension_web_request_api_helpers::RequestCookieModification 403 RequestCookieModification; 404 405 explicit WebRequestRequestCookieAction( 406 linked_ptr<RequestCookieModification> request_cookie_modification); 407 408 // Implementation of WebRequestAction: 409 virtual bool Equals(const WebRequestAction* other) const OVERRIDE; 410 virtual std::string GetName() const OVERRIDE; 411 virtual LinkedPtrEventResponseDelta CreateDelta( 412 const WebRequestData& request_data, 413 const std::string& extension_id, 414 const base::Time& extension_install_time) const OVERRIDE; 415 416 private: 417 virtual ~WebRequestRequestCookieAction(); 418 419 linked_ptr<RequestCookieModification> request_cookie_modification_; 420 DISALLOW_COPY_AND_ASSIGN(WebRequestRequestCookieAction); 421 }; 422 423 // Action that instructs to modify (add, edit, remove) a response cookie. 424 class WebRequestResponseCookieAction : public WebRequestAction { 425 public: 426 typedef extension_web_request_api_helpers::ResponseCookieModification 427 ResponseCookieModification; 428 429 explicit WebRequestResponseCookieAction( 430 linked_ptr<ResponseCookieModification> response_cookie_modification); 431 432 // Implementation of WebRequestAction: 433 virtual bool Equals(const WebRequestAction* other) const OVERRIDE; 434 virtual std::string GetName() const OVERRIDE; 435 virtual LinkedPtrEventResponseDelta CreateDelta( 436 const WebRequestData& request_data, 437 const std::string& extension_id, 438 const base::Time& extension_install_time) const OVERRIDE; 439 440 private: 441 virtual ~WebRequestResponseCookieAction(); 442 443 linked_ptr<ResponseCookieModification> response_cookie_modification_; 444 DISALLOW_COPY_AND_ASSIGN(WebRequestResponseCookieAction); 445 }; 446 447 // Action that triggers the chrome.declarativeWebRequest.onMessage event in 448 // the background/event/... pages of the extension. 449 class WebRequestSendMessageToExtensionAction : public WebRequestAction { 450 public: 451 explicit WebRequestSendMessageToExtensionAction(const std::string& message); 452 453 // Implementation of WebRequestAction: 454 virtual bool Equals(const WebRequestAction* other) const OVERRIDE; 455 virtual std::string GetName() const OVERRIDE; 456 virtual LinkedPtrEventResponseDelta CreateDelta( 457 const WebRequestData& request_data, 458 const std::string& extension_id, 459 const base::Time& extension_install_time) const OVERRIDE; 460 461 private: 462 virtual ~WebRequestSendMessageToExtensionAction(); 463 464 std::string message_; 465 DISALLOW_COPY_AND_ASSIGN(WebRequestSendMessageToExtensionAction); 466 }; 467 468 } // namespace extensions 469 470 #endif // EXTENSIONS_BROWSER_API_DECLARATIVE_WEBREQUEST_WEBREQUEST_ACTION_H_ 471