blob: 72d8593686b8c9b74333ea580985fe6a759ef102 [file] [log] [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/domain_reliability/google_configs.h"
#include <memory>
#include "base/containers/fixed_flat_map.h"
#include "base/strings/strcat.h"
#include "base/strings/string_util.h"
#include "net/base/url_util.h"
namespace domain_reliability {
namespace {
struct GoogleConfigParams {
bool include_subdomains;
// If true, prepend a collector URL within https://|hostname|/.
bool include_origin_specific_collector;
// If true, also add a config for www.|hostname|.
//
// |include_subdomains| will be false in the extra config, but
// |include_origin_specific_collector| will be respected, and will use the
// www subdomain as the origin for the collector so it matches the config.
bool duplicate_for_www;
};
const auto kGoogleConfigs = base::MakeFixedFlatMap<std::string_view,
GoogleConfigParams>({
// Origins with subdomains and same-origin collectors. Currently, all
// origins with same-origin collectors also run collectors on their www
// subdomain. (e.g., both foo.com and www.foo.com.)
{"google.ac", {true, true, true}},
{"google.ad", {true, true, true}},
{"google.ae", {true, true, true}},
{"google.af", {true, true, true}},
{"google.ag", {true, true, true}},
{"google.al", {true, true, true}},
{"google.am", {true, true, true}},
{"google.as", {true, true, true}},
{"google.at", {true, true, true}},
{"google.az", {true, true, true}},
{"google.ba", {true, true, true}},
{"google.be", {true, true, true}},
{"google.bf", {true, true, true}},
{"google.bg", {true, true, true}},
{"google.bi", {true, true, true}},
{"google.bj", {true, true, true}},
{"google.bs", {true, true, true}},
{"google.bt", {true, true, true}},
{"google.by", {true, true, true}},
{"google.ca", {true, true, true}},
{"google.cc", {true, true, true}},
{"google.cd", {true, true, true}},
{"google.cf", {true, true, true}},
{"google.cg", {true, true, true}},
{"google.ch", {true, true, true}},
{"google.ci", {true, true, true}},
{"google.cl", {true, true, true}},
{"google.cm", {true, true, true}},
{"google.cn", {true, true, true}},
{"google.co.ao", {true, true, true}},
{"google.co.bw", {true, true, true}},
{"google.co.ck", {true, true, true}},
{"google.co.cr", {true, true, true}},
{"google.co.hu", {true, true, true}},
{"google.co.id", {true, true, true}},
{"google.co.il", {true, true, true}},
{"google.co.im", {true, true, true}},
{"google.co.in", {true, true, true}},
{"google.co.je", {true, true, true}},
{"google.co.jp", {true, true, true}},
{"google.co.ke", {true, true, true}},
{"google.co.kr", {true, true, true}},
{"google.co.ls", {true, true, true}},
{"google.co.ma", {true, true, true}},
{"google.co.mz", {true, true, true}},
{"google.co.nz", {true, true, true}},
{"google.co.th", {true, true, true}},
{"google.co.tz", {true, true, true}},
{"google.co.ug", {true, true, true}},
{"google.co.uk", {true, true, true}},
{"google.co.uz", {true, true, true}},
{"google.co.ve", {true, true, true}},
{"google.co.vi", {true, true, true}},
{"google.co.za", {true, true, true}},
{"google.co.zm", {true, true, true}},
{"google.co.zw", {true, true, true}},
{"google.com.af", {true, true, true}},
{"google.com.ag", {true, true, true}},
{"google.com.ai", {true, true, true}},
{"google.com.ar", {true, true, true}},
{"google.com.au", {true, true, true}},
{"google.com.bd", {true, true, true}},
{"google.com.bh", {true, true, true}},
{"google.com.bn", {true, true, true}},
{"google.com.bo", {true, true, true}},
{"google.com.br", {true, true, true}},
{"google.com.by", {true, true, true}},
{"google.com.bz", {true, true, true}},
{"google.com.cn", {true, true, true}},
{"google.com.co", {true, true, true}},
{"google.com.cu", {true, true, true}},
{"google.com.cy", {true, true, true}},
{"google.com.do", {true, true, true}},
{"google.com.ec", {true, true, true}},
{"google.com.eg", {true, true, true}},
{"google.com.et", {true, true, true}},
{"google.com.fj", {true, true, true}},
{"google.com.ge", {true, true, true}},
{"google.com.gh", {true, true, true}},
{"google.com.gi", {true, true, true}},
{"google.com.gr", {true, true, true}},
{"google.com.gt", {true, true, true}},
{"google.com.hk", {true, true, true}},
{"google.com.iq", {true, true, true}},
{"google.com.jm", {true, true, true}},
{"google.com.jo", {true, true, true}},
{"google.com.kh", {true, true, true}},
{"google.com.kw", {true, true, true}},
{"google.com.lb", {true, true, true}},
{"google.com.ly", {true, true, true}},
{"google.com.mm", {true, true, true}},
{"google.com.mt", {true, true, true}},
{"google.com.mx", {true, true, true}},
{"google.com.my", {true, true, true}},
{"google.com.na", {true, true, true}},
{"google.com.nf", {true, true, true}},
{"google.com.ng", {true, true, true}},
{"google.com.ni", {true, true, true}},
{"google.com.np", {true, true, true}},
{"google.com.nr", {true, true, true}},
{"google.com.om", {true, true, true}},
{"google.com.pa", {true, true, true}},
{"google.com.pe", {true, true, true}},
{"google.com.pg", {true, true, true}},
{"google.com.ph", {true, true, true}},
{"google.com.pk", {true, true, true}},
{"google.com.pl", {true, true, true}},
{"google.com.pr", {true, true, true}},
{"google.com.py", {true, true, true}},
{"google.com.qa", {true, true, true}},
{"google.com.ru", {true, true, true}},
{"google.com.sa", {true, true, true}},
{"google.com.sb", {true, true, true}},
{"google.com.sg", {true, true, true}},
{"google.com.sl", {true, true, true}},
{"google.com.sv", {true, true, true}},
{"google.com.tj", {true, true, true}},
{"google.com.tn", {true, true, true}},
{"google.com.tr", {true, true, true}},
{"google.com.tw", {true, true, true}},
{"google.com.ua", {true, true, true}},
{"google.com.uy", {true, true, true}},
{"google.com.vc", {true, true, true}},
{"google.com.ve", {true, true, true}},
{"google.com.vn", {true, true, true}},
{"google.cv", {true, true, true}},
{"google.cz", {true, true, true}},
{"google.de", {true, true, true}},
{"google.dj", {true, true, true}},
{"google.dk", {true, true, true}},
{"google.dm", {true, true, true}},
{"google.dz", {true, true, true}},
{"google.ee", {true, true, true}},
{"google.es", {true, true, true}},
{"google.fi", {true, true, true}},
{"google.fm", {true, true, true}},
{"google.fr", {true, true, true}},
{"google.ga", {true, true, true}},
{"google.ge", {true, true, true}},
{"google.gg", {true, true, true}},
{"google.gl", {true, true, true}},
{"google.gm", {true, true, true}},
{"google.gp", {true, true, true}},
{"google.gr", {true, true, true}},
{"google.gy", {true, true, true}},
{"google.hk", {true, true, true}},
{"google.hn", {true, true, true}},
{"google.hr", {true, true, true}},
{"google.ht", {true, true, true}},
{"google.hu", {true, true, true}},
{"google.ie", {true, true, true}},
{"google.im", {true, true, true}},
{"google.iq", {true, true, true}},
{"google.ir", {true, true, true}},
{"google.is", {true, true, true}},
{"google.it", {true, true, true}},
{"google.it.ao", {true, true, true}},
{"google.je", {true, true, true}},
{"google.jo", {true, true, true}},
{"google.jp", {true, true, true}},
{"google.kg", {true, true, true}},
{"google.ki", {true, true, true}},
{"google.kz", {true, true, true}},
{"google.la", {true, true, true}},
{"google.li", {true, true, true}},
{"google.lk", {true, true, true}},
{"google.lt", {true, true, true}},
{"google.lu", {true, true, true}},
{"google.lv", {true, true, true}},
{"google.md", {true, true, true}},
{"google.me", {true, true, true}},
{"google.mg", {true, true, true}},
{"google.mk", {true, true, true}},
{"google.ml", {true, true, true}},
{"google.mn", {true, true, true}},
{"google.ms", {true, true, true}},
{"google.mu", {true, true, true}},
{"google.mv", {true, true, true}},
{"google.mw", {true, true, true}},
{"google.ne", {true, true, true}},
{"google.ne.jp", {true, true, true}},
{"google.ng", {true, true, true}},
{"google.nl", {true, true, true}},
{"google.no", {true, true, true}},
{"google.nr", {true, true, true}},
{"google.nu", {true, true, true}},
{"google.off.ai", {true, true, true}},
{"google.pk", {true, true, true}},
{"google.pl", {true, true, true}},
{"google.pn", {true, true, true}},
{"google.ps", {true, true, true}},
{"google.pt", {true, true, true}},
{"google.ro", {true, true, true}},
{"google.rs", {true, true, true}},
{"google.ru", {true, true, true}},
{"google.rw", {true, true, true}},
{"google.sc", {true, true, true}},
{"google.se", {true, true, true}},
{"google.sh", {true, true, true}},
{"google.si", {true, true, true}},
{"google.sk", {true, true, true}},
{"google.sm", {true, true, true}},
{"google.sn", {true, true, true}},
{"google.so", {true, true, true}},
{"google.sr", {true, true, true}},
{"google.st", {true, true, true}},
{"google.td", {true, true, true}},
{"google.tg", {true, true, true}},
{"google.tk", {true, true, true}},
{"google.tl", {true, true, true}},
{"google.tm", {true, true, true}},
{"google.tn", {true, true, true}},
{"google.to", {true, true, true}},
{"google.tt", {true, true, true}},
{"google.us", {true, true, true}},
{"google.uz", {true, true, true}},
{"google.vg", {true, true, true}},
{"google.vu", {true, true, true}},
{"google.ws", {true, true, true}},
{"l.google.com", {true, true, true}},
// google.com is a special case. We have a custom config for www.google.com,
// so set duplicate_for_www = false.
{"google.com", {true, true, false}},
// Origins with subdomains and without same-origin collectors.
{"2mdn.net", {true, false, false}},
{"adgoogle.net", {true, false, false}},
{"admeld.com", {true, false, false}},
{"admob.biz", {true, false, false}},
{"admob.co.in", {true, false, false}},
{"admob.co.kr", {true, false, false}},
{"admob.co.nz", {true, false, false}},
{"admob.co.uk", {true, false, false}},
{"admob.co.za", {true, false, false}},
{"admob.com", {true, false, false}},
{"admob.com.br", {true, false, false}},
{"admob.com.es", {true, false, false}},
{"admob.com.fr", {true, false, false}},
{"admob.com.mx", {true, false, false}},
{"admob.com.pt", {true, false, false}},
{"admob.de", {true, false, false}},
{"admob.dk", {true, false, false}},
{"admob.es", {true, false, false}},
{"admob.fi", {true, false, false}},
{"admob.fr", {true, false, false}},
{"admob.gr", {true, false, false}},
{"admob.hk", {true, false, false}},
{"admob.ie", {true, false, false}},
{"admob.in", {true, false, false}},
{"admob.it", {true, false, false}},
{"admob.jp", {true, false, false}},
{"admob.kr", {true, false, false}},
{"admob.mobi", {true, false, false}},
{"admob.no", {true, false, false}},
{"admob.ph", {true, false, false}},
{"admob.pt", {true, false, false}},
{"admob.sg", {true, false, false}},
{"admob.tw", {true, false, false}},
{"admob.us", {true, false, false}},
{"admob.vn", {true, false, false}},
{"adwhirl.com", {true, false, false}},
{"ampproject.com", {true, false, false}},
{"ampproject.net", {true, false, false}},
{"ampproject.org", {true, false, false}},
{"android.com", {true, false, false}},
{"cdn.ampproject.org", {true, false, false}},
{"chromecast.com", {true, false, false}},
{"chromeexperiments.com", {true, false, false}},
{"chromestatus.com", {true, false, false}},
{"chromium.org", {true, false, false}},
{"clients6.google.com", {true, false, false}},
{"cloudendpointsapis.com", {true, false, false}},
{"dartmotif.com", {true, false, false}},
{"dartsearch.net", {true, false, false}},
{"doubleclick.com", {true, false, false}},
{"doubleclick.ne.jp", {true, false, false}},
{"doubleclick.net", {true, false, false}},
{"doubleclickusercontent.com", {true, false, false}},
{"fls.doubleclick.net", {true, false, false}},
{"g.co", {true, false, false}},
{"g.doubleclick.net", {true, false, false}},
{"ggpht.com", {true, false, false}},
{"gmodules.com", {true, false, false}},
{"goo.gl", {true, false, false}},
{"google-syndication.com", {true, false, false}},
{"google.cat", {true, false, false}},
{"google.info", {true, false, false}},
{"google.jobs", {true, false, false}},
{"google.net", {true, false, false}},
{"google.org", {true, false, false}},
{"google.stackdriver.com", {true, false, false}},
{"googleadservices.com", {true, false, false}},
{"googleadsserving.cn", {true, false, false}},
{"googlealumni.com", {true, false, false}},
{"googleapis.cn", {true, false, false}},
{"googleapis.com", {true, false, false}},
{"googleapps.com", {true, false, false}},
{"googlecbs.com", {true, false, false}},
{"googlecode.com", {true, false, false}},
{"googlecommerce.com", {true, false, false}},
{"googledrive.com", {true, false, false}},
{"googleenterprise.com", {true, false, false}},
{"googlefiber.com", {true, false, false}},
{"googlefiber.net", {true, false, false}},
{"googlegoro.com", {true, false, false}},
{"googlehosted.com", {true, false, false}},
{"googlepayments.com", {true, false, false}},
{"googlesource.com", {true, false, false}},
{"googlesyndication.com", {true, false, false}},
{"googletagmanager.com", {true, false, false}},
{"googletagservices.com", {true, false, false}},
{"googleusercontent.com", {true, false, false}},
{"googlezip.net", {true, false, false}},
{"gstatic.cn", {true, false, false}},
{"gstatic.com", {true, false, false}},
{"gvt3.com", {true, false, false}},
{"gvt9.com", {true, false, false}},
{"picasa.com", {true, false, false}},
{"recaptcha.net", {true, false, false}},
{"stackdriver.com", {true, false, false}},
{"usercontent.google.com", {true, false, false}},
{"waze.com", {true, false, false}},
{"withgoogle.com", {true, false, false}},
{"youtu.be", {true, false, false}},
{"youtube-3rd-party.com", {true, false, false}},
{"youtube-nocookie.com", {true, false, false}},
{"youtube.ae", {true, false, false}},
{"youtube.al", {true, false, false}},
{"youtube.am", {true, false, false}},
{"youtube.at", {true, false, false}},
{"youtube.az", {true, false, false}},
{"youtube.ba", {true, false, false}},
{"youtube.be", {true, false, false}},
{"youtube.bg", {true, false, false}},
{"youtube.bh", {true, false, false}},
{"youtube.bo", {true, false, false}},
{"youtube.ca", {true, false, false}},
{"youtube.cat", {true, false, false}},
{"youtube.ch", {true, false, false}},
{"youtube.cl", {true, false, false}},
{"youtube.co", {true, false, false}},
{"youtube.co.ae", {true, false, false}},
{"youtube.co.at", {true, false, false}},
{"youtube.co.hu", {true, false, false}},
{"youtube.co.id", {true, false, false}},
{"youtube.co.il", {true, false, false}},
{"youtube.co.in", {true, false, false}},
{"youtube.co.jp", {true, false, false}},
{"youtube.co.ke", {true, false, false}},
{"youtube.co.kr", {true, false, false}},
{"youtube.co.ma", {true, false, false}},
{"youtube.co.nz", {true, false, false}},
{"youtube.co.th", {true, false, false}},
{"youtube.co.ug", {true, false, false}},
{"youtube.co.uk", {true, false, false}},
{"youtube.co.ve", {true, false, false}},
{"youtube.co.za", {true, false, false}},
{"youtube.com", {true, false, false}},
{"youtube.com.ar", {true, false, false}},
{"youtube.com.au", {true, false, false}},
{"youtube.com.az", {true, false, false}},
{"youtube.com.bh", {true, false, false}},
{"youtube.com.bo", {true, false, false}},
{"youtube.com.br", {true, false, false}},
{"youtube.com.by", {true, false, false}},
{"youtube.com.co", {true, false, false}},
{"youtube.com.do", {true, false, false}},
{"youtube.com.ee", {true, false, false}},
{"youtube.com.eg", {true, false, false}},
{"youtube.com.es", {true, false, false}},
{"youtube.com.gh", {true, false, false}},
{"youtube.com.gr", {true, false, false}},
{"youtube.com.gt", {true, false, false}},
{"youtube.com.hk", {true, false, false}},
{"youtube.com.hr", {true, false, false}},
{"youtube.com.jm", {true, false, false}},
{"youtube.com.jo", {true, false, false}},
{"youtube.com.kw", {true, false, false}},
{"youtube.com.lb", {true, false, false}},
{"youtube.com.lv", {true, false, false}},
{"youtube.com.mk", {true, false, false}},
{"youtube.com.mt", {true, false, false}},
{"youtube.com.mx", {true, false, false}},
{"youtube.com.my", {true, false, false}},
{"youtube.com.ng", {true, false, false}},
{"youtube.com.om", {true, false, false}},
{"youtube.com.pe", {true, false, false}},
{"youtube.com.ph", {true, false, false}},
{"youtube.com.pk", {true, false, false}},
{"youtube.com.pt", {true, false, false}},
{"youtube.com.qa", {true, false, false}},
{"youtube.com.ro", {true, false, false}},
{"youtube.com.sa", {true, false, false}},
{"youtube.com.sg", {true, false, false}},
{"youtube.com.tn", {true, false, false}},
{"youtube.com.tr", {true, false, false}},
{"youtube.com.tw", {true, false, false}},
{"youtube.com.ua", {true, false, false}},
{"youtube.com.uy", {true, false, false}},
{"youtube.com.ve", {true, false, false}},
{"youtube.cz", {true, false, false}},
{"youtube.de", {true, false, false}},
{"youtube.dk", {true, false, false}},
{"youtube.ee", {true, false, false}},
{"youtube.es", {true, false, false}},
{"youtube.fi", {true, false, false}},
{"youtube.fr", {true, false, false}},
{"youtube.ge", {true, false, false}},
{"youtube.gr", {true, false, false}},
{"youtube.gt", {true, false, false}},
{"youtube.hk", {true, false, false}},
{"youtube.hr", {true, false, false}},
{"youtube.hu", {true, false, false}},
{"youtube.ie", {true, false, false}},
{"youtube.in", {true, false, false}},
{"youtube.is", {true, false, false}},
{"youtube.it", {true, false, false}},
{"youtube.jo", {true, false, false}},
{"youtube.jp", {true, false, false}},
{"youtube.kr", {true, false, false}},
{"youtube.lk", {true, false, false}},
{"youtube.lt", {true, false, false}},
{"youtube.lv", {true, false, false}},
{"youtube.ma", {true, false, false}},
{"youtube.md", {true, false, false}},
{"youtube.me", {true, false, false}},
{"youtube.mk", {true, false, false}},
{"youtube.mx", {true, false, false}},
{"youtube.my", {true, false, false}},
{"youtube.ng", {true, false, false}},
{"youtube.nl", {true, false, false}},
{"youtube.no", {true, false, false}},
{"youtube.pe", {true, false, false}},
{"youtube.ph", {true, false, false}},
{"youtube.pk", {true, false, false}},
{"youtube.pl", {true, false, false}},
{"youtube.pr", {true, false, false}},
{"youtube.pt", {true, false, false}},
{"youtube.qa", {true, false, false}},
{"youtube.ro", {true, false, false}},
{"youtube.rs", {true, false, false}},
{"youtube.ru", {true, false, false}},
{"youtube.sa", {true, false, false}},
{"youtube.se", {true, false, false}},
{"youtube.sg", {true, false, false}},
{"youtube.si", {true, false, false}},
{"youtube.sk", {true, false, false}},
{"youtube.sn", {true, false, false}},
{"youtube.tn", {true, false, false}},
{"youtube.ua", {true, false, false}},
{"youtube.ug", {true, false, false}},
{"youtube.uy", {true, false, false}},
{"youtube.vn", {true, false, false}},
{"youtubeeducation.com", {true, false, false}},
{"youtubemobilesupport.com", {true, false, false}},
{"ytimg.com", {true, false, false}},
// Origins without subdomains and with same-origin collectors.
{"accounts.google.com", {false, true, false}},
{"apis.google.com", {false, true, false}},
{"app.google.stackdriver.com", {false, true, false}},
{"b.mail.google.com", {false, true, false}},
{"chatenabled.mail.google.com", {false, true, false}},
{"ddm.google.com", {false, true, false}},
{"gmail.com", {false, true, false}},
{"gmail.google.com", {false, true, false}},
{"mail-attachment.googleusercontent.com", {false, true, false}},
{"mail.google.com", {false, true, false}},
{"www.gmail.com", {false, true, false}},
// Origins without subdomains or same-origin collectors.
{"ad.doubleclick.net", {false, false, false}},
{"drive.google.com", {false, false, false}},
{"redirector.googlevideo.com", {false, false, false}},
});
const char* const kGoogleStandardCollectors[] = {
"https://beacons.gcp.gvt2.com/domainreliability/upload",
"https://beacons.gvt2.com/domainreliability/upload",
"https://beacons2.gvt2.com/domainreliability/upload",
"https://beacons3.gvt2.com/domainreliability/upload",
"https://beacons4.gvt2.com/domainreliability/upload",
"https://beacons5.gvt2.com/domainreliability/upload",
"https://beacons5.gvt3.com/domainreliability/upload",
"https://clients2.google.com/domainreliability/upload",
};
const char* const kGoogleOriginSpecificCollectorPathString =
"/domainreliability/upload";
std::unique_ptr<const DomainReliabilityConfig> CreateGoogleConfig(
std::string_view hostname,
const GoogleConfigParams& params,
bool is_www) {
CHECK(params.duplicate_for_www || !is_www);
bool include_subdomains = params.include_subdomains && !is_www;
auto config = std::make_unique<DomainReliabilityConfig>();
GURL url(base::StrCat({"https://", (is_www ? "www." : ""), hostname, "/"}));
config->origin = url::Origin::Create(url);
config->include_subdomains = include_subdomains;
config->collectors.clear();
if (params.include_origin_specific_collector) {
GURL::Replacements replacements;
replacements.SetPathStr(kGoogleOriginSpecificCollectorPathString);
config->collectors.push_back(
std::make_unique<GURL>(url.ReplaceComponents(replacements)));
}
for (const char* collector : kGoogleStandardCollectors) {
config->collectors.push_back(std::make_unique<GURL>(collector));
}
config->success_sample_rate = 0.05;
config->failure_sample_rate = 1.00;
config->path_prefixes.clear();
return config;
}
} // namespace
std::unique_ptr<const DomainReliabilityConfig> MaybeGetGoogleConfig(
const std::string& hostname) {
bool is_www_subdomain =
base::StartsWith(hostname, "www.", base::CompareCase::SENSITIVE);
const auto itr = kGoogleConfigs.find(hostname);
if (itr != std::end(kGoogleConfigs)) {
return CreateGoogleConfig(hostname, itr->second, /*is_www=*/false);
}
std::string hostname_parent = net::GetSuperdomain(hostname);
const auto parent_it = kGoogleConfigs.find(hostname_parent);
if (parent_it != std::end(kGoogleConfigs)) {
const GoogleConfigParams& params = parent_it->second;
if (is_www_subdomain && params.duplicate_for_www) {
return CreateGoogleConfig(hostname_parent, params, /*is_www=*/true);
}
if (params.include_subdomains) {
return CreateGoogleConfig(hostname_parent, params, /*is_www=*/false);
}
}
return nullptr;
}
std::vector<std::unique_ptr<const DomainReliabilityConfig>>
GetAllGoogleConfigsForTesting() {
std::vector<std::unique_ptr<const DomainReliabilityConfig>> configs_out;
for (const auto& [hostname, params] : kGoogleConfigs) {
configs_out.push_back(CreateGoogleConfig(hostname, params, false));
if (params.duplicate_for_www) {
configs_out.push_back(CreateGoogleConfig(hostname, params, true));
}
}
return configs_out;
}
} // namespace domain_reliability