OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/chromeos/login/login_utils.h" | 5 #include "chrome/browser/chromeos/login/login_utils.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 public: | 100 public: |
101 LoginUtilsImpl() | 101 LoginUtilsImpl() |
102 : browser_launch_enabled_(true) { | 102 : browser_launch_enabled_(true) { |
103 } | 103 } |
104 | 104 |
105 // Invoked after the user has successfully logged in. This launches a browser | 105 // Invoked after the user has successfully logged in. This launches a browser |
106 // and does other bookkeeping after logging in. | 106 // and does other bookkeeping after logging in. |
107 virtual void CompleteLogin( | 107 virtual void CompleteLogin( |
108 const std::string& username, | 108 const std::string& username, |
109 const std::string& password, | 109 const std::string& password, |
110 const GaiaAuthConsumer::ClientLoginResult& credentials); | 110 const GaiaAuthConsumer::ClientLoginResult& credentials, |
| 111 bool pending_requests); |
111 | 112 |
112 // Invoked after the tmpfs is successfully mounted. | 113 // Invoked after the tmpfs is successfully mounted. |
113 // Launches a browser in the off the record (incognito) mode. | 114 // Launches a browser in the off the record (incognito) mode. |
114 virtual void CompleteOffTheRecordLogin(const GURL& start_url); | 115 virtual void CompleteOffTheRecordLogin(const GURL& start_url); |
115 | 116 |
116 // Invoked when the user is logging in for the first time, or is logging in as | 117 // Invoked when the user is logging in for the first time, or is logging in as |
117 // a guest user. | 118 // a guest user. |
118 virtual void SetFirstLoginPrefs(PrefService* prefs); | 119 virtual void SetFirstLoginPrefs(PrefService* prefs); |
119 | 120 |
120 // Creates and returns the authenticator to use. The caller owns the returned | 121 // Creates and returns the authenticator to use. The caller owns the returned |
121 // Authenticator and must delete it when done. | 122 // Authenticator and must delete it when done. |
122 virtual Authenticator* CreateAuthenticator(LoginStatusConsumer* consumer); | 123 virtual Authenticator* CreateAuthenticator(LoginStatusConsumer* consumer); |
123 | 124 |
124 // Used to postpone browser launch via DoBrowserLaunch() if some post | 125 // Used to postpone browser launch via DoBrowserLaunch() if some post |
125 // login screen is to be shown. | 126 // login screen is to be shown. |
126 virtual void EnableBrowserLaunch(bool enable); | 127 virtual void EnableBrowserLaunch(bool enable); |
127 | 128 |
128 // Returns if browser launch enabled now or not. | 129 // Returns if browser launch enabled now or not. |
129 virtual bool IsBrowserLaunchEnabled() const; | 130 virtual bool IsBrowserLaunchEnabled() const; |
130 | 131 |
131 // Warms the url used by authentication. | 132 // Warms the url used by authentication. |
132 virtual void PrewarmAuthentication(); | 133 virtual void PrewarmAuthentication(); |
133 | 134 |
| 135 // Given the credentials try to exchange them for |
| 136 // full-fledged Google authentication cookies. |
| 137 virtual void FetchCookies( |
| 138 Profile* profile, |
| 139 const GaiaAuthConsumer::ClientLoginResult& credentials); |
| 140 |
| 141 // Supply credentials for sync and others to use. |
| 142 virtual void FetchTokens( |
| 143 Profile* profile, |
| 144 const GaiaAuthConsumer::ClientLoginResult& credentials); |
| 145 |
134 private: | 146 private: |
135 // Check user's profile for kApplicationLocale setting. | 147 // Check user's profile for kApplicationLocale setting. |
136 void RespectLocalePreference(PrefService* pref); | 148 void RespectLocalePreference(PrefService* pref); |
137 | 149 |
138 // Indicates if DoBrowserLaunch will actually launch the browser or not. | 150 // Indicates if DoBrowserLaunch will actually launch the browser or not. |
139 bool browser_launch_enabled_; | 151 bool browser_launch_enabled_; |
140 | 152 |
141 DISALLOW_COPY_AND_ASSIGN(LoginUtilsImpl); | 153 DISALLOW_COPY_AND_ASSIGN(LoginUtilsImpl); |
142 }; | 154 }; |
143 | 155 |
(...skipping 21 matching lines...) Expand all Loading... |
165 | 177 |
166 Lock create_lock_; | 178 Lock create_lock_; |
167 scoped_ptr<LoginUtils> ptr_; | 179 scoped_ptr<LoginUtils> ptr_; |
168 | 180 |
169 DISALLOW_COPY_AND_ASSIGN(LoginUtilsWrapper); | 181 DISALLOW_COPY_AND_ASSIGN(LoginUtilsWrapper); |
170 }; | 182 }; |
171 | 183 |
172 void LoginUtilsImpl::CompleteLogin( | 184 void LoginUtilsImpl::CompleteLogin( |
173 const std::string& username, | 185 const std::string& username, |
174 const std::string& password, | 186 const std::string& password, |
175 const GaiaAuthConsumer::ClientLoginResult& credentials) { | 187 const GaiaAuthConsumer::ClientLoginResult& credentials, |
| 188 bool pending_requests) { |
176 BootTimesLoader* btl = BootTimesLoader::Get(); | 189 BootTimesLoader* btl = BootTimesLoader::Get(); |
177 | 190 |
178 VLOG(1) << "Completing login for " << username; | 191 VLOG(1) << "Completing login for " << username; |
179 btl->AddLoginTimeMarker("CompletingLogin", false); | 192 btl->AddLoginTimeMarker("CompletingLogin", false); |
180 | 193 |
181 if (CrosLibrary::Get()->EnsureLoaded()) { | 194 if (CrosLibrary::Get()->EnsureLoaded()) { |
182 CrosLibrary::Get()->GetLoginLibrary()->StartSession(username, ""); | 195 CrosLibrary::Get()->GetLoginLibrary()->StartSession(username, ""); |
183 btl->AddLoginTimeMarker("StartedSession", false); | 196 btl->AddLoginTimeMarker("StartedSession", false); |
184 } | 197 } |
185 | 198 |
(...skipping 30 matching lines...) Expand all Loading... |
216 // device policy. | 229 // device policy. |
217 net::ProxyConfigService* proxy_config_service = | 230 net::ProxyConfigService* proxy_config_service = |
218 new PrefProxyConfigService( | 231 new PrefProxyConfigService( |
219 profile->GetProxyConfigTracker(), | 232 profile->GetProxyConfigTracker(), |
220 new chromeos::ProxyConfigService( | 233 new chromeos::ProxyConfigService( |
221 profile->GetChromeOSProxyConfigServiceImpl())); | 234 profile->GetChromeOSProxyConfigServiceImpl())); |
222 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 235 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
223 new ResetDefaultProxyConfigServiceTask( | 236 new ResetDefaultProxyConfigServiceTask( |
224 proxy_config_service)); | 237 proxy_config_service)); |
225 | 238 |
226 // Take the credentials passed in and try to exchange them for | 239 // Since we're doing parallel authentication, only new user sign in |
227 // full-fledged Google authentication cookies. This is | 240 // would perform online auth before calling CompleteLogin. |
228 // best-effort; it's possible that we'll fail due to network | 241 // For existing users there's usually a pending online auth request. |
229 // troubles or some such. Either way, |cf| will call | 242 // Cookies will be fetched after it's is succeeded. |
230 // DoBrowserLaunch on the UI thread when it's done, and then | 243 if (!pending_requests) { |
231 // delete itself. | 244 FetchCookies(profile, credentials); |
232 CookieFetcher* cf = new CookieFetcher(profile); | 245 } |
233 cf->AttemptFetch(credentials.data); | |
234 btl->AddLoginTimeMarker("CookieFetchStarted", false); | |
235 | 246 |
236 // Init extension event routers; this normally happens in browser_main | 247 // Init extension event routers; this normally happens in browser_main |
237 // but on Chrome OS it has to be deferred until the user finishes | 248 // but on Chrome OS it has to be deferred until the user finishes |
238 // logging in and the profile is not OTR. | 249 // logging in and the profile is not OTR. |
239 if (profile->GetExtensionsService() && | 250 if (profile->GetExtensionsService() && |
240 profile->GetExtensionsService()->extensions_enabled()) { | 251 profile->GetExtensionsService()->extensions_enabled()) { |
241 profile->GetExtensionsService()->InitEventRouters(); | 252 profile->GetExtensionsService()->InitEventRouters(); |
242 } | 253 } |
243 btl->AddLoginTimeMarker("ExtensionsServiceStarted", false); | 254 btl->AddLoginTimeMarker("ExtensionsServiceStarted", false); |
244 | 255 |
245 // Supply credentials for sync and others to use. Load tokens from disk. | 256 // Supply credentials for sync and others to use. Load tokens from disk. |
246 TokenService* token_service = profile->GetTokenService(); | 257 TokenService* token_service = profile->GetTokenService(); |
247 token_service->Initialize(GaiaConstants::kChromeOSSource, | 258 token_service->Initialize(GaiaConstants::kChromeOSSource, |
248 profile); | 259 profile); |
249 token_service->LoadTokensFromDB(); | 260 token_service->LoadTokensFromDB(); |
250 token_service->UpdateCredentials(credentials); | 261 |
251 if (token_service->AreCredentialsValid()) { | 262 // For existing users there's usually a pending online auth request. |
252 token_service->StartFetchingTokens(); | 263 // Tokens will be fetched after it's is succeeded. |
| 264 if (!pending_requests) { |
| 265 FetchTokens(profile, credentials); |
253 } | 266 } |
254 btl->AddLoginTimeMarker("TokensGotten", false); | 267 btl->AddLoginTimeMarker("TokensGotten", false); |
255 | 268 |
256 // Set the CrOS user by getting this constructor run with the | 269 // Set the CrOS user by getting this constructor run with the |
257 // user's email on first retrieval. | 270 // user's email on first retrieval. |
258 profile->GetProfileSyncService(username)->SetPassphrase(password, false); | 271 profile->GetProfileSyncService(username)->SetPassphrase(password, false); |
259 btl->AddLoginTimeMarker("SyncStarted", false); | 272 btl->AddLoginTimeMarker("SyncStarted", false); |
260 | 273 |
261 // Attempt to take ownership; this will fail if device is already owned. | 274 // Attempt to take ownership; this will fail if device is already owned. |
262 OwnershipService::GetSharedInstance()->StartTakeOwnershipAttempt( | 275 OwnershipService::GetSharedInstance()->StartTakeOwnershipAttempt( |
(...skipping 23 matching lines...) Expand all Loading... |
286 // out when we get that done properly. | 299 // out when we get that done properly. |
287 // TODO(xiyuan): Remove this once enterprise feature is ready. | 300 // TODO(xiyuan): Remove this once enterprise feature is ready. |
288 if (EndsWith(username, "@google.com", true)) { | 301 if (EndsWith(username, "@google.com", true)) { |
289 PrefService* pref_service = profile->GetPrefs(); | 302 PrefService* pref_service = profile->GetPrefs(); |
290 pref_service->SetBoolean(prefs::kEnableScreenLock, true); | 303 pref_service->SetBoolean(prefs::kEnableScreenLock, true); |
291 } | 304 } |
292 | 305 |
293 DoBrowserLaunch(profile); | 306 DoBrowserLaunch(profile); |
294 } | 307 } |
295 | 308 |
| 309 void LoginUtilsImpl::FetchCookies( |
| 310 Profile* profile, |
| 311 const GaiaAuthConsumer::ClientLoginResult& credentials) { |
| 312 // Take the credentials passed in and try to exchange them for |
| 313 // full-fledged Google authentication cookies. This is |
| 314 // best-effort; it's possible that we'll fail due to network |
| 315 // troubles or some such. |
| 316 // CookieFetcher will delete itself once done. |
| 317 CookieFetcher* cf = new CookieFetcher(profile); |
| 318 cf->AttemptFetch(credentials.data); |
| 319 BootTimesLoader::Get()->AddLoginTimeMarker("CookieFetchStarted", false); |
| 320 } |
| 321 |
| 322 void LoginUtilsImpl::FetchTokens( |
| 323 Profile* profile, |
| 324 const GaiaAuthConsumer::ClientLoginResult& credentials) { |
| 325 TokenService* token_service = profile->GetTokenService(); |
| 326 token_service->UpdateCredentials(credentials); |
| 327 if (token_service->AreCredentialsValid()) { |
| 328 token_service->StartFetchingTokens(); |
| 329 } |
| 330 } |
| 331 |
296 void LoginUtilsImpl::RespectLocalePreference(PrefService* pref) { | 332 void LoginUtilsImpl::RespectLocalePreference(PrefService* pref) { |
297 std::string pref_locale = pref->GetString(prefs::kApplicationLocale); | 333 std::string pref_locale = pref->GetString(prefs::kApplicationLocale); |
298 if (pref_locale.empty()) { | 334 if (pref_locale.empty()) { |
299 // TODO(dilmah): current code will clobber existing setting in case | 335 // TODO(dilmah): current code will clobber existing setting in case |
300 // language preference was set via another device | 336 // language preference was set via another device |
301 // but still not synced yet. Profile is not synced at this point yet. | 337 // but still not synced yet. Profile is not synced at this point yet. |
302 pref->SetString(prefs::kApplicationLocale, | 338 pref->SetString(prefs::kApplicationLocale, |
303 g_browser_process->GetApplicationLocale()); | 339 g_browser_process->GetApplicationLocale()); |
304 } else { | 340 } else { |
305 LanguageSwitchMenu::SwitchLanguage(pref_locale); | 341 LanguageSwitchMenu::SwitchLanguage(pref_locale); |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
481 BrowserInit browser_init; | 517 BrowserInit browser_init; |
482 int return_code; | 518 int return_code; |
483 browser_init.LaunchBrowser(*CommandLine::ForCurrentProcess(), | 519 browser_init.LaunchBrowser(*CommandLine::ForCurrentProcess(), |
484 profile, | 520 profile, |
485 FilePath(), | 521 FilePath(), |
486 true, | 522 true, |
487 &return_code); | 523 &return_code); |
488 } | 524 } |
489 | 525 |
490 } // namespace chromeos | 526 } // namespace chromeos |
OLD | NEW |