| OLD | NEW | 
|    1 // Copyright 2016 The Chromium Authors. All rights reserved. |    1 // Copyright 2016 The Chromium Authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include "components/signin/core/browser/signin_header_helper.h" |    5 #include "components/signin/core/browser/signin_header_helper.h" | 
|    6  |    6  | 
|    7 #include <memory> |    7 #include <memory> | 
|    8 #include <string> |    8 #include <string> | 
|    9  |    9  | 
|   10 #include "base/command_line.h" |   10 #include "base/command_line.h" | 
|   11 #include "base/message_loop/message_loop.h" |   11 #include "base/message_loop/message_loop.h" | 
 |   12 #include "base/strings/stringprintf.h" | 
|   12 #include "build/build_config.h" |   13 #include "build/build_config.h" | 
|   13 #include "components/content_settings/core/browser/cookie_settings.h" |   14 #include "components/content_settings/core/browser/cookie_settings.h" | 
|   14 #include "components/signin/core/browser/chrome_connected_header_helper.h" |   15 #include "components/signin/core/browser/chrome_connected_header_helper.h" | 
|   15 #include "components/signin/core/common/profile_management_switches.h" |   16 #include "components/signin/core/common/profile_management_switches.h" | 
|   16 #include "components/sync_preferences/testing_pref_service_syncable.h" |   17 #include "components/sync_preferences/testing_pref_service_syncable.h" | 
|   17 #include "google_apis/gaia/gaia_urls.h" |   18 #include "google_apis/gaia/gaia_urls.h" | 
|   18 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" |   19 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" | 
|   19 #include "net/url_request/url_request_test_util.h" |   20 #include "net/url_request/url_request_test_util.h" | 
|   20 #include "testing/gtest/include/gtest/gtest.h" |   21 #include "testing/gtest/include/gtest/gtest.h" | 
|   21 #include "url/gurl.h" |   22 #include "url/gurl.h" | 
|   22  |   23  | 
|   23 #if !defined(OS_IOS) && !defined(OS_ANDROID) |   24 #if !defined(OS_IOS) && !defined(OS_ANDROID) | 
|   24 #include "components/signin/core/browser/dice_header_helper.h" |   25 #include "components/signin/core/browser/dice_header_helper.h" | 
|   25 #endif |   26 #endif | 
|   26  |   27  | 
 |   28 namespace signin { | 
 |   29  | 
|   27 class SigninHeaderHelperTest : public testing::Test { |   30 class SigninHeaderHelperTest : public testing::Test { | 
|   28  protected: |   31  protected: | 
|   29   void SetUp() override { |   32   void SetUp() override { | 
|   30     content_settings::CookieSettings::RegisterProfilePrefs(prefs_.registry()); |   33     content_settings::CookieSettings::RegisterProfilePrefs(prefs_.registry()); | 
|   31     HostContentSettingsMap::RegisterProfilePrefs(prefs_.registry()); |   34     HostContentSettingsMap::RegisterProfilePrefs(prefs_.registry()); | 
|   32  |   35  | 
|   33     settings_map_ = new HostContentSettingsMap( |   36     settings_map_ = new HostContentSettingsMap( | 
|   34         &prefs_, false /* incognito_profile */, false /* guest_profile */, |   37         &prefs_, false /* incognito_profile */, false /* guest_profile */, | 
|   35         false /* store_last_modified */); |   38         false /* store_last_modified */); | 
|   36     cookie_settings_ = |   39     cookie_settings_ = | 
|   37         new content_settings::CookieSettings(settings_map_.get(), &prefs_, ""); |   40         new content_settings::CookieSettings(settings_map_.get(), &prefs_, ""); | 
|   38   } |   41   } | 
|   39  |   42  | 
|   40   void TearDown() override { settings_map_->ShutdownOnUIThread(); } |   43   void TearDown() override { settings_map_->ShutdownOnUIThread(); } | 
|   41  |   44  | 
|   42   void CheckMirrorCookieRequest(const GURL& url, |   45   void CheckMirrorCookieRequest(const GURL& url, | 
|   43                                 const std::string& account_id, |   46                                 const std::string& account_id, | 
|   44                                 const std::string& expected_request) { |   47                                 const std::string& expected_request) { | 
|   45     EXPECT_EQ(signin::BuildMirrorRequestCookieIfPossible( |   48     EXPECT_EQ( | 
|   46                   url, account_id, cookie_settings_.get(), |   49         BuildMirrorRequestCookieIfPossible( | 
|   47                   signin::PROFILE_MODE_DEFAULT), |   50             url, account_id, cookie_settings_.get(), PROFILE_MODE_DEFAULT), | 
|   48               expected_request); |   51         expected_request); | 
|   49   } |   52   } | 
|   50  |   53  | 
|   51   std::unique_ptr<net::URLRequest> CreateRequest( |   54   std::unique_ptr<net::URLRequest> CreateRequest( | 
|   52       const GURL& url, |   55       const GURL& url, | 
|   53       const std::string& account_id) { |   56       const std::string& account_id) { | 
|   54     std::unique_ptr<net::URLRequest> url_request = |   57     std::unique_ptr<net::URLRequest> url_request = | 
|   55         url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, |   58         url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, | 
|   56                                            TRAFFIC_ANNOTATION_FOR_TESTS); |   59                                            TRAFFIC_ANNOTATION_FOR_TESTS); | 
|   57     signin::AppendOrRemoveAccountConsistentyRequestHeader( |   60     AppendOrRemoveAccountConsistentyRequestHeader( | 
|   58         url_request.get(), GURL(), account_id, cookie_settings_.get(), |   61         url_request.get(), GURL(), account_id, cookie_settings_.get(), | 
|   59         signin::PROFILE_MODE_DEFAULT); |   62         PROFILE_MODE_DEFAULT); | 
|   60     return url_request; |   63     return url_request; | 
|   61   } |   64   } | 
|   62  |   65  | 
|   63   void CheckAccountConsistencyHeaderRequest( |   66   void CheckAccountConsistencyHeaderRequest( | 
|   64       net::URLRequest* url_request, |   67       net::URLRequest* url_request, | 
|   65       const char* header_name, |   68       const char* header_name, | 
|   66       const std::string& expected_request) { |   69       const std::string& expected_request) { | 
|   67     bool expected_result = !expected_request.empty(); |   70     bool expected_result = !expected_request.empty(); | 
|   68     std::string request; |   71     std::string request; | 
|   69     EXPECT_EQ( |   72     EXPECT_EQ( | 
|   70         url_request->extra_request_headers().GetHeader(header_name, &request), |   73         url_request->extra_request_headers().GetHeader(header_name, &request), | 
|   71         expected_result); |   74         expected_result); | 
|   72     if (expected_result) { |   75     if (expected_result) { | 
|   73       EXPECT_EQ(expected_request, request); |   76       EXPECT_EQ(expected_request, request); | 
|   74     } |   77     } | 
|   75   } |   78   } | 
|   76  |   79  | 
|   77   void CheckMirrorHeaderRequest(const GURL& url, |   80   void CheckMirrorHeaderRequest(const GURL& url, | 
|   78                                 const std::string& account_id, |   81                                 const std::string& account_id, | 
|   79                                 const std::string& expected_request) { |   82                                 const std::string& expected_request) { | 
|   80     std::unique_ptr<net::URLRequest> url_request = |   83     std::unique_ptr<net::URLRequest> url_request = | 
|   81         CreateRequest(url, account_id); |   84         CreateRequest(url, account_id); | 
|   82     CheckAccountConsistencyHeaderRequest( |   85     CheckAccountConsistencyHeaderRequest( | 
|   83         url_request.get(), signin::kChromeConnectedHeader, expected_request); |   86         url_request.get(), kChromeConnectedHeader, expected_request); | 
|   84   } |   87   } | 
|   85  |   88  | 
|   86 #if !defined(OS_IOS) && !defined(OS_ANDROID) |   89 #if !defined(OS_IOS) && !defined(OS_ANDROID) | 
|   87   void CheckDiceHeaderRequest(const GURL& url, |   90   void CheckDiceHeaderRequest(const GURL& url, | 
|   88                               const std::string& account_id, |   91                               const std::string& account_id, | 
|   89                               const std::string& expected_mirror_request, |   92                               const std::string& expected_mirror_request, | 
|   90                               const std::string& expected_dice_request) { |   93                               const std::string& expected_dice_request) { | 
|   91     std::unique_ptr<net::URLRequest> url_request = |   94     std::unique_ptr<net::URLRequest> url_request = | 
|   92         CreateRequest(url, account_id); |   95         CreateRequest(url, account_id); | 
|   93     CheckAccountConsistencyHeaderRequest(url_request.get(), |  | 
|   94                                          signin::kChromeConnectedHeader, |  | 
|   95                                          expected_mirror_request); |  | 
|   96     CheckAccountConsistencyHeaderRequest( |   96     CheckAccountConsistencyHeaderRequest( | 
|   97         url_request.get(), signin::kDiceRequestHeader, expected_dice_request); |   97         url_request.get(), kChromeConnectedHeader, expected_mirror_request); | 
 |   98     CheckAccountConsistencyHeaderRequest(url_request.get(), kDiceRequestHeader, | 
 |   99                                          expected_dice_request); | 
|   98   } |  100   } | 
|   99 #endif |  101 #endif | 
|  100  |  102  | 
|  101   base::MessageLoop loop_; |  103   base::MessageLoop loop_; | 
|  102  |  104  | 
|  103   sync_preferences::TestingPrefServiceSyncable prefs_; |  105   sync_preferences::TestingPrefServiceSyncable prefs_; | 
|  104   net::TestURLRequestContext url_request_context_; |  106   net::TestURLRequestContext url_request_context_; | 
|  105  |  107  | 
|  106   scoped_refptr<HostContentSettingsMap> settings_map_; |  108   scoped_refptr<HostContentSettingsMap> settings_map_; | 
|  107   scoped_refptr<content_settings::CookieSettings> cookie_settings_; |  109   scoped_refptr<content_settings::CookieSettings> cookie_settings_; | 
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  215   switches::EnableAccountConsistencyMirrorForTesting( |  217   switches::EnableAccountConsistencyMirrorForTesting( | 
|  216       base::CommandLine::ForCurrentProcess()); |  218       base::CommandLine::ForCurrentProcess()); | 
|  217   CheckMirrorHeaderRequest( |  219   CheckMirrorHeaderRequest( | 
|  218       GURL("https://docs.google.com/document"), "0123456789", |  220       GURL("https://docs.google.com/document"), "0123456789", | 
|  219       "id=0123456789,mode=0,enable_account_consistency=true"); |  221       "id=0123456789,mode=0,enable_account_consistency=true"); | 
|  220   CheckMirrorCookieRequest( |  222   CheckMirrorCookieRequest( | 
|  221       GURL("https://drive.google.com/drive"), "0123456789", |  223       GURL("https://drive.google.com/drive"), "0123456789", | 
|  222       "id=0123456789:mode=0:enable_account_consistency=true"); |  224       "id=0123456789:mode=0:enable_account_consistency=true"); | 
|  223 } |  225 } | 
|  224  |  226  | 
 |  227 TEST_F(SigninHeaderHelperTest, TestDiceInvalidResponseParams) { | 
 |  228   DiceResponseParams params = BuildDiceResponseParams("blah"); | 
 |  229   EXPECT_EQ(DiceAction::NONE, params.user_intention); | 
 |  230 } | 
 |  231  | 
 |  232 TEST_F(SigninHeaderHelperTest, TestBuildDiceResponseParams) { | 
 |  233   const char kAuthorizationCode[] = "authorization_code"; | 
 |  234   const char kEmail[] = "foo@example.com"; | 
 |  235   const char kObfuscatedGaiaID[] = "obfuscated_gaia_id"; | 
 |  236   const int kSessionIndex = 42; | 
 |  237  | 
 |  238   { | 
 |  239     // Signin response. | 
 |  240     DiceResponseParams params = BuildDiceResponseParams(base::StringPrintf( | 
 |  241         "action=SIGNIN,id=%s,email=%s,authuser=%i,authorization_code=%s", | 
 |  242         kObfuscatedGaiaID, kEmail, kSessionIndex, kAuthorizationCode)); | 
 |  243     EXPECT_EQ(DiceAction::SIGNIN, params.user_intention); | 
 |  244     EXPECT_EQ(kObfuscatedGaiaID, params.obfuscated_gaia_id); | 
 |  245     EXPECT_EQ(kEmail, params.email); | 
 |  246     EXPECT_EQ(kSessionIndex, params.session_index); | 
 |  247     EXPECT_EQ(kAuthorizationCode, params.authorization_code); | 
 |  248   } | 
 |  249  | 
 |  250   { | 
 |  251     // Signout response. | 
 |  252     DiceResponseParams params = BuildDiceResponseParams( | 
 |  253         base::StringPrintf("action=SIGNOUT,id=%s,email=%s,authuser=%i", | 
 |  254                            kObfuscatedGaiaID, kEmail, kSessionIndex)); | 
 |  255     EXPECT_EQ(DiceAction::SIGNOUT, params.user_intention); | 
 |  256     EXPECT_EQ(kObfuscatedGaiaID, params.obfuscated_gaia_id); | 
 |  257     EXPECT_EQ(kEmail, params.email); | 
 |  258     EXPECT_EQ(kSessionIndex, params.session_index); | 
 |  259     EXPECT_EQ("", params.authorization_code); | 
 |  260   } | 
 |  261  | 
 |  262   { | 
 |  263     // Missing authorization code. | 
 |  264     DiceResponseParams params = BuildDiceResponseParams( | 
 |  265         base::StringPrintf("action=SIGNIN,id=%s,email=%s,authuser=%i", | 
 |  266                            kObfuscatedGaiaID, kEmail, kSessionIndex)); | 
 |  267     EXPECT_EQ(DiceAction::NONE, params.user_intention); | 
 |  268   } | 
 |  269  | 
 |  270   { | 
 |  271     // Missing non-optional field (email). | 
 |  272     DiceResponseParams params = BuildDiceResponseParams(base::StringPrintf( | 
 |  273         "action=SIGNIN,id=%s,authuser=%i,authorization_code=%s", | 
 |  274         kObfuscatedGaiaID, kSessionIndex, kAuthorizationCode)); | 
 |  275     EXPECT_EQ(DiceAction::NONE, params.user_intention); | 
 |  276   } | 
 |  277 } | 
 |  278  | 
