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

Unified Diff: net/base/sdch_manager.cc

Issue 574283006: Fix dictionary domain check problem. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | net/base/sdch_manager_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/sdch_manager.cc
diff --git a/net/base/sdch_manager.cc b/net/base/sdch_manager.cc
index 59589fb544723d386fa37019dd30a574cd8432d0..322a7b5c9d962f42eb19c1aeb4e36ba24436a176 100644
--- a/net/base/sdch_manager.cc
+++ b/net/base/sdch_manager.cc
@@ -13,6 +13,33 @@
#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
#include "net/url_request/url_request_http_job.h"
+namespace {
+
+// Canonicalize a URL from possibly containing a FQDN to the HDN format
+// specified in RFC 2965 so that trailing periods for (e.g.) domain matching
+// are not a concern.
+bool FQDNToHDN(std::string* host) {
Ryan Sleevi 2014/09/18 01:22:31 1) Naming: "HDN" is not common 2) RFC 2965 is obso
Randy Smith (Not in Mondays) 2014/09/22 19:22:10 Changed to "StripTrailingDot" and edited the expla
+ if (host->at(host->size() - 1) != '.')
Ryan Sleevi 2014/09/18 01:22:31 Why are you using at (which throws) vs [] (which d
Randy Smith (Not in Mondays) 2014/09/22 19:22:10 Because I found (*host)[] awkward and wasn't aware
+ return false;
+
+ host->resize(host->size() - 1);
+ return true;
+}
+
+void FQDNToHDNURL(GURL* gurl) {
+ std::string host(gurl->host());
+
+ if (!FQDNToHDN(&host))
+ return;
+
+ GURL::Replacements replacements;
+ replacements.SetHostStr(host);
+ *gurl = gurl->ReplaceComponents(replacements);
+ return;
+}
+
+} // namespace
+
namespace net {
//------------------------------------------------------------------------------
@@ -405,15 +432,19 @@ void SdchManager::GetVcdiffDictionary(
const GURL& referring_url,
scoped_refptr<Dictionary>* dictionary) {
DCHECK(CalledOnValidThread());
+
+ GURL referring_url_hdn(referring_url);
+ FQDNToHDNURL(&referring_url_hdn);
+
*dictionary = NULL;
DictionaryMap::iterator it = dictionaries_.find(server_hash);
if (it == dictionaries_.end()) {
return;
}
scoped_refptr<Dictionary> matching_dictionary = it->second;
- if (!IsInSupportedDomain(referring_url))
+ if (!IsInSupportedDomain(referring_url_hdn))
return;
- if (!matching_dictionary->CanUse(referring_url))
+ if (!matching_dictionary->CanUse(referring_url_hdn))
Ryan Sleevi 2014/09/18 01:22:30 1) Why do these functions use GURLs, rather than j
Randy Smith (Not in Mondays) 2014/09/22 19:22:10 I'm presuming you mean IsInSupportedDomain() and C
return;
*dictionary = matching_dictionary;
}
@@ -424,12 +455,16 @@ void SdchManager::GetVcdiffDictionary(
void SdchManager::GetAvailDictionaryList(const GURL& target_url,
std::string* list) {
DCHECK(CalledOnValidThread());
+
+ GURL target_url_hdn(target_url);
+ FQDNToHDNURL(&target_url_hdn);
+
int count = 0;
for (DictionaryMap::iterator it = dictionaries_.begin();
it != dictionaries_.end(); ++it) {
- if (!IsInSupportedDomain(target_url))
+ if (!IsInSupportedDomain(target_url_hdn))
continue;
- if (!it->second->CanAdvertise(target_url))
+ if (!it->second->CanAdvertise(target_url_hdn))
continue;
++count;
if (!list->empty())
@@ -550,10 +585,15 @@ void SdchManager::AddSdchDictionary(const std::string& dictionary_text,
line_start = line_end + 1;
}
- if (!IsInSupportedDomain(dictionary_url))
+ // Convert away from FQDN to the HDN format described in RFC 2695.
+ FQDNToHDN(&domain);
+ GURL dictionary_url_hdn(dictionary_url);
+ FQDNToHDNURL(&dictionary_url_hdn);
+
+ if (!IsInSupportedDomain(dictionary_url_hdn))
return;
- if (!Dictionary::CanSet(domain, path, ports, dictionary_url))
+ if (!Dictionary::CanSet(domain, path, ports, dictionary_url_hdn))
return;
// TODO(jar): Remove these hacks to preclude a DOS attack involving piles of
@@ -574,7 +614,7 @@ void SdchManager::AddSdchDictionary(const std::string& dictionary_text,
<< " and server hash " << server_hash;
Dictionary* dictionary =
new Dictionary(dictionary_text, header_end + 2, client_hash,
- dictionary_url, domain, path, expiration, ports);
+ dictionary_url_hdn, domain, path, expiration, ports);
dictionaries_[server_hash] = dictionary;
return;
}
« no previous file with comments | « no previous file | net/base/sdch_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698