Index: components/signin/core/browser/signin_header_helper.cc |
diff --git a/components/signin/core/browser/signin_header_helper.cc b/components/signin/core/browser/signin_header_helper.cc |
index 578cb5806cf889ec323d359d175515b17120ffdd..355982fb438a913551b8e9939ad6ea50df1a91d5 100644 |
--- a/components/signin/core/browser/signin_header_helper.cc |
+++ b/components/signin/core/browser/signin_header_helper.cc |
@@ -26,7 +26,6 @@ namespace { |
// Dictionary of fields in a mirror response header. |
typedef std::map<std::string, std::string> MirrorResponseHeaderDictionary; |
-const char kChromeConnectedHeader[] = "X-Chrome-Connected"; |
const char kChromeManageAccountsHeader[] = "X-Chrome-Manage-Accounts"; |
const char kContinueUrlAttrName[] = "continue_url"; |
const char kEmailAttrName[] = "email"; |
@@ -100,38 +99,23 @@ std::string BuildMirrorRequestIfPossible( |
return std::string(); |
} |
- // Only set the header for Drive and Gaia always, and other Google properties |
- // if account consistency is enabled. |
- // Vasquette, which is integrated with most Google properties, needs the |
- // header to redirect certain user actions to Chrome native UI. Drive and Gaia |
- // need the header to tell if the current user is connected. The drive path is |
- // a temporary workaround until the more generic chrome.principals API is |
- // available. |
- GURL origin(url.GetOrigin()); |
- bool is_enable_account_consistency = switches::IsEnableAccountConsistency(); |
- bool is_google_url = is_enable_account_consistency && |
- (google_util::IsGoogleDomainUrl( |
- url, google_util::ALLOW_SUBDOMAIN, |
- google_util::DISALLOW_NON_STANDARD_PORTS) || |
- google_util::IsYoutubeDomainUrl( |
- url, google_util::ALLOW_SUBDOMAIN, |
- google_util::DISALLOW_NON_STANDARD_PORTS)); |
- if (!is_google_url && !IsDriveOrigin(origin) && |
- !gaia::IsGaiaSignonRealm(origin)) { |
+ // Check if url is elligible for the header. |
+ if (!signin::IsUrlEligibleForXChromeConnectedHeader(url)) |
return std::string(); |
- } |
- return base::StringPrintf(pattern, kGaiaIdAttrName, account_id.c_str(), |
- kProfileModeAttrName, |
- base::IntToString(profile_mode_mask).c_str(), |
- kEnableAccountConsistencyAttrName, |
- is_enable_account_consistency ? "true" : "false"); |
+ return base::StringPrintf( |
+ pattern, kGaiaIdAttrName, account_id.c_str(), kProfileModeAttrName, |
+ base::IntToString(profile_mode_mask).c_str(), |
+ kEnableAccountConsistencyAttrName, |
+ switches::IsEnableAccountConsistency() ? "true" : "false"); |
} |
} // namespace |
namespace signin { |
+extern const char kChromeConnectedHeader[] = "X-Chrome-Connected"; |
+ |
ManageAccountsParams::ManageAccountsParams() |
: service_type(GAIA_SERVICE_TYPE_NONE), |
email(""), |
@@ -165,20 +149,32 @@ std::string BuildMirrorRequestCookieIfPossible( |
cookie_settings, profile_mode_mask); |
} |
-bool AppendMirrorRequestHeaderIfPossible( |
- net::URLRequest* request, |
- const GURL& redirect_url, |
- const std::string& account_id, |
- const content_settings::CookieSettings* cookie_settings, |
- int profile_mode_mask) { |
- const GURL& url = redirect_url.is_empty() ? request->url() : redirect_url; |
- std::string header_value = BuildMirrorRequestIfPossible( |
- "%s=%s,%s=%s,%s=%s", url, account_id, cookie_settings, profile_mode_mask); |
- if (header_value.empty()) |
- return false; |
- request->SetExtraRequestHeaderByName(kChromeConnectedHeader, header_value, |
- false); |
- return true; |
+ bool AppendOrRemoveMirrorRequestHeaderIfPossible( |
+ net::URLRequest* request, |
+ const GURL& redirect_url, |
+ const std::string& account_id, |
+ const content_settings::CookieSettings* cookie_settings, |
+ int profile_mode_mask) { |
+ const GURL& url = redirect_url.is_empty() ? request->url() : redirect_url; |
+ std::string header_value = |
+ BuildMirrorRequestIfPossible("%s=%s,%s=%s,%s=%s", url, account_id, |
+ cookie_settings, profile_mode_mask); |
+ if (header_value.empty()) { |
+ // If the request is being redirected, and it has the x-chrome-connected |
+ // header, and current url is a Google URL, and the redirected one is not, |
+ // remove the header. |
+ if (!redirect_url.is_empty() && |
+ request->extra_request_headers().HasHeader( |
+ signin::kChromeConnectedHeader) && |
+ signin::IsUrlEligibleForXChromeConnectedHeader(request->url()) && |
+ !signin::IsUrlEligibleForXChromeConnectedHeader(redirect_url)) { |
+ request->RemoveRequestHeaderByName(signin::kChromeConnectedHeader); |
+ } |
+ return false; |
+ } |
+ request->SetExtraRequestHeaderByName(kChromeConnectedHeader, header_value, |
+ false); |
+ return true; |
} |
ManageAccountsParams BuildManageAccountsParams( |
@@ -224,4 +220,32 @@ ManageAccountsParams BuildManageAccountsParamsIfExists(net::URLRequest* request, |
return BuildManageAccountsParams(header_value); |
} |
+// Checks if the url has the required properties to have an |
+// X-CHROME-CONNECTED header. |
+bool IsUrlEligibleForXChromeConnectedHeader(const GURL& url) { |
+ // Only set the header for Drive and Gaia always, and other Google properties |
+ // if account consistency is enabled. |
+ // Vasquette, which is integrated with most Google properties, needs the |
+ // header to redirect certain user actions to Chrome native UI. Drive and Gaia |
+ // need the header to tell if the current user is connected. The drive path is |
+ // a temporary workaround until the more generic chrome.principals API is |
+ // available. |
+ |
+ // Consider the account id sensitive and limit it to secure domains. |
+ if (!url.SchemeIsCryptographic()) |
+ return false; |
+ |
+ GURL origin(url.GetOrigin()); |
+ bool is_enable_account_consistency = switches::IsEnableAccountConsistency(); |
+ bool is_google_url = is_enable_account_consistency && |
+ (google_util::IsGoogleDomainUrl( |
+ url, google_util::ALLOW_SUBDOMAIN, |
+ google_util::DISALLOW_NON_STANDARD_PORTS) || |
+ google_util::IsYoutubeDomainUrl( |
+ url, google_util::ALLOW_SUBDOMAIN, |
+ google_util::DISALLOW_NON_STANDARD_PORTS)); |
+ return is_google_url || IsDriveOrigin(origin) || |
+ gaia::IsGaiaSignonRealm(origin); |
+} |
+ |
} // namespace signin |