OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "chrome/browser/ui/webui/chromeos/login/inline_login_handler_chromeos.h " | 5 #include "chrome/browser/ui/webui/chromeos/login/inline_login_handler_chromeos.h " |
6 | 6 |
7 #include "chrome/browser/chromeos/login/oauth2_token_fetcher.h" | 7 #include "chrome/browser/chromeos/login/oauth2_token_fetcher.h" |
8 #include "chrome/browser/profiles/profile.h" | 8 #include "chrome/browser/profiles/profile.h" |
9 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | 9 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
10 #include "chrome/browser/signin/signin_manager_factory.h" | 10 #include "chrome/browser/signin/signin_manager_factory.h" |
11 #include "chrome/browser/signin/signin_promo.h" | |
12 #include "chrome/common/url_constants.h" | |
11 #include "components/signin/core/browser/profile_oauth2_token_service.h" | 13 #include "components/signin/core/browser/profile_oauth2_token_service.h" |
12 #include "components/signin/core/browser/signin_manager.h" | 14 #include "components/signin/core/browser/signin_manager.h" |
15 #include "content/public/browser/storage_partition.h" | |
16 #include "content/public/browser/web_contents.h" | |
13 #include "content/public/browser/web_ui.h" | 17 #include "content/public/browser/web_ui.h" |
18 #include "google_apis/gaia/gaia_urls.h" | |
19 #include "net/base/url_util.h" | |
14 | 20 |
15 namespace chromeos { | 21 namespace chromeos { |
16 | 22 |
17 class InlineLoginHandlerChromeOS::InlineLoginUIOAuth2Delegate | 23 class InlineLoginHandlerChromeOS::InlineLoginUIOAuth2Delegate |
18 : public OAuth2TokenFetcher::Delegate { | 24 : public OAuth2TokenFetcher::Delegate { |
19 public: | 25 public: |
20 explicit InlineLoginUIOAuth2Delegate(content::WebUI* web_ui) | 26 explicit InlineLoginUIOAuth2Delegate(content::WebUI* web_ui, |
21 : web_ui_(web_ui) {} | 27 const std::string& account_id) |
28 : web_ui_(web_ui), account_id_(account_id) {} | |
29 | |
22 virtual ~InlineLoginUIOAuth2Delegate() {} | 30 virtual ~InlineLoginUIOAuth2Delegate() {} |
23 | 31 |
24 // OAuth2TokenFetcher::Delegate overrides: | 32 // OAuth2TokenFetcher::Delegate overrides: |
25 virtual void OnOAuth2TokensAvailable( | 33 virtual void OnOAuth2TokensAvailable( |
26 const GaiaAuthConsumer::ClientOAuthResult& oauth2_tokens) OVERRIDE { | 34 const GaiaAuthConsumer::ClientOAuthResult& oauth2_tokens) OVERRIDE { |
27 // Closes sign-in dialog before update token service. Token service update | 35 // Closes sign-in dialog before update token service. Token service update |
28 // might trigger a permission dialog and if this dialog does not close, | 36 // might trigger a permission dialog and if this dialog does not close, |
29 // a DCHECK would be triggered because attempting to activate a window | 37 // a DCHECK would be triggered because attempting to activate a window |
30 // while there is a modal dialog. | 38 // while there is a modal dialog. |
31 web_ui_->CallJavascriptFunction("inline.login.closeDialog"); | 39 web_ui_->CallJavascriptFunction("inline.login.closeDialog"); |
32 | 40 |
33 Profile* profile = Profile::FromWebUI(web_ui_); | 41 Profile* profile = Profile::FromWebUI(web_ui_); |
34 ProfileOAuth2TokenService* token_service = | 42 ProfileOAuth2TokenService* token_service = |
35 ProfileOAuth2TokenServiceFactory::GetForProfile(profile); | 43 ProfileOAuth2TokenServiceFactory::GetForProfile(profile); |
36 SigninManagerBase* signin_manager = | 44 token_service->UpdateCredentials(account_id_, oauth2_tokens.refresh_token); |
37 SigninManagerFactory::GetForProfile(profile); | |
38 token_service->UpdateCredentials( | |
39 signin_manager->GetAuthenticatedAccountId(), | |
40 oauth2_tokens.refresh_token); | |
41 } | 45 } |
42 | 46 |
43 virtual void OnOAuth2TokensFetchFailed() OVERRIDE { | 47 virtual void OnOAuth2TokensFetchFailed() OVERRIDE { |
44 LOG(ERROR) << "Failed to fetch oauth2 token with inline login."; | 48 LOG(ERROR) << "Failed to fetch oauth2 token with inline login."; |
45 web_ui_->CallJavascriptFunction("inline.login.handleOAuth2TokenFailure"); | 49 web_ui_->CallJavascriptFunction("inline.login.handleOAuth2TokenFailure"); |
46 } | 50 } |
47 | 51 |
48 private: | 52 private: |
49 content::WebUI* web_ui_; | 53 content::WebUI* web_ui_; |
54 std::string account_id_; | |
55 | |
56 DISALLOW_COPY_AND_ASSIGN(InlineLoginUIOAuth2Delegate); | |
50 }; | 57 }; |
51 | 58 |
52 InlineLoginHandlerChromeOS::InlineLoginHandlerChromeOS() {} | 59 InlineLoginHandlerChromeOS::InlineLoginHandlerChromeOS() {} |
53 | 60 |
54 InlineLoginHandlerChromeOS::~InlineLoginHandlerChromeOS() {} | 61 InlineLoginHandlerChromeOS::~InlineLoginHandlerChromeOS() {} |
55 | 62 |
63 void InlineLoginHandlerChromeOS::SetExtraInitParams( | |
64 base::DictionaryValue& params) { | |
65 const GURL& current_url = web_ui()->GetWebContents()->GetURL(); | |
66 params.SetInteger("authMode", InlineLoginHandler::kDesktopAuthMode); | |
guohui
2014/04/29 13:33:07
most code here is duplicated in InlineLOginHandler
dzhioev (left Google)
2014/04/29 14:27:21
Done. After that I was able to remove InlineLoginH
| |
67 | |
68 std::string frame_url; | |
69 net::GetValueForKeyInQuery(current_url, "frameUrl", &frame_url); | |
70 if (!frame_url.empty()) | |
71 params.SetString("frameUrl", frame_url); | |
72 | |
73 std::string is_constrained; | |
74 net::GetValueForKeyInQuery(current_url, "constrained", &is_constrained); | |
75 if (!is_constrained.empty()) | |
76 params.SetString("constrained", is_constrained); | |
77 | |
78 params.SetString( | |
79 "gaiaPath", | |
80 GaiaUrls::GetInstance()->embedded_signin_url().path().substr(1)); | |
81 params.SetString( | |
82 "continueUrl", | |
83 signin::GetLandingURL( | |
84 "source", static_cast<int>(signin::SOURCE_AVATAR_BUBBLE_ADD_ACCOUNT)) | |
85 .spec()); | |
86 } | |
87 | |
56 void InlineLoginHandlerChromeOS::CompleteLogin(const base::ListValue* args) { | 88 void InlineLoginHandlerChromeOS::CompleteLogin(const base::ListValue* args) { |
57 Profile* profile = Profile::FromWebUI(web_ui()); | 89 Profile* profile = Profile::FromWebUI(web_ui()); |
58 | 90 |
59 oauth2_delegate_.reset(new InlineLoginUIOAuth2Delegate(web_ui())); | 91 const base::DictionaryValue* dict = NULL; |
60 oauth2_token_fetcher_.reset(new OAuth2TokenFetcher( | 92 args->GetDictionary(0, &dict); |
61 oauth2_delegate_.get(), profile->GetRequestContext())); | 93 |
62 oauth2_token_fetcher_->StartExchangeFromCookies(); | 94 std::string session_index; |
95 dict->GetString("sessionIndex", &session_index); | |
96 CHECK(!session_index.empty()) << "Session index is empty."; | |
97 | |
98 std::string account_id; | |
99 dict->GetString("email", &account_id); | |
100 CHECK(!account_id.empty()) << "Account ID is empty."; | |
101 | |
102 oauth2_delegate_.reset(new InlineLoginUIOAuth2Delegate(web_ui(), account_id)); | |
103 net::URLRequestContextGetter* request_context = | |
104 content::BrowserContext::GetStoragePartitionForSite( | |
105 profile, GURL(chrome::kChromeUIChromeSigninURL)) | |
106 ->GetURLRequestContext(); | |
107 oauth2_token_fetcher_.reset( | |
108 new OAuth2TokenFetcher(oauth2_delegate_.get(), request_context)); | |
109 oauth2_token_fetcher_->StartExchangeFromCookies(session_index); | |
63 } | 110 } |
64 | 111 |
65 } // namespace chromeos | 112 } // namespace chromeos |
OLD | NEW |