Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: chrome/renderer/content_settings_observer.cc

Issue 789273006: Make ContentSettingsObserver security checks work with OOPIF. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Nits Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/renderer/content_settings_observer.h" 5 #include "chrome/renderer/content_settings_observer.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/metrics/histogram.h" 8 #include "base/metrics/histogram.h"
9 #include "chrome/common/chrome_switches.h" 9 #include "chrome/common/chrome_switches.h"
10 #include "chrome/common/render_messages.h" 10 #include "chrome/common/render_messages.h"
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 static const char kGoogleDotCom[] = "google.com"; 108 static const char kGoogleDotCom[] = "google.com";
109 109
110 static bool IsHostInDomain(const std::string& host, const std::string& domain) { 110 static bool IsHostInDomain(const std::string& host, const std::string& domain) {
111 return (EndsWith(host, domain, false) && 111 return (EndsWith(host, domain, false) &&
112 (host.length() == domain.length() || 112 (host.length() == domain.length() ||
113 (host.length() > domain.length() && 113 (host.length() > domain.length() &&
114 host[host.length() - domain.length() - 1] == '.'))); 114 host[host.length() - domain.length() - 1] == '.')));
115 } 115 }
116 116
117 GURL GetOriginOrURL(const WebFrame* frame) { 117 GURL GetOriginOrURL(const WebFrame* frame) {
118 WebString top_origin = frame->top()->document().securityOrigin().toString(); 118 WebString top_origin = frame->top()->securityOrigin().toString();
markusheintz_ 2014/12/16 13:04:43 What security origin are you using for file URLs?
alexmos 2014/12/16 20:13:26 Correct, file URLs will result in a "null" origin
119 // The the |top_origin| is unique ("null") e.g., for file:// URLs. Use the 119 // The |top_origin| is unique ("null") e.g., for file:// URLs. Use the
120 // document URL as the primary URL in those cases. 120 // document URL as the primary URL in those cases.
121 // TODO(alexmos): This is broken for --site-per-process, since top() can be a
122 // WebRemoteFrame which does not have a document(), and the WebRemoteFrame's
123 // URL is not replicated.
121 if (top_origin == "null") 124 if (top_origin == "null")
122 return frame->top()->document().url(); 125 return frame->top()->document().url();
123 return GURL(top_origin); 126 return GURL(top_origin);
124 } 127 }
125 128
126 ContentSetting GetContentSettingFromRules( 129 ContentSetting GetContentSettingFromRules(
127 const ContentSettingsForOneType& rules, 130 const ContentSettingsForOneType& rules,
128 const WebFrame* frame, 131 const WebFrame* frame,
129 const GURL& secondary_url) { 132 const GURL& secondary_url) {
130 ContentSettingsForOneType::const_iterator it; 133 ContentSettingsForOneType::const_iterator it;
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 // If we start failing this DCHECK, please makes sure we don't regress 265 // If we start failing this DCHECK, please makes sure we don't regress
263 // this bug: http://code.google.com/p/chromium/issues/detail?id=79304 266 // this bug: http://code.google.com/p/chromium/issues/detail?id=79304
264 DCHECK(frame->document().securityOrigin().toString() == "null" || 267 DCHECK(frame->document().securityOrigin().toString() == "null" ||
265 !url.SchemeIs(url::kDataScheme)); 268 !url.SchemeIs(url::kDataScheme));
266 } 269 }
267 270
268 bool ContentSettingsObserver::allowDatabase(const WebString& name, 271 bool ContentSettingsObserver::allowDatabase(const WebString& name,
269 const WebString& display_name, 272 const WebString& display_name,
270 unsigned long estimated_size) { 273 unsigned long estimated_size) {
271 WebFrame* frame = render_frame()->GetWebFrame(); 274 WebFrame* frame = render_frame()->GetWebFrame();
272 if (frame->document().securityOrigin().isUnique() || 275 if (frame->securityOrigin().isUnique() ||
273 frame->top()->document().securityOrigin().isUnique()) 276 frame->top()->securityOrigin().isUnique())
274 return false; 277 return false;
275 278
276 bool result = false; 279 bool result = false;
277 Send(new ChromeViewHostMsg_AllowDatabase( 280 Send(new ChromeViewHostMsg_AllowDatabase(
278 routing_id(), GURL(frame->document().securityOrigin().toString()), 281 routing_id(), GURL(frame->securityOrigin().toString()),
279 GURL(frame->top()->document().securityOrigin().toString()), 282 GURL(frame->top()->securityOrigin().toString()), name, display_name,
280 name, display_name, &result)); 283 &result));
281 return result; 284 return result;
282 } 285 }
283 286
284 void ContentSettingsObserver::requestFileSystemAccessAsync( 287 void ContentSettingsObserver::requestFileSystemAccessAsync(
285 const WebPermissionCallbacks& callbacks) { 288 const WebPermissionCallbacks& callbacks) {
286 WebFrame* frame = render_frame()->GetWebFrame(); 289 WebFrame* frame = render_frame()->GetWebFrame();
287 if (frame->document().securityOrigin().isUnique() || 290 if (frame->securityOrigin().isUnique() ||
288 frame->top()->document().securityOrigin().isUnique()) { 291 frame->top()->securityOrigin().isUnique()) {
289 WebPermissionCallbacks permissionCallbacks(callbacks); 292 WebPermissionCallbacks permissionCallbacks(callbacks);
290 permissionCallbacks.doDeny(); 293 permissionCallbacks.doDeny();
291 return; 294 return;
292 } 295 }
293 ++current_request_id_; 296 ++current_request_id_;
294 std::pair<PermissionRequestMap::iterator, bool> insert_result = 297 std::pair<PermissionRequestMap::iterator, bool> insert_result =
295 permission_requests_.insert( 298 permission_requests_.insert(
296 std::make_pair(current_request_id_, callbacks)); 299 std::make_pair(current_request_id_, callbacks));
297 300
298 // Verify there are no duplicate insertions. 301 // Verify there are no duplicate insertions.
299 DCHECK(insert_result.second); 302 DCHECK(insert_result.second);
300 303
301 Send(new ChromeViewHostMsg_RequestFileSystemAccessAsync( 304 Send(new ChromeViewHostMsg_RequestFileSystemAccessAsync(
302 routing_id(), 305 routing_id(), current_request_id_,
303 current_request_id_, 306 GURL(frame->securityOrigin().toString()),
304 GURL(frame->document().securityOrigin().toString()), 307 GURL(frame->top()->securityOrigin().toString())));
305 GURL(frame->top()->document().securityOrigin().toString())));
306 } 308 }
307 309
308 bool ContentSettingsObserver::allowImage(bool enabled_per_settings, 310 bool ContentSettingsObserver::allowImage(bool enabled_per_settings,
309 const WebURL& image_url) { 311 const WebURL& image_url) {
310 bool allow = enabled_per_settings; 312 bool allow = enabled_per_settings;
311 if (enabled_per_settings) { 313 if (enabled_per_settings) {
312 if (is_interstitial_page_) 314 if (is_interstitial_page_)
313 return true; 315 return true;
314 316
315 if (IsWhitelistedForContentSettings(render_frame())) 317 if (IsWhitelistedForContentSettings(render_frame()))
316 return true; 318 return true;
317 319
318 if (content_setting_rules_) { 320 if (content_setting_rules_) {
319 GURL secondary_url(image_url); 321 GURL secondary_url(image_url);
320 allow = 322 allow =
321 GetContentSettingFromRules(content_setting_rules_->image_rules, 323 GetContentSettingFromRules(content_setting_rules_->image_rules,
322 render_frame()->GetWebFrame(), 324 render_frame()->GetWebFrame(),
323 secondary_url) != CONTENT_SETTING_BLOCK; 325 secondary_url) != CONTENT_SETTING_BLOCK;
324 } 326 }
325 } 327 }
326 if (!allow) 328 if (!allow)
327 DidBlockContentType(CONTENT_SETTINGS_TYPE_IMAGES); 329 DidBlockContentType(CONTENT_SETTINGS_TYPE_IMAGES);
328 return allow; 330 return allow;
329 } 331 }
330 332
331 bool ContentSettingsObserver::allowIndexedDB(const WebString& name, 333 bool ContentSettingsObserver::allowIndexedDB(const WebString& name,
332 const WebSecurityOrigin& origin) { 334 const WebSecurityOrigin& origin) {
333 WebFrame* frame = render_frame()->GetWebFrame(); 335 WebFrame* frame = render_frame()->GetWebFrame();
334 if (frame->document().securityOrigin().isUnique() || 336 if (frame->securityOrigin().isUnique() ||
335 frame->top()->document().securityOrigin().isUnique()) 337 frame->top()->securityOrigin().isUnique())
336 return false; 338 return false;
337 339
338 bool result = false; 340 bool result = false;
339 Send(new ChromeViewHostMsg_AllowIndexedDB( 341 Send(new ChromeViewHostMsg_AllowIndexedDB(
340 routing_id(), GURL(frame->document().securityOrigin().toString()), 342 routing_id(), GURL(frame->securityOrigin().toString()),
341 GURL(frame->top()->document().securityOrigin().toString()), 343 GURL(frame->top()->securityOrigin().toString()), name, &result));
342 name, &result));
343 return result; 344 return result;
344 } 345 }
345 346
346 bool ContentSettingsObserver::allowPlugins(bool enabled_per_settings) { 347 bool ContentSettingsObserver::allowPlugins(bool enabled_per_settings) {
347 return enabled_per_settings; 348 return enabled_per_settings;
348 } 349 }
349 350
350 bool ContentSettingsObserver::allowScript(bool enabled_per_settings) { 351 bool ContentSettingsObserver::allowScript(bool enabled_per_settings) {
351 if (!enabled_per_settings) 352 if (!enabled_per_settings)
352 return false; 353 return false;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 GetContentSettingFromRules(content_setting_rules_->script_rules, 391 GetContentSettingFromRules(content_setting_rules_->script_rules,
391 render_frame()->GetWebFrame(), 392 render_frame()->GetWebFrame(),
392 GURL(script_url)); 393 GURL(script_url));
393 allow = setting != CONTENT_SETTING_BLOCK; 394 allow = setting != CONTENT_SETTING_BLOCK;
394 } 395 }
395 return allow || IsWhitelistedForContentSettings(render_frame()); 396 return allow || IsWhitelistedForContentSettings(render_frame());
396 } 397 }
397 398
398 bool ContentSettingsObserver::allowStorage(bool local) { 399 bool ContentSettingsObserver::allowStorage(bool local) {
399 WebFrame* frame = render_frame()->GetWebFrame(); 400 WebFrame* frame = render_frame()->GetWebFrame();
400 if (frame->document().securityOrigin().isUnique() || 401 if (frame->securityOrigin().isUnique() ||
401 frame->top()->document().securityOrigin().isUnique()) 402 frame->top()->securityOrigin().isUnique())
402 return false; 403 return false;
403 bool result = false; 404 bool result = false;
404 405
405 StoragePermissionsKey key( 406 StoragePermissionsKey key(
406 GURL(frame->document().securityOrigin().toString()), local); 407 GURL(frame->document().securityOrigin().toString()), local);
407 std::map<StoragePermissionsKey, bool>::const_iterator permissions = 408 std::map<StoragePermissionsKey, bool>::const_iterator permissions =
408 cached_storage_permissions_.find(key); 409 cached_storage_permissions_.find(key);
409 if (permissions != cached_storage_permissions_.end()) 410 if (permissions != cached_storage_permissions_.end())
410 return permissions->second; 411 return permissions->second;
411 412
412 Send(new ChromeViewHostMsg_AllowDOMStorage( 413 Send(new ChromeViewHostMsg_AllowDOMStorage(
413 routing_id(), GURL(frame->document().securityOrigin().toString()), 414 routing_id(), GURL(frame->securityOrigin().toString()),
414 GURL(frame->top()->document().securityOrigin().toString()), 415 GURL(frame->top()->securityOrigin().toString()), local, &result));
415 local, &result));
416 cached_storage_permissions_[key] = result; 416 cached_storage_permissions_[key] = result;
417 return result; 417 return result;
418 } 418 }
419 419
420 bool ContentSettingsObserver::allowReadFromClipboard(bool default_value) { 420 bool ContentSettingsObserver::allowReadFromClipboard(bool default_value) {
421 bool allowed = false; 421 bool allowed = false;
422 #if defined(ENABLE_EXTENSIONS) 422 #if defined(ENABLE_EXTENSIONS)
423 extensions::ScriptContext* calling_context = 423 extensions::ScriptContext* calling_context =
424 extension_dispatcher_->script_context_set().GetCalling(); 424 extension_dispatcher_->script_context_set().GetCalling();
425 if (calling_context) { 425 if (calling_context) {
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
723 723
724 // If the scheme is file:, an empty file name indicates a directory listing, 724 // If the scheme is file:, an empty file name indicates a directory listing,
725 // which requires JavaScript to function properly. 725 // which requires JavaScript to function properly.
726 if (EqualsASCII(origin.protocol(), url::kFileScheme)) { 726 if (EqualsASCII(origin.protocol(), url::kFileScheme)) {
727 return document_url.SchemeIs(url::kFileScheme) && 727 return document_url.SchemeIs(url::kFileScheme) &&
728 document_url.ExtractFileName().empty(); 728 document_url.ExtractFileName().empty();
729 } 729 }
730 730
731 return false; 731 return false;
732 } 732 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698