OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/signin/signin_manager.h" | 5 #include "chrome/browser/signin/signin_manager.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
11 #include "base/strings/string_split.h" | 11 #include "base/strings/string_split.h" |
12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
14 #include "base/time/time.h" | 14 #include "base/time/time.h" |
15 #include "chrome/browser/chrome_notification_types.h" | 15 #include "chrome/browser/chrome_notification_types.h" |
16 #include "chrome/browser/profiles/profile_io_data.h" | 16 #include "chrome/browser/profiles/profile_io_data.h" |
17 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" | 17 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h" |
18 #include "chrome/browser/signin/signin_account_id_helper.h" | 18 #include "chrome/browser/signin/signin_account_id_helper.h" |
19 #include "chrome/common/pref_names.h" | 19 #include "chrome/common/pref_names.h" |
20 #include "chrome/common/profile_management_switches.h" | 20 #include "chrome/common/profile_management_switches.h" |
21 #include "components/signin/core/browser/profile_oauth2_token_service.h" | 21 #include "components/signin/core/browser/profile_oauth2_token_service.h" |
22 #include "components/signin/core/browser/signin_client.h" | 22 #include "components/signin/core/browser/signin_client.h" |
23 #include "components/signin/core/browser/signin_internals_util.h" | 23 #include "components/signin/core/browser/signin_internals_util.h" |
24 #include "components/signin/core/browser/signin_manager_cookie_helper.h" | 24 #include "components/signin/core/browser/signin_manager_cookie_helper.h" |
25 #include "content/public/browser/notification_service.h" | 25 #include "content/public/browser/notification_service.h" |
26 #include "content/public/browser/render_process_host.h" | |
27 #include "content/public/common/child_process_host.h" | |
28 #include "google_apis/gaia/gaia_auth_util.h" | 26 #include "google_apis/gaia/gaia_auth_util.h" |
29 #include "google_apis/gaia/gaia_urls.h" | 27 #include "google_apis/gaia/gaia_urls.h" |
30 #include "net/base/escape.h" | 28 #include "net/base/escape.h" |
31 #include "third_party/icu/source/i18n/unicode/regex.h" | 29 #include "third_party/icu/source/i18n/unicode/regex.h" |
32 | 30 |
33 using namespace signin_internals_util; | 31 using namespace signin_internals_util; |
34 | 32 |
35 using content::ChildProcessHost; | |
36 using content::RenderProcessHost; | |
37 | |
38 namespace { | 33 namespace { |
39 | 34 |
40 const char kChromiumSyncService[] = "service=chromiumsync"; | 35 const char kChromiumSyncService[] = "service=chromiumsync"; |
41 | 36 |
42 } // namespace | 37 } // namespace |
43 | 38 |
44 // Under the covers, we use a dummy chrome-extension ID to serve the purposes | 39 // Under the covers, we use a dummy chrome-extension ID to serve the purposes |
45 // outlined in the .h file comment for this string. | 40 // outlined in the .h file comment for this string. |
46 const char SigninManager::kChromeSigninEffectiveSite[] = | 41 const char SigninManager::kChromeSigninEffectiveSite[] = |
47 "chrome-extension://acfccoigjajmmgbhpfbjnpckhjjegnih"; | 42 "chrome-extension://acfccoigjajmmgbhpfbjnpckhjjegnih"; |
(...skipping 17 matching lines...) Expand all Loading... |
65 url.query(), net::UnescapeRule::URL_SPECIAL_CHARS) | 60 url.query(), net::UnescapeRule::URL_SPECIAL_CHARS) |
66 .find(kChromiumSyncService) != std::string::npos; | 61 .find(kChromiumSyncService) != std::string::npos; |
67 } | 62 } |
68 | 63 |
69 SigninManager::SigninManager(SigninClient* client) | 64 SigninManager::SigninManager(SigninClient* client) |
70 : SigninManagerBase(client), | 65 : SigninManagerBase(client), |
71 profile_(NULL), | 66 profile_(NULL), |
72 prohibit_signout_(false), | 67 prohibit_signout_(false), |
73 type_(SIGNIN_TYPE_NONE), | 68 type_(SIGNIN_TYPE_NONE), |
74 weak_pointer_factory_(this), | 69 weak_pointer_factory_(this), |
75 signin_host_id_(ChildProcessHost::kInvalidUniqueID), | |
76 client_(client) {} | 70 client_(client) {} |
77 | 71 |
78 void SigninManager::SetSigninProcess(int process_id) { | |
79 if (process_id == signin_host_id_) | |
80 return; | |
81 DLOG_IF(WARNING, | |
82 signin_host_id_ != ChildProcessHost::kInvalidUniqueID) | |
83 << "Replacing in-use signin process."; | |
84 signin_host_id_ = process_id; | |
85 RenderProcessHost* host = RenderProcessHost::FromID(process_id); | |
86 DCHECK(host); | |
87 host->AddObserver(this); | |
88 signin_hosts_observed_.insert(host); | |
89 } | |
90 | |
91 void SigninManager::ClearSigninProcess() { | |
92 signin_host_id_ = ChildProcessHost::kInvalidUniqueID; | |
93 } | |
94 | |
95 bool SigninManager::IsSigninProcess(int process_id) const { | |
96 return process_id == signin_host_id_; | |
97 } | |
98 | |
99 bool SigninManager::HasSigninProcess() const { | |
100 return signin_host_id_ != ChildProcessHost::kInvalidUniqueID; | |
101 } | |
102 | |
103 void SigninManager::AddMergeSessionObserver( | 72 void SigninManager::AddMergeSessionObserver( |
104 MergeSessionHelper::Observer* observer) { | 73 MergeSessionHelper::Observer* observer) { |
105 if (merge_session_helper_) | 74 if (merge_session_helper_) |
106 merge_session_helper_->AddObserver(observer); | 75 merge_session_helper_->AddObserver(observer); |
107 } | 76 } |
108 | 77 |
109 void SigninManager::RemoveMergeSessionObserver( | 78 void SigninManager::RemoveMergeSessionObserver( |
110 MergeSessionHelper::Observer* observer) { | 79 MergeSessionHelper::Observer* observer) { |
111 if (merge_session_helper_) | 80 if (merge_session_helper_) |
112 merge_session_helper_->RemoveObserver(observer); | 81 merge_session_helper_->RemoveObserver(observer); |
113 } | 82 } |
114 | 83 |
115 SigninManager::~SigninManager() { | 84 SigninManager::~SigninManager() { |
116 std::set<RenderProcessHost*>::iterator i; | |
117 for (i = signin_hosts_observed_.begin(); | |
118 i != signin_hosts_observed_.end(); | |
119 ++i) { | |
120 (*i)->RemoveObserver(this); | |
121 } | |
122 } | 85 } |
123 | 86 |
124 void SigninManager::InitTokenService() { | 87 void SigninManager::InitTokenService() { |
125 ProfileOAuth2TokenService* token_service = | 88 ProfileOAuth2TokenService* token_service = |
126 ProfileOAuth2TokenServiceFactory::GetForProfile(profile_); | 89 ProfileOAuth2TokenServiceFactory::GetForProfile(profile_); |
127 const std::string& account_id = GetAuthenticatedUsername(); | 90 const std::string& account_id = GetAuthenticatedUsername(); |
128 if (token_service && !account_id.empty()) | 91 if (token_service && !account_id.empty()) |
129 token_service->LoadCredentials(account_id); | 92 token_service->LoadCredentials(account_id); |
130 } | 93 } |
131 | 94 |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 FOR_EACH_OBSERVER(Observer, observer_list_, | 401 FOR_EACH_OBSERVER(Observer, observer_list_, |
439 GoogleSigninSucceeded(GetAuthenticatedUsername(), | 402 GoogleSigninSucceeded(GetAuthenticatedUsername(), |
440 password_)); | 403 password_)); |
441 | 404 |
442 client_->GoogleSigninSucceeded(GetAuthenticatedUsername(), password_); | 405 client_->GoogleSigninSucceeded(GetAuthenticatedUsername(), password_); |
443 | 406 |
444 password_.clear(); // Don't need it anymore. | 407 password_.clear(); // Don't need it anymore. |
445 DisableOneClickSignIn(profile_); // Don't ever offer again. | 408 DisableOneClickSignIn(profile_); // Don't ever offer again. |
446 } | 409 } |
447 | 410 |
448 void SigninManager::RenderProcessHostDestroyed(RenderProcessHost* host) { | |
449 // It's possible we're listening to a "stale" renderer because it was replaced | |
450 // with a new process by process-per-site. In either case, stop observing it, | |
451 // but only reset signin_host_id_ tracking if this was from the current signin | |
452 // process. | |
453 signin_hosts_observed_.erase(host); | |
454 if (signin_host_id_ == host->GetID()) | |
455 signin_host_id_ = ChildProcessHost::kInvalidUniqueID; | |
456 } | |
457 | |
458 void SigninManager::ProhibitSignout(bool prohibit_signout) { | 411 void SigninManager::ProhibitSignout(bool prohibit_signout) { |
459 prohibit_signout_ = prohibit_signout; | 412 prohibit_signout_ = prohibit_signout; |
460 } | 413 } |
461 | 414 |
462 bool SigninManager::IsSignoutProhibited() const { | 415 bool SigninManager::IsSignoutProhibited() const { |
463 return prohibit_signout_; | 416 return prohibit_signout_; |
464 } | 417 } |
OLD | NEW |