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

Side by Side Diff: chrome/browser/policy/user_policy_signin_service.cc

Issue 11415094: Split UserCloudPolicyManager implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix DeviceCloudPolicyManagerChromeOSTest.EnrolledDevice failure. Created 8 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/policy/user_policy_signin_service.h" 5 #include "chrome/browser/policy/user_policy_signin_service.h"
6 6
7 #include "chrome/browser/browser_process.h" 7 #include "chrome/browser/browser_process.h"
8 #include "chrome/browser/policy/browser_policy_connector.h" 8 #include "chrome/browser/policy/browser_policy_connector.h"
9 #include "chrome/browser/policy/cloud_policy_service.h" 9 #include "chrome/browser/policy/cloud_policy_service.h"
10 #include "chrome/browser/policy/user_cloud_policy_manager.h" 10 #include "chrome/browser/policy/user_cloud_policy_manager.h"
11 #include "chrome/browser/policy/user_cloud_policy_manager_factory.h"
11 #include "chrome/browser/prefs/pref_service.h" 12 #include "chrome/browser/prefs/pref_service.h"
12 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/signin/signin_manager.h" 14 #include "chrome/browser/signin/signin_manager.h"
14 #include "chrome/browser/signin/signin_manager_factory.h" 15 #include "chrome/browser/signin/signin_manager_factory.h"
15 #include "chrome/browser/signin/token_service.h" 16 #include "chrome/browser/signin/token_service.h"
16 #include "chrome/browser/signin/token_service_factory.h" 17 #include "chrome/browser/signin/token_service_factory.h"
17 #include "chrome/common/chrome_notification_types.h" 18 #include "chrome/common/chrome_notification_types.h"
18 #include "chrome/common/pref_names.h" 19 #include "chrome/common/pref_names.h"
19 #include "content/public/browser/notification_details.h" 20 #include "content/public/browser/notification_details.h"
20 #include "content/public/browser/notification_source.h" 21 #include "content/public/browser/notification_source.h"
21 #include "google_apis/gaia/gaia_constants.h" 22 #include "google_apis/gaia/gaia_constants.h"
22 #include "google_apis/gaia/gaia_urls.h" 23 #include "google_apis/gaia/gaia_urls.h"
23 #include "google_apis/gaia/oauth2_access_token_fetcher.h" 24 #include "google_apis/gaia/oauth2_access_token_fetcher.h"
24 25
25 namespace { 26 namespace {
26 // TODO(atwilson): Move this once we add OAuth token support to TokenService. 27 // TODO(atwilson): Move this once we add OAuth token support to TokenService.
27 const char kServiceScopeChromeOSDeviceManagement[] = 28 const char kServiceScopeChromeOSDeviceManagement[] =
28 "https://www.googleapis.com/auth/chromeosdevicemanagement"; 29 "https://www.googleapis.com/auth/chromeosdevicemanagement";
29 30
30 // How long to delay before starting device policy network requests. Set to a 31 // How long to delay before starting device policy network requests. Set to a
31 // few seconds to alleviate contention during initial startup. 32 // few seconds to alleviate contention during initial startup.
32 const int64 kPolicyServiceInitializationDelayMilliseconds = 2000; 33 const int64 kPolicyServiceInitializationDelayMilliseconds = 2000;
33 } // namespace 34 } // namespace
34 35
35 namespace policy { 36 namespace policy {
36 37
37 UserPolicySigninService::UserPolicySigninService( 38 UserPolicySigninService::UserPolicySigninService(
38 Profile* profile, 39 Profile* profile)
39 UserCloudPolicyManager* manager) 40 : profile_(profile) {
40 : profile_(profile),
41 manager_(manager) {
42 41
43 // Initialize/shutdown the UserCloudPolicyManager when the user signs in or 42 // Initialize/shutdown the UserCloudPolicyManager when the user signs in or
44 // out. 43 // out.
45 registrar_.Add(this, 44 registrar_.Add(this,
46 chrome::NOTIFICATION_GOOGLE_SIGNED_OUT, 45 chrome::NOTIFICATION_GOOGLE_SIGNED_OUT,
47 content::Source<Profile>(profile)); 46 content::Source<Profile>(profile));
48 registrar_.Add(this, 47 registrar_.Add(this,
49 chrome::NOTIFICATION_TOKEN_AVAILABLE, 48 chrome::NOTIFICATION_TOKEN_AVAILABLE,
50 content::Source<TokenService>( 49 content::Source<TokenService>(
51 TokenServiceFactory::GetForProfile(profile))); 50 TokenServiceFactory::GetForProfile(profile)));
52 51
53 // The Profile is not yet fully initialized when this object is created, 52 // The Profile is not yet fully initialized when this object is created,
54 // so wait until the initialization has finished to initialize the 53 // so wait until the initialization has finished to initialize the
55 // UserCloudPolicyManager as otherwise various crashes ensue from services 54 // UserCloudPolicyManager as otherwise various crashes ensue from services
56 // trying to access the partially-initialized Profile. 55 // trying to access the partially-initialized Profile.
57 // TODO(atwilson): Remove this once ProfileImpl::DoFinalInit() goes away and 56 // TODO(atwilson): Remove this once ProfileImpl::DoFinalInit() goes away and
58 // the profile is fully initialized before ProfileKeyedServices are created. 57 // the profile is fully initialized before ProfileKeyedServices are created.
59 registrar_.Add(this, 58 registrar_.Add(this,
60 chrome::NOTIFICATION_PROFILE_ADDED, 59 chrome::NOTIFICATION_PROFILE_ADDED,
61 content::Source<Profile>(profile)); 60 content::Source<Profile>(profile));
62 } 61 }
63 62
64 UserPolicySigninService::~UserPolicySigninService() { 63 UserPolicySigninService::~UserPolicySigninService() {}
65 StopObserving();
66 }
67 64
68 void UserPolicySigninService::StopObserving() { 65 void UserPolicySigninService::StopObserving() {
69 if (manager_ && manager_->cloud_policy_service()) 66 UserCloudPolicyManager* manager = GetManager();
70 manager_->cloud_policy_service()->RemoveObserver(this); 67 if (manager && manager->cloud_policy_service())
68 manager->cloud_policy_service()->RemoveObserver(this);
71 } 69 }
72 70
73 void UserPolicySigninService::Observe( 71 void UserPolicySigninService::Observe(
74 int type, 72 int type,
75 const content::NotificationSource& source, 73 const content::NotificationSource& source,
76 const content::NotificationDetails& details) { 74 const content::NotificationDetails& details) {
77 switch (type) { 75 switch (type) {
78 case chrome::NOTIFICATION_PROFILE_ADDED: 76 case chrome::NOTIFICATION_PROFILE_ADDED:
79 // Profile is initialized so it's safe to initialize the 77 // Profile is initialized so it's safe to initialize the
80 // UserCloudPolicyManager now. 78 // UserCloudPolicyManager now.
(...skipping 20 matching lines...) Expand all
101 } 99 }
102 100
103 101
104 void UserPolicySigninService::ConfigureUserCloudPolicyManager() { 102 void UserPolicySigninService::ConfigureUserCloudPolicyManager() {
105 // Don't do anything unless cloud policy is enabled. 103 // Don't do anything unless cloud policy is enabled.
106 if (!profile_->GetPrefs()->GetBoolean(prefs::kLoadCloudPolicyOnSignin)) 104 if (!profile_->GetPrefs()->GetBoolean(prefs::kLoadCloudPolicyOnSignin))
107 return; 105 return;
108 106
109 // Either startup or shutdown the UserCloudPolicyManager depending on whether 107 // Either startup or shutdown the UserCloudPolicyManager depending on whether
110 // the user is signed in or not. 108 // the user is signed in or not.
111 if (!manager_) 109 UserCloudPolicyManager* manager = GetManager();
110 if (!manager)
112 return; // Can be null in unit tests. 111 return; // Can be null in unit tests.
113 112
114 SigninManager* signin_manager = SigninManagerFactory::GetForProfile(profile_); 113 SigninManager* signin_manager = SigninManagerFactory::GetForProfile(profile_);
115 if (signin_manager->GetAuthenticatedUsername().empty()) { 114 if (signin_manager->GetAuthenticatedUsername().empty()) {
116 // User has signed out - remove existing policy. 115 // User has signed out - remove existing policy.
117 StopObserving(); 116 StopObserving();
118 manager_->ShutdownAndRemovePolicy(); 117 manager->ShutdownAndRemovePolicy();
119 } else { 118 } else {
120 // Initialize the UserCloudPolicyManager if it isn't already initialized. 119 // Initialize the UserCloudPolicyManager if it isn't already initialized.
121 if (!manager_->cloud_policy_service()) { 120 if (!manager->cloud_policy_service()) {
122 // Make sure we've initialized the DeviceManagementService. It's OK to 121 // Make sure we've initialized the DeviceManagementService. It's OK to
123 // call this multiple times so we do it every time we initialize the 122 // call this multiple times so we do it every time we initialize the
124 // UserCloudPolicyManager. 123 // UserCloudPolicyManager.
125 g_browser_process->browser_policy_connector()-> 124 g_browser_process->browser_policy_connector()->
126 ScheduleServiceInitialization( 125 ScheduleServiceInitialization(
127 kPolicyServiceInitializationDelayMilliseconds); 126 kPolicyServiceInitializationDelayMilliseconds);
128 // If there is no cached DMToken then we can detect this below (or when 127 // If there is no cached DMToken then we can detect this below (or when
129 // the OnInitializationCompleted() callback is invoked. 128 // the OnInitializationCompleted() callback is invoked.
130 policy::DeviceManagementService* service = g_browser_process-> 129 policy::DeviceManagementService* service = g_browser_process->
131 browser_policy_connector()->device_management_service(); 130 browser_policy_connector()->device_management_service();
132 manager_->Initialize(g_browser_process->local_state(), 131 manager->Initialize(g_browser_process->local_state(), service);
133 service, 132 DCHECK(manager->cloud_policy_service());
134 policy::USER_AFFILIATION_NONE); 133 manager->cloud_policy_service()->AddObserver(this);
135 DCHECK(manager_->cloud_policy_service());
136 manager_->cloud_policy_service()->AddObserver(this);
137 } 134 }
138 135
139 // If the CloudPolicyService is initialized, but the CloudPolicyClient still 136 // If the CloudPolicyService is initialized, but the CloudPolicyClient still
140 // needs to be registered, kick off registration. 137 // needs to be registered, kick off registration.
141 if (manager_->cloud_policy_service()->IsInitializationComplete() && 138 if (manager->cloud_policy_service()->IsInitializationComplete() &&
142 !manager_->IsClientRegistered()) { 139 !manager->IsClientRegistered()) {
143 RegisterCloudPolicyService(); 140 RegisterCloudPolicyService();
144 } 141 }
145 } 142 }
146 } 143 }
147 144
148 void UserPolicySigninService::OnInitializationCompleted( 145 void UserPolicySigninService::OnInitializationCompleted(
149 CloudPolicyService* service) { 146 CloudPolicyService* service) {
150 DCHECK_EQ(service, manager_->cloud_policy_service()); 147 UserCloudPolicyManager* manager = GetManager();
148 DCHECK_EQ(service, manager->cloud_policy_service());
151 DCHECK(service->IsInitializationComplete()); 149 DCHECK(service->IsInitializationComplete());
152 // The service is now initialized - if the client is not yet registered, then 150 // The service is now initialized - if the client is not yet registered, then
153 // it means that there is no cached policy and so we need to initiate a new 151 // it means that there is no cached policy and so we need to initiate a new
154 // client registration. 152 // client registration.
155 DVLOG_IF(1, manager_->IsClientRegistered()) 153 DVLOG_IF(1, manager->IsClientRegistered())
156 << "Client already registered - not fetching DMToken"; 154 << "Client already registered - not fetching DMToken";
157 if (!manager_->IsClientRegistered()) 155 if (!manager->IsClientRegistered())
158 RegisterCloudPolicyService(); 156 RegisterCloudPolicyService();
159 } 157 }
160 158
161 void UserPolicySigninService::RegisterCloudPolicyService() { 159 void UserPolicySigninService::RegisterCloudPolicyService() {
162 DVLOG(1) << "Fetching new DM Token"; 160 DVLOG(1) << "Fetching new DM Token";
163 // TODO(atwilson): Move the code to mint the devicemanagement token into 161 // TODO(atwilson): Move the code to mint the devicemanagement token into
164 // TokenService. 162 // TokenService.
165 std::string token = TokenServiceFactory::GetForProfile(profile_)-> 163 std::string token = TokenServiceFactory::GetForProfile(profile_)->
166 GetOAuth2LoginRefreshToken(); 164 GetOAuth2LoginRefreshToken();
167 if (token.empty()) { 165 if (token.empty()) {
(...skipping 16 matching lines...) Expand all
184 gaia_urls->oauth2_chrome_client_secret(), 182 gaia_urls->oauth2_chrome_client_secret(),
185 token, 183 token,
186 scopes); 184 scopes);
187 } 185 }
188 186
189 void UserPolicySigninService::OnGetTokenFailure( 187 void UserPolicySigninService::OnGetTokenFailure(
190 const GoogleServiceAuthError& error) { 188 const GoogleServiceAuthError& error) {
191 DLOG(WARNING) << "Could not fetch access token for " 189 DLOG(WARNING) << "Could not fetch access token for "
192 << kServiceScopeChromeOSDeviceManagement; 190 << kServiceScopeChromeOSDeviceManagement;
193 oauth2_access_token_fetcher_.reset(); 191 oauth2_access_token_fetcher_.reset();
194 manager_->CancelWaitForPolicyFetch();
195 } 192 }
196 193
197 void UserPolicySigninService::OnGetTokenSuccess( 194 void UserPolicySigninService::OnGetTokenSuccess(
198 const std::string& access_token, 195 const std::string& access_token,
199 const base::Time& expiration_time) { 196 const base::Time& expiration_time) {
197 UserCloudPolicyManager* manager = GetManager();
200 // Pass along the new access token to the CloudPolicyClient. 198 // Pass along the new access token to the CloudPolicyClient.
201 DVLOG(1) << "Fetched new scoped OAuth token:" << access_token; 199 DVLOG(1) << "Fetched new scoped OAuth token:" << access_token;
202 manager_->RegisterClient(access_token); 200 manager->RegisterClient(access_token);
203 oauth2_access_token_fetcher_.reset(); 201 oauth2_access_token_fetcher_.reset();
204 } 202 }
205 203
204 void UserPolicySigninService::Shutdown() {
205 StopObserving();
206 }
207
208 UserCloudPolicyManager* UserPolicySigninService::GetManager() {
209 return UserCloudPolicyManagerFactory::GetForProfile(profile_);
210 }
211
206 } // namespace policy 212 } // namespace policy
OLDNEW
« no previous file with comments | « chrome/browser/policy/user_policy_signin_service.h ('k') | chrome/browser/policy/user_policy_signin_service_factory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698