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

Unified Diff: chrome/browser/signin/signin_header_helper.cc

Issue 345533005: Parse extra parameters on x-chrome-manage-accounts header (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cleanup Created 6 years, 6 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 | « chrome/browser/signin/signin_header_helper.h ('k') | chrome/browser/ui/browser_commands.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/signin/signin_header_helper.cc
diff --git a/chrome/browser/signin/signin_header_helper.cc b/chrome/browser/signin/signin_header_helper.cc
index fd7dee0d232aa637a3da456019262219cf486a71..5ac17054aeeaec5fff75e83f1900b968b6558a8f 100644
--- a/chrome/browser/signin/signin_header_helper.cc
+++ b/chrome/browser/signin/signin_header_helper.cc
@@ -38,6 +38,12 @@ const char kGaiaIdAttrName[] = "id";
const char kProfileModeAttrName[] = "mode";
const char kEnableAccountConsistencyAttrName[] = "enable_account_consistency";
+const char kServiceTypeAttrName[] = "action";
+const char kEmailAttrName[] = "email";
+const char kIsSamlAttrName[] = "is_saml";
+const char kContinueUrlAttrName[] = "continue_url";
+const char kIsSameTabAttrName[] = "is_same_tab";
+
// Determines the service type that has been passed from GAIA in the header.
signin::GAIAServiceType GetGAIAServiceTypeFromHeader(
const std::string& header_value) {
@@ -69,7 +75,7 @@ MirrorResponseHeaderDictionary ParseMirrorResponseHeader(
std::string field(*i);
std::vector<std::string> tokens;
if (Tokenize(field, "=", &tokens) != 2) {
- DLOG(WARNING) << "Unexpected GAIA header filed '" << field << "'.";
+ DLOG(WARNING) << "Unexpected GAIA header field '" << field << "'.";
continue;
}
dictionary[tokens[0]] = tokens[1];
@@ -77,6 +83,34 @@ MirrorResponseHeaderDictionary ParseMirrorResponseHeader(
return dictionary;
}
+// Returns the parameters contained in the X-Chrome-Manage-Accounts response
+// header.
+signin::ManageAccountsParams BuildManageAccountsParams(
+ const std::string& header_value) {
+ signin::ManageAccountsParams params;
+ MirrorResponseHeaderDictionary header_dictionary =
+ ParseMirrorResponseHeader(header_value);
+ MirrorResponseHeaderDictionary::const_iterator it = header_dictionary.begin();
+ for (; it != header_dictionary.end(); ++it) {
+ const std::string key_name(it->first);
+ if (key_name == kServiceTypeAttrName) {
+ params.service_type =
+ GetGAIAServiceTypeFromHeader(header_dictionary[kServiceTypeAttrName]);
+ } else if (key_name == kEmailAttrName) {
+ params.email = header_dictionary[kEmailAttrName];
+ } else if (key_name == kIsSamlAttrName) {
+ params.is_saml = header_dictionary[kIsSamlAttrName] == "true";
+ } else if (key_name == kContinueUrlAttrName) {
+ params.continue_url = header_dictionary[kContinueUrlAttrName];
+ } else if (key_name == kIsSameTabAttrName) {
+ params.is_same_tab = header_dictionary[kIsSameTabAttrName] == "true";
+ } else {
+ DLOG(WARNING) << "Unexpected GAIA header attribute '" << key_name << "'.";
+ }
+ }
+ return params;
+}
+
#if !defined(OS_IOS)
// Processes the mirror response header on the UI thread. Currently depending
// on the value of |header_value|, it either shows the profile avatar menu, or
@@ -112,7 +146,7 @@ void ProcessMirrorHeaderUIThread(
bubble_mode = BrowserWindow::AVATAR_BUBBLE_MODE_ACCOUNT_MANAGEMENT;
}
browser->window()->ShowAvatarBubbleFromAvatarButton(
- bubble_mode, service_type);
+ bubble_mode, manage_accounts_params);
}
#else // defined(OS_ANDROID)
if (service_type == signin::GAIA_SERVICE_TYPE_INCOGNITO) {
@@ -141,6 +175,15 @@ bool IsDriveOrigin(const GURL& url) {
namespace signin {
+ManageAccountsParams::ManageAccountsParams() :
+ service_type(GAIA_SERVICE_TYPE_NONE),
+ email(""),
+ is_saml(false),
+ continue_url(""),
+ is_same_tab(false),
+ child_id(0),
+ route_id(0) {}
+
bool AppendMirrorRequestHeaderIfPossible(
net::URLRequest* request,
const GURL& redirect_url,
@@ -198,31 +241,6 @@ bool AppendMirrorRequestHeaderIfPossible(
return true;
}
-ManageAccountsParams GetManageAccountsParams(net::URLRequest* request,
- ProfileIOData* io_data) {
- ManageAccountsParams params;
- params.service_type = GAIA_SERVICE_TYPE_NONE;
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
- if (!gaia::IsGaiaSignonRealm(request->url().GetOrigin()))
- return params;
-
- std::string header_value;
- if (!request->response_headers()->GetNormalizedHeader(
- kChromeManageAccountsHeader, &header_value)) {
- return params;
- }
-
- DCHECK(switches::IsNewProfileManagement() && !io_data->IsOffTheRecord());
-
- MirrorResponseHeaderDictionary header_dictionary =
- ParseMirrorResponseHeader(header_value);
- if (header_dictionary.count("action")) {
- params.service_type =
- GetGAIAServiceTypeFromHeader(header_dictionary["action"]);
- }
- return params;
-}
-
void ProcessMirrorResponseHeaderIfExists(
net::URLRequest* request,
ProfileIOData* io_data,
@@ -232,10 +250,22 @@ void ProcessMirrorResponseHeaderIfExists(
NOTREACHED();
#else
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
- ManageAccountsParams params = GetManageAccountsParams(request, io_data);
+ if (!gaia::IsGaiaSignonRealm(request->url().GetOrigin()))
+ return;
+
+ std::string header_value;
+ if (!request->response_headers()->GetNormalizedHeader(
+ kChromeManageAccountsHeader, &header_value)) {
+ return;
+ }
+
+ DCHECK(switches::IsNewProfileManagement() && !io_data->IsOffTheRecord());
+ ManageAccountsParams params(BuildManageAccountsParams(header_value));
if (params.service_type == GAIA_SERVICE_TYPE_NONE)
return;
+ params.child_id = child_id;
+ params.route_id = route_id;
content::BrowserThread::PostTask(
content::BrowserThread::UI, FROM_HERE,
base::Bind(ProcessMirrorHeaderUIThread, child_id, route_id, params));
« no previous file with comments | « chrome/browser/signin/signin_header_helper.h ('k') | chrome/browser/ui/browser_commands.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698