| Index: chrome/browser/safe_browsing/protocol_manager.cc
|
| ===================================================================
|
| --- chrome/browser/safe_browsing/protocol_manager.cc (revision 51059)
|
| +++ chrome/browser/safe_browsing/protocol_manager.cc (working copy)
|
| @@ -34,26 +34,6 @@
|
| // The maximum time, in seconds, to wait for a response to an update request.
|
| static const int kSbMaxUpdateWaitSec = 10;
|
|
|
| -// Update URL for querying about the latest set of chunk updates.
|
| -static const char* const kSbUpdateUrl =
|
| - "http://safebrowsing.clients.google.com/safebrowsing/downloads?client=%s"
|
| - "&appver=%s&pver=2.2";
|
| -
|
| -// GetHash request URL for retrieving full hashes.
|
| -static const char* const kSbGetHashUrl =
|
| - "http://safebrowsing.clients.google.com/safebrowsing/gethash?client=%s"
|
| - "&appver=%s&pver=2.2";
|
| -
|
| -// New MAC client key requests URL.
|
| -static const char* const kSbNewKeyUrl =
|
| - "https://sb-ssl.google.com/safebrowsing/newkey?client=%s&appver=%s"
|
| - "&pver=2.2";
|
| -
|
| -// URL for reporting malware pages.
|
| -static const char* const kSbMalwareReportUrl =
|
| - "http://safebrowsing.clients.google.com/safebrowsing/report?evts=malblhit"
|
| - "&evtd=%s&evtr=%s&evhr=%s&client=%s&appver=%s";
|
| -
|
| // Maximum back off multiplier.
|
| static const int kSbMaxBackOff = 8;
|
|
|
| @@ -65,7 +45,10 @@
|
| const std::string& client_name,
|
| const std::string& client_key,
|
| const std::string& wrapped_key,
|
| - URLRequestContextGetter* request_context_getter)
|
| + URLRequestContextGetter* request_context_getter,
|
| + const std::string& info_url_prefix,
|
| + const std::string& mackey_url_prefix,
|
| + bool disable_auto_update)
|
| : sb_service_(sb_service),
|
| request_type_(NO_REQUEST),
|
| update_error_count_(0),
|
| @@ -80,15 +63,18 @@
|
| wrapped_key_(wrapped_key),
|
| update_size_(0),
|
| client_name_(client_name),
|
| - request_context_getter_(request_context_getter) {
|
| + request_context_getter_(request_context_getter),
|
| + info_url_prefix_(info_url_prefix),
|
| + mackey_url_prefix_(mackey_url_prefix),
|
| + disable_auto_update_(disable_auto_update) {
|
| + DCHECK(!info_url_prefix_.empty() && !mackey_url_prefix_.empty());
|
| +
|
| // Set the backoff multiplier fuzz to a random value between 0 and 1.
|
| back_off_fuzz_ = static_cast<float>(base::RandDouble());
|
| -
|
| // The first update must happen between 1-5 minutes of start up.
|
| next_update_sec_ = base::RandInt(60, kSbTimerStartIntervalSec);
|
|
|
| - scoped_ptr<FileVersionInfo> version_info(
|
| - chrome_app::GetChromeVersionInfo());
|
| + scoped_ptr<FileVersionInfo> version_info(chrome_app::GetChromeVersionInfo());
|
| if (!version_info.get())
|
| version_ = "0.1";
|
| else
|
| @@ -122,16 +108,8 @@
|
| sb_service_->HandleGetHashResults(check, full_hashes, false);
|
| return;
|
| }
|
| -
|
| - std::string url = StringPrintf(kSbGetHashUrl,
|
| - client_name_.c_str(),
|
| - version_.c_str());
|
| - if (!client_key_.empty()) {
|
| - url.append("&wrkey=");
|
| - url.append(wrapped_key_);
|
| - }
|
| -
|
| - GURL gethash_url(url);
|
| + bool use_mac = !client_key_.empty();
|
| + GURL gethash_url = GetHashUrl(use_mac);
|
| URLFetcher* fetcher = new URLFetcher(gethash_url, URLFetcher::POST, this);
|
| hash_requests_[fetcher] = check;
|
|
|
| @@ -448,14 +426,24 @@
|
| }
|
|
|
| void SafeBrowsingProtocolManager::ScheduleNextUpdate(bool back_off) {
|
| - DCHECK(next_update_sec_ > 0);
|
| + DCHECK_GT(next_update_sec_, 0);
|
|
|
| + if (disable_auto_update_) {
|
| + // Unschedule any current timer.
|
| + update_timer_.Stop();
|
| + return;
|
| + }
|
| + // Reschedule with the new update.
|
| + const int next_update = GetNextUpdateTime(back_off);
|
| + ForceScheduleNextUpdate(next_update);
|
| +}
|
| +
|
| +void SafeBrowsingProtocolManager::ForceScheduleNextUpdate(
|
| + const int next_update_msec) {
|
| + DCHECK_GE(next_update_msec, 0);
|
| // Unschedule any current timer.
|
| update_timer_.Stop();
|
| -
|
| - // Reschedule with the new update.
|
| - const int next_update = GetNextUpdateTime(back_off);
|
| - update_timer_.Start(TimeDelta::FromMilliseconds(next_update), this,
|
| + update_timer_.Start(TimeDelta::FromMilliseconds(next_update_msec), this,
|
| &SafeBrowsingProtocolManager::GetNextUpdate);
|
| }
|
|
|
| @@ -513,10 +501,7 @@
|
|
|
| ChunkUrl next_chunk = chunk_request_urls_.front();
|
| DCHECK(!next_chunk.url.empty());
|
| - if (!StartsWithASCII(next_chunk.url, "http://", false) &&
|
| - !StartsWithASCII(next_chunk.url, "https://", false))
|
| - next_chunk.url = "http://" + next_chunk.url;
|
| - GURL chunk_url(next_chunk.url);
|
| + GURL chunk_url = NextChunkUrl(next_chunk.url);
|
| request_type_ = CHUNK_REQUEST;
|
| request_.reset(new URLFetcher(chunk_url, URLFetcher::GET, this));
|
| request_->set_load_flags(net::LOAD_DISABLE_CACHE);
|
| @@ -526,9 +511,7 @@
|
| }
|
|
|
| void SafeBrowsingProtocolManager::IssueKeyRequest() {
|
| - GURL key_url(StringPrintf(kSbNewKeyUrl,
|
| - client_name_.c_str(),
|
| - version_.c_str()));
|
| + GURL key_url = MacKeyUrl();
|
| request_type_ = GETKEY_REQUEST;
|
| request_.reset(new URLFetcher(key_url, URLFetcher::GET, this));
|
| request_->set_load_flags(net::LOAD_DISABLE_CACHE);
|
| @@ -538,7 +521,7 @@
|
|
|
| void SafeBrowsingProtocolManager::OnGetChunksComplete(
|
| const std::vector<SBListChunkRanges>& lists, bool database_error) {
|
| - DCHECK(request_type_ == UPDATE_REQUEST);
|
| + DCHECK_EQ(request_type_, UPDATE_REQUEST);
|
| if (database_error) {
|
| UpdateFinished(false);
|
| ScheduleNextUpdate(false);
|
| @@ -570,15 +553,7 @@
|
| list_data.append(FormatList(
|
| SBListChunkRanges(safe_browsing_util::kMalwareList), use_mac));
|
|
|
| - std::string url = StringPrintf(kSbUpdateUrl,
|
| - client_name_.c_str(),
|
| - version_.c_str());
|
| - if (use_mac) {
|
| - url.append("&wrkey=");
|
| - url.append(wrapped_key_);
|
| - }
|
| -
|
| - GURL update_url(url);
|
| + GURL update_url = UpdateUrl(use_mac);
|
| request_.reset(new URLFetcher(update_url, URLFetcher::POST, this));
|
| request_->set_load_flags(net::LOAD_DISABLE_CACHE);
|
| request_->set_request_context(request_context_getter_);
|
| @@ -593,7 +568,7 @@
|
| // If we haven't heard back from the server with an update response, this method
|
| // will run. Close the current update session and schedule another update.
|
| void SafeBrowsingProtocolManager::UpdateResponseTimeout() {
|
| - DCHECK(request_type_ == UPDATE_REQUEST);
|
| + DCHECK_EQ(request_type_, UPDATE_REQUEST);
|
| request_.reset();
|
| UpdateFinished(false);
|
| ScheduleNextUpdate(false);
|
| @@ -613,14 +588,7 @@
|
| void SafeBrowsingProtocolManager::ReportMalware(const GURL& malware_url,
|
| const GURL& page_url,
|
| const GURL& referrer_url) {
|
| - std::string report_str = StringPrintf(
|
| - kSbMalwareReportUrl,
|
| - EscapeQueryParamValue(malware_url.spec(), true).c_str(),
|
| - EscapeQueryParamValue(page_url.spec(), true).c_str(),
|
| - EscapeQueryParamValue(referrer_url.spec(), true).c_str(),
|
| - client_name_.c_str(),
|
| - version_.c_str());
|
| - GURL report_url(report_str);
|
| + GURL report_url = MalwareReportUrl(malware_url, page_url, referrer_url);
|
| URLFetcher* report = new URLFetcher(report_url, URLFetcher::GET, this);
|
| report->set_load_flags(net::LOAD_DISABLE_CACHE);
|
| report->set_request_context(request_context_getter_);
|
| @@ -667,3 +635,67 @@
|
| update_size_ = 0;
|
| sb_service_->UpdateFinished(success);
|
| }
|
| +
|
| +std::string SafeBrowsingProtocolManager::ComposeUrl(
|
| + const std::string& prefix, const std::string& method,
|
| + const std::string& client_name, const std::string& version,
|
| + const std::string& additional_query) {
|
| + DCHECK(!prefix.empty() && !method.empty() &&
|
| + !client_name.empty() && !version.empty());
|
| + std::string url = StringPrintf("%s/%s?client=%s&appver=%s&pver=2.2",
|
| + prefix.c_str(), method.c_str(),
|
| + client_name.c_str(), version.c_str());
|
| + if (!additional_query.empty()) {
|
| + url.append(additional_query);
|
| + }
|
| + return url;
|
| +}
|
| +
|
| +GURL SafeBrowsingProtocolManager::UpdateUrl(bool use_mac) const {
|
| + std::string url = ComposeUrl(info_url_prefix_, "downloads", client_name_,
|
| + version_, additional_query_);
|
| + if (use_mac) {
|
| + url.append("&wrkey=");
|
| + url.append(wrapped_key_);
|
| + }
|
| + return GURL(url);
|
| +}
|
| +
|
| +GURL SafeBrowsingProtocolManager::GetHashUrl(bool use_mac) const {
|
| + std::string url= ComposeUrl(info_url_prefix_, "gethash", client_name_,
|
| + version_, additional_query_);
|
| + if (use_mac) {
|
| + url.append("&wrkey=");
|
| + url.append(wrapped_key_);
|
| + }
|
| + return GURL(url);
|
| +}
|
| +
|
| +GURL SafeBrowsingProtocolManager::MacKeyUrl() const {
|
| + return GURL(ComposeUrl(mackey_url_prefix_, "newkey", client_name_, version_,
|
| + additional_query_));
|
| +}
|
| +
|
| +GURL SafeBrowsingProtocolManager::MalwareReportUrl(
|
| + const GURL& malware_url, const GURL& page_url,
|
| + const GURL& referrer_url) const {
|
| + std::string url = ComposeUrl(info_url_prefix_, "report", client_name_,
|
| + version_, additional_query_);
|
| + return GURL(StringPrintf("%s&evts=malblhit&evtd=%s&evtr=%s&evhr=%s",
|
| + url.c_str(), EscapeQueryParamValue(malware_url.spec(), true).c_str(),
|
| + EscapeQueryParamValue(page_url.spec(), true).c_str(),
|
| + EscapeQueryParamValue(referrer_url.spec(), true).c_str()));
|
| +}
|
| +
|
| +GURL SafeBrowsingProtocolManager::NextChunkUrl(const std::string& url) const {
|
| + std::string next_url;
|
| + if (!StartsWithASCII(url, "http://", false) &&
|
| + !StartsWithASCII(url, "https://", false)) {
|
| + next_url = "http://" + url;
|
| + } else {
|
| + next_url = url;
|
| + }
|
| + if (!additional_query_.empty())
|
| + next_url += additional_query_;
|
| + return GURL(next_url);
|
| +}
|
|
|