|  225 #endif  // !defined(OS_ANDROID) && !defined(OS_IOS) |  279 #endif  // !defined(OS_ANDROID) && !defined(OS_IOS) | 
|  226  |  280  | 
|  227 // Tests that the Mirror header request is returned normally when the redirect |  281 // Tests that the Mirror header request is returned normally when the redirect | 
|  228 // URL is eligible. |  282 // URL is eligible. | 
|  229 TEST_F(SigninHeaderHelperTest, TestMirrorHeaderEligibleRedirectURL) { |  283 TEST_F(SigninHeaderHelperTest, TestMirrorHeaderEligibleRedirectURL) { | 
|  230   switches::EnableAccountConsistencyMirrorForTesting( |  284   switches::EnableAccountConsistencyMirrorForTesting( | 
|  231       base::CommandLine::ForCurrentProcess()); |  285       base::CommandLine::ForCurrentProcess()); | 
|  232   const GURL url("https://docs.google.com/document"); |  286   const GURL url("https://docs.google.com/document"); | 
|  233   const GURL redirect_url("https://www.google.com"); |  287   const GURL redirect_url("https://www.google.com"); | 
|  234   const std::string account_id = "0123456789"; |  288   const std::string account_id = "0123456789"; | 
|  235   std::unique_ptr<net::URLRequest> url_request = |  289   std::unique_ptr<net::URLRequest> url_request = | 
|  236       url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, |  290       url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, | 
|  237                                          TRAFFIC_ANNOTATION_FOR_TESTS); |  291                                          TRAFFIC_ANNOTATION_FOR_TESTS); | 
|  238   signin::AppendOrRemoveAccountConsistentyRequestHeader( |  292   AppendOrRemoveAccountConsistentyRequestHeader( | 
|  239       url_request.get(), redirect_url, account_id, cookie_settings_.get(), |  293       url_request.get(), redirect_url, account_id, cookie_settings_.get(), | 
|  240       signin::PROFILE_MODE_DEFAULT); |  294       PROFILE_MODE_DEFAULT); | 
|  241   EXPECT_TRUE(url_request->extra_request_headers().HasHeader( |  295   EXPECT_TRUE( | 
|  242       signin::kChromeConnectedHeader)); |  296       url_request->extra_request_headers().HasHeader(kChromeConnectedHeader)); | 
|  243 } |  297 } | 
|  244  |  298  | 
|  245 // Tests that the Mirror header request is stripped when the redirect URL is not |  299 // Tests that the Mirror header request is stripped when the redirect URL is not | 
|  246 // eligible. |  300 // eligible. | 
|  247 TEST_F(SigninHeaderHelperTest, TestMirrorHeaderNonEligibleRedirectURL) { |  301 TEST_F(SigninHeaderHelperTest, TestMirrorHeaderNonEligibleRedirectURL) { | 
|  248   switches::EnableAccountConsistencyMirrorForTesting( |  302   switches::EnableAccountConsistencyMirrorForTesting( | 
|  249       base::CommandLine::ForCurrentProcess()); |  303       base::CommandLine::ForCurrentProcess()); | 
|  250   const GURL url("https://docs.google.com/document"); |  304   const GURL url("https://docs.google.com/document"); | 
|  251   const GURL redirect_url("http://www.foo.com"); |  305   const GURL redirect_url("http://www.foo.com"); | 
|  252   const std::string account_id = "0123456789"; |  306   const std::string account_id = "0123456789"; | 
|  253   std::unique_ptr<net::URLRequest> url_request = |  307   std::unique_ptr<net::URLRequest> url_request = | 
|  254       url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, |  308       url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, | 
|  255                                          TRAFFIC_ANNOTATION_FOR_TESTS); |  309                                          TRAFFIC_ANNOTATION_FOR_TESTS); | 
|  256   signin::AppendOrRemoveAccountConsistentyRequestHeader( |  310   AppendOrRemoveAccountConsistentyRequestHeader( | 
|  257       url_request.get(), redirect_url, account_id, cookie_settings_.get(), |  311       url_request.get(), redirect_url, account_id, cookie_settings_.get(), | 
|  258       signin::PROFILE_MODE_DEFAULT); |  312       PROFILE_MODE_DEFAULT); | 
|  259   EXPECT_FALSE(url_request->extra_request_headers().HasHeader( |  313   EXPECT_FALSE( | 
|  260       signin::kChromeConnectedHeader)); |  314       url_request->extra_request_headers().HasHeader(kChromeConnectedHeader)); | 
|  261 } |  315 } | 
|  262  |  316  | 
|  263 // Tests that the Mirror header, whatever its value is, is untouched when both |  317 // Tests that the Mirror header, whatever its value is, is untouched when both | 
|  264 // the current and the redirect URL are non-eligible. |  318 // the current and the redirect URL are non-eligible. | 
|  265 TEST_F(SigninHeaderHelperTest, TestIgnoreMirrorHeaderNonEligibleURLs) { |  319 TEST_F(SigninHeaderHelperTest, TestIgnoreMirrorHeaderNonEligibleURLs) { | 
|  266   switches::EnableAccountConsistencyMirrorForTesting( |  320   switches::EnableAccountConsistencyMirrorForTesting( | 
|  267       base::CommandLine::ForCurrentProcess()); |  321       base::CommandLine::ForCurrentProcess()); | 
|  268   const GURL url("https://www.bar.com"); |  322   const GURL url("https://www.bar.com"); | 
|  269   const GURL redirect_url("http://www.foo.com"); |  323   const GURL redirect_url("http://www.foo.com"); | 
|  270   const std::string account_id = "0123456789"; |  324   const std::string account_id = "0123456789"; | 
|  271   const std::string fake_header = "foo,bar"; |  325   const std::string fake_header = "foo,bar"; | 
|  272   std::unique_ptr<net::URLRequest> url_request = |  326   std::unique_ptr<net::URLRequest> url_request = | 
|  273       url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, |  327       url_request_context_.CreateRequest(url, net::DEFAULT_PRIORITY, nullptr, | 
|  274                                          TRAFFIC_ANNOTATION_FOR_TESTS); |  328                                          TRAFFIC_ANNOTATION_FOR_TESTS); | 
|  275   url_request->SetExtraRequestHeaderByName(signin::kChromeConnectedHeader, |  329   url_request->SetExtraRequestHeaderByName(kChromeConnectedHeader, fake_header, | 
|  276                                            fake_header, false); |  330                                            false); | 
|  277   signin::AppendOrRemoveAccountConsistentyRequestHeader( |  331   AppendOrRemoveAccountConsistentyRequestHeader( | 
|  278       url_request.get(), redirect_url, account_id, cookie_settings_.get(), |  332       url_request.get(), redirect_url, account_id, cookie_settings_.get(), | 
|  279       signin::PROFILE_MODE_DEFAULT); |  333       PROFILE_MODE_DEFAULT); | 
|  280   std::string header; |  334   std::string header; | 
|  281   EXPECT_TRUE(url_request->extra_request_headers().GetHeader( |  335   EXPECT_TRUE(url_request->extra_request_headers().GetHeader( | 
|  282       signin::kChromeConnectedHeader, &header)); |  336       kChromeConnectedHeader, &header)); | 
|  283   EXPECT_EQ(fake_header, header); |  337   EXPECT_EQ(fake_header, header); | 
|  284 } |  338 } | 
 |  339  | 
 |  340 }  // namespace signin | 
| OLD | NEW |