Index: components/safe_browsing/password_protection/password_protection_service.cc |
diff --git a/components/safe_browsing/password_protection/password_protection_service.cc b/components/safe_browsing/password_protection/password_protection_service.cc |
index d2ef322d9231a1f358fba401eebf118cb806a355..c61267f65c058fcb994b169a307d67e7308c344d 100644 |
--- a/components/safe_browsing/password_protection/password_protection_service.cc |
+++ b/components/safe_browsing/password_protection/password_protection_service.cc |
@@ -18,10 +18,13 @@ |
#include "components/safe_browsing_db/database_manager.h" |
#include "components/safe_browsing_db/v4_protocol_manager_util.h" |
#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/web_contents.h" |
#include "google_apis/google_api_keys.h" |
#include "net/base/escape.h" |
+#include "net/base/url_util.h" |
using content::BrowserThread; |
+using content::WebContents; |
using history::HistoryService; |
namespace safe_browsing { |
@@ -106,6 +109,15 @@ void PasswordProtectionService::CheckCsdWhitelistOnIOThread( |
url.is_valid() ? database_manager_->MatchCsdWhitelistUrl(url) : true; |
} |
+bool PasswordProtectionService::CanGetReputationOfURL(const GURL& url) { |
+ if (!url.is_valid() || !url.SchemeIsHTTPOrHTTPS()) |
+ return false; |
+ |
+ const std::string& hostname = url.HostNoBrackets(); |
+ return !net::IsLocalhost(hostname) && !net::IsHostnameNonUnique(hostname) && |
+ hostname.find('.') != std::string::npos; |
+} |
+ |
LoginReputationClientResponse::VerdictType |
PasswordProtectionService::GetCachedVerdict( |
const GURL& url, |
@@ -251,6 +263,7 @@ void PasswordProtectionService::CleanUpExpiredVerdicts() { |
} |
void PasswordProtectionService::StartRequest( |
+ WebContents* web_contents, |
const GURL& main_frame_url, |
const GURL& password_form_action, |
const GURL& password_form_frame_url, |
@@ -258,7 +271,8 @@ void PasswordProtectionService::StartRequest( |
LoginReputationClientRequest::TriggerType type) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
scoped_refptr<PasswordProtectionRequest> request( |
- new PasswordProtectionRequest(main_frame_url, password_form_action, |
+ new PasswordProtectionRequest(web_contents, main_frame_url, |
+ password_form_action, |
password_form_frame_url, saved_domain, type, |
this, GetRequestTimeoutInMS())); |
DCHECK(request); |
@@ -267,44 +281,39 @@ void PasswordProtectionService::StartRequest( |
} |
void PasswordProtectionService::MaybeStartPasswordFieldOnFocusRequest( |
+ WebContents* web_contents, |
const GURL& main_frame_url, |
const GURL& password_form_action, |
const GURL& password_form_frame_url) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- RequestOutcome request_outcome; |
- if (!IsPingingEnabled(kPasswordFieldOnFocusPinging, &request_outcome)) { |
- RecordPingingDisabledReason(kPasswordFieldOnFocusPinging, request_outcome); |
- return; |
- } |
- |
- // Skip URLs that we can't get a reliable reputation for. |
- if (!main_frame_url.is_valid() || !main_frame_url.SchemeIsHTTPOrHTTPS()) { |
- return; |
+ if (CanSendPing(kPasswordFieldOnFocusPinging, main_frame_url)) { |
+ StartRequest(web_contents, main_frame_url, password_form_action, |
+ password_form_frame_url, |
+ std::string(), /* saved_domain: not used for this type */ |
+ LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE); |
} |
- |
- StartRequest(main_frame_url, password_form_action, password_form_frame_url, |
- std::string(), /* saved_domain: not used for this type */ |
- LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE); |
} |
void PasswordProtectionService::MaybeStartProtectedPasswordEntryRequest( |
+ WebContents* web_contents, |
const GURL& main_frame_url, |
const std::string& saved_domain) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- RequestOutcome request_outcome; |
- if (!IsPingingEnabled(kProtectedPasswordEntryPinging, &request_outcome)) { |
- RecordPingingDisabledReason(kProtectedPasswordEntryPinging, |
- request_outcome); |
- return; |
+ if (CanSendPing(kProtectedPasswordEntryPinging, main_frame_url)) { |
+ StartRequest(web_contents, main_frame_url, GURL(), GURL(), saved_domain, |
+ LoginReputationClientRequest::PASSWORD_REUSE_EVENT); |
} |
+} |
- // Skip URLs that we can't get a reliable reputation for. |
- if (!main_frame_url.is_valid() || !main_frame_url.SchemeIsHTTPOrHTTPS()) { |
- return; |
+bool PasswordProtectionService::CanSendPing(const base::Feature& feature, |
+ const GURL& main_frame_url) { |
+ RequestOutcome request_outcome = URL_NOT_VALID_FOR_REPUTATION_COMPUTING; |
+ if (IsPingingEnabled(kPasswordFieldOnFocusPinging, &request_outcome) && |
+ CanGetReputationOfURL(main_frame_url)) { |
+ return true; |
} |
- |
- StartRequest(main_frame_url, GURL(), GURL(), saved_domain, |
- LoginReputationClientRequest::PASSWORD_REUSE_EVENT); |
+ RecordNoPingingReason(feature, request_outcome); |
+ return false; |
} |
void PasswordProtectionService::RequestFinished( |
@@ -313,9 +322,7 @@ void PasswordProtectionService::RequestFinished( |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
DCHECK(request); |
- // TODO(jialiul): We don't cache verdict for incognito mode for now. |
- // Later we may consider temporarily caching verdict. |
- if (response && !IsIncognito()) |
+ if (response) |
CacheVerdict(request->main_frame_url(), response.get(), base::Time::Now()); |
// Finished processing this request. Remove it from pending list. |
@@ -554,7 +561,7 @@ PasswordProtectionService::CreateDictionaryFromVerdict( |
return result; |
} |
-void PasswordProtectionService::RecordPingingDisabledReason( |
+void PasswordProtectionService::RecordNoPingingReason( |
const base::Feature& feature, |
RequestOutcome reason) { |
DCHECK(feature.name == kProtectedPasswordEntryPinging.name || |