| 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/safe_browsing/ui_manager.h" | 5 #include "chrome/browser/safe_browsing/ui_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/debug/leak_tracker.h" | 10 #include "base/debug/leak_tracker.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 // Client-side phishing detection interstitials never block the main frame | 81 // Client-side phishing detection interstitials never block the main frame |
| 82 // load, since they happen after the page is finished loading. | 82 // load, since they happen after the page is finished loading. |
| 83 if (threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL || | 83 if (threat_type == SB_THREAT_TYPE_CLIENT_SIDE_PHISHING_URL || |
| 84 threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL) { | 84 threat_type == SB_THREAT_TYPE_CLIENT_SIDE_MALWARE_URL) { |
| 85 return false; | 85 return false; |
| 86 } | 86 } |
| 87 | 87 |
| 88 return true; | 88 return true; |
| 89 } | 89 } |
| 90 | 90 |
| 91 content::NavigationEntry* |
| 92 SafeBrowsingUIManager::UnsafeResource::GetNavigationEntryForResource() const { |
| 93 WebContents* contents = |
| 94 tab_util::GetWebContentsByID(render_process_host_id, render_view_id); |
| 95 if (!contents) |
| 96 return nullptr; |
| 97 // If a safebrowsing hit occurs during main frame navigation, the navigation |
| 98 // will not be committed, and the pending navigation entry refers to the hit. |
| 99 if (IsMainPageLoadBlocked()) |
| 100 return contents->GetController().GetPendingEntry(); |
| 101 // If a safebrowsing hit occurs on a subresource load, or on a main frame |
| 102 // after the navigation is committed, the last committed navigation entry |
| 103 // refers to the page with the hit. Note that there may concurrently be an |
| 104 // unrelated pending navigation to another site, so GetActiveEntry() would be |
| 105 // wrong. |
| 106 return contents->GetController().GetLastCommittedEntry(); |
| 107 } |
| 108 |
| 91 // SafeBrowsingUIManager ------------------------------------------------------- | 109 // SafeBrowsingUIManager ------------------------------------------------------- |
| 92 | 110 |
| 93 SafeBrowsingUIManager::SafeBrowsingUIManager( | 111 SafeBrowsingUIManager::SafeBrowsingUIManager( |
| 94 const scoped_refptr<SafeBrowsingService>& service) | 112 const scoped_refptr<SafeBrowsingService>& service) |
| 95 : sb_service_(service) {} | 113 : sb_service_(service) {} |
| 96 | 114 |
| 97 SafeBrowsingUIManager::~SafeBrowsingUIManager() {} | 115 SafeBrowsingUIManager::~SafeBrowsingUIManager() {} |
| 98 | 116 |
| 99 void SafeBrowsingUIManager::StopOnIOThread(bool shutdown) { | 117 void SafeBrowsingUIManager::StopOnIOThread(bool shutdown) { |
| 100 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 118 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 DCHECK(resource.callback_thread); | 185 DCHECK(resource.callback_thread); |
| 168 resource.callback_thread->PostTask(FROM_HERE, | 186 resource.callback_thread->PostTask(FROM_HERE, |
| 169 base::Bind(resource.callback, true)); | 187 base::Bind(resource.callback, true)); |
| 170 } | 188 } |
| 171 return; | 189 return; |
| 172 } | 190 } |
| 173 | 191 |
| 174 if (resource.threat_type != SB_THREAT_TYPE_SAFE) { | 192 if (resource.threat_type != SB_THREAT_TYPE_SAFE) { |
| 175 HitReport hit_report; | 193 HitReport hit_report; |
| 176 hit_report.malicious_url = resource.url; | 194 hit_report.malicious_url = resource.url; |
| 177 hit_report.page_url = web_contents->GetURL(); | |
| 178 hit_report.is_subresource = resource.is_subresource; | 195 hit_report.is_subresource = resource.is_subresource; |
| 179 hit_report.threat_type = resource.threat_type; | 196 hit_report.threat_type = resource.threat_type; |
| 180 hit_report.threat_source = resource.threat_source; | 197 hit_report.threat_source = resource.threat_source; |
| 181 | 198 |
| 182 NavigationEntry* entry = web_contents->GetController().GetActiveEntry(); | 199 NavigationEntry* entry = resource.GetNavigationEntryForResource(); |
| 183 if (entry) | 200 if (entry) { |
| 201 hit_report.page_url = entry->GetURL(); |
| 184 hit_report.referrer_url = entry->GetReferrer().url; | 202 hit_report.referrer_url = entry->GetReferrer().url; |
| 203 } |
| 185 | 204 |
| 186 // When the malicious url is on the main frame, and resource.original_url | 205 // When the malicious url is on the main frame, and resource.original_url |
| 187 // is not the same as the resource.url, that means we have a redirect from | 206 // is not the same as the resource.url, that means we have a redirect from |
| 188 // resource.original_url to resource.url. | 207 // resource.original_url to resource.url. |
| 189 // Also, at this point, page_url points to the _previous_ page that we | 208 // Also, at this point, page_url points to the _previous_ page that we |
| 190 // were on. We replace page_url with resource.original_url and referrer | 209 // were on. We replace page_url with resource.original_url and referrer |
| 191 // with page_url. | 210 // with page_url. |
| 192 if (!resource.is_subresource && | 211 if (!resource.is_subresource && |
| 193 !resource.original_url.is_empty() && | 212 !resource.original_url.is_empty() && |
| 194 resource.original_url != resource.url) { | 213 resource.original_url != resource.url) { |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 WebContents* web_contents = tab_util::GetWebContentsByID( | 323 WebContents* web_contents = tab_util::GetWebContentsByID( |
| 305 resource.render_process_host_id, resource.render_view_id); | 324 resource.render_process_host_id, resource.render_view_id); |
| 306 | 325 |
| 307 WhitelistUrlSet* site_list = | 326 WhitelistUrlSet* site_list = |
| 308 static_cast<WhitelistUrlSet*>(web_contents->GetUserData(kWhitelistKey)); | 327 static_cast<WhitelistUrlSet*>(web_contents->GetUserData(kWhitelistKey)); |
| 309 if (!site_list) { | 328 if (!site_list) { |
| 310 site_list = new WhitelistUrlSet; | 329 site_list = new WhitelistUrlSet; |
| 311 web_contents->SetUserData(kWhitelistKey, site_list); | 330 web_contents->SetUserData(kWhitelistKey, site_list); |
| 312 } | 331 } |
| 313 | 332 |
| 314 GURL whitelisted_url(resource.is_subresource ? web_contents->GetVisibleURL() | 333 GURL whitelisted_url; |
| 315 : resource.url); | 334 if (resource.is_subresource) { |
| 335 NavigationEntry* entry = resource.GetNavigationEntryForResource(); |
| 336 if (!entry) |
| 337 return; |
| 338 whitelisted_url = entry->GetURL(); |
| 339 } else { |
| 340 whitelisted_url = resource.url; |
| 341 } |
| 342 |
| 316 site_list->Insert(whitelisted_url); | 343 site_list->Insert(whitelisted_url); |
| 317 } | 344 } |
| 318 | 345 |
| 319 // Check if the user has already ignored a SB warning for this WebContents and | 346 // Check if the user has already ignored a SB warning for this WebContents and |
| 320 // top-level domain. | 347 // top-level domain. |
| 321 bool SafeBrowsingUIManager::IsWhitelisted(const UnsafeResource& resource) { | 348 bool SafeBrowsingUIManager::IsWhitelisted(const UnsafeResource& resource) { |
| 322 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 349 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 323 WebContents* web_contents = tab_util::GetWebContentsByID( | 350 WebContents* web_contents = tab_util::GetWebContentsByID( |
| 324 resource.render_process_host_id, resource.render_view_id); | 351 resource.render_process_host_id, resource.render_view_id); |
| 325 | 352 |
| 326 GURL maybe_whitelisted_url( | 353 GURL maybe_whitelisted_url; |
| 327 resource.is_subresource ? web_contents->GetVisibleURL() : resource.url); | 354 if (resource.is_subresource) { |
| 355 NavigationEntry* entry = resource.GetNavigationEntryForResource(); |
| 356 if (!entry) |
| 357 return false; |
| 358 maybe_whitelisted_url = entry->GetURL(); |
| 359 } else { |
| 360 maybe_whitelisted_url = resource.url; |
| 361 } |
| 362 |
| 328 WhitelistUrlSet* site_list = | 363 WhitelistUrlSet* site_list = |
| 329 static_cast<WhitelistUrlSet*>(web_contents->GetUserData(kWhitelistKey)); | 364 static_cast<WhitelistUrlSet*>(web_contents->GetUserData(kWhitelistKey)); |
| 330 if (!site_list) | 365 if (!site_list) |
| 331 return false; | 366 return false; |
| 332 return site_list->Contains(maybe_whitelisted_url); | 367 return site_list->Contains(maybe_whitelisted_url); |
| 333 } | 368 } |
| 334 | 369 |
| 335 } // namespace safe_browsing | 370 } // namespace safe_browsing |
| OLD | NEW |