| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/policy/user_policy_signin_service.h" | |
| 6 | |
| 7 #include <vector> | |
| 8 | |
| 9 #include "base/command_line.h" | |
| 10 #include "base/prefs/pref_service.h" | |
| 11 #include "base/values.h" | |
| 12 #include "chrome/browser/browser_process.h" | |
| 13 #include "chrome/browser/policy/browser_policy_connector.h" | |
| 14 #include "chrome/browser/policy/cloud_policy_client.h" | |
| 15 #include "chrome/browser/policy/cloud_policy_service.h" | |
| 16 #include "chrome/browser/policy/user_cloud_policy_manager.h" | |
| 17 #include "chrome/browser/policy/user_cloud_policy_manager_factory.h" | |
| 18 #include "chrome/browser/policy/user_info_fetcher.h" | |
| 19 #include "chrome/browser/profiles/profile.h" | |
| 20 #include "chrome/browser/profiles/profile_manager.h" | |
| 21 #include "chrome/browser/signin/signin_manager.h" | |
| 22 #include "chrome/browser/signin/signin_manager_factory.h" | |
| 23 #include "chrome/browser/signin/token_service.h" | |
| 24 #include "chrome/browser/signin/token_service_factory.h" | |
| 25 #include "chrome/common/chrome_notification_types.h" | |
| 26 #include "chrome/common/chrome_switches.h" | |
| 27 #include "chrome/common/pref_names.h" | |
| 28 #include "content/public/browser/notification_details.h" | |
| 29 #include "content/public/browser/notification_source.h" | |
| 30 #include "google_apis/gaia/gaia_constants.h" | |
| 31 #include "google_apis/gaia/gaia_urls.h" | |
| 32 #include "google_apis/gaia/oauth2_access_token_consumer.h" | |
| 33 #include "google_apis/gaia/oauth2_access_token_fetcher.h" | |
| 34 | |
| 35 namespace em = enterprise_management; | |
| 36 | |
| 37 namespace { | |
| 38 | |
| 39 // Various OAuth service scopes required to do CloudPolicyClient registration. | |
| 40 const char kServiceScopeChromeOSDeviceManagement[] = | |
| 41 "https://www.googleapis.com/auth/chromeosdevicemanagement"; | |
| 42 const char kServiceScopeGetUserInfo[] = | |
| 43 "https://www.googleapis.com/auth/userinfo.email"; | |
| 44 | |
| 45 // The key under which the hosted-domain value is stored in the UserInfo | |
| 46 // response. | |
| 47 const char kGetHostedDomainKey[] = "hd"; | |
| 48 | |
| 49 bool ShouldForceLoadPolicy() { | |
| 50 return CommandLine::ForCurrentProcess()->HasSwitch( | |
| 51 switches::kForceLoadCloudPolicy); | |
| 52 } | |
| 53 | |
| 54 } // namespace | |
| 55 | |
| 56 namespace policy { | |
| 57 | |
| 58 // Helper class that registers a CloudPolicyClient and returns the associated | |
| 59 // DMToken to the caller. | |
| 60 class CloudPolicyClientRegistrationHelper | |
| 61 : public policy::CloudPolicyClient::Observer, | |
| 62 public OAuth2AccessTokenConsumer, | |
| 63 public policy::UserInfoFetcher::Delegate { | |
| 64 public: | |
| 65 explicit CloudPolicyClientRegistrationHelper( | |
| 66 net::URLRequestContextGetter* context); | |
| 67 | |
| 68 virtual ~CloudPolicyClientRegistrationHelper(); | |
| 69 | |
| 70 // Starts the client registration process. Callback is invoked when the | |
| 71 // registration is complete. | |
| 72 void StartRegistration(policy::CloudPolicyClient* client, | |
| 73 const std::string& oauth2_login_token, | |
| 74 base::Closure callback); | |
| 75 | |
| 76 // OAuth2AccessTokenConsumer implementation. | |
| 77 virtual void OnGetTokenSuccess(const std::string& access_token, | |
| 78 const base::Time& expiration_time) OVERRIDE; | |
| 79 virtual void OnGetTokenFailure(const GoogleServiceAuthError& error) OVERRIDE; | |
| 80 | |
| 81 // UserInfoFetcher::Delegate implementation: | |
| 82 virtual void OnGetUserInfoSuccess(const DictionaryValue* response) OVERRIDE; | |
| 83 virtual void OnGetUserInfoFailure( | |
| 84 const GoogleServiceAuthError& error) OVERRIDE; | |
| 85 | |
| 86 // CloudPolicyClient::Observer implementation. | |
| 87 virtual void OnPolicyFetched(policy::CloudPolicyClient* client) OVERRIDE {} | |
| 88 virtual void OnRegistrationStateChanged( | |
| 89 policy::CloudPolicyClient* client) OVERRIDE; | |
| 90 virtual void OnClientError(policy::CloudPolicyClient* client) OVERRIDE; | |
| 91 | |
| 92 private: | |
| 93 // Invoked when the registration request has been completed. | |
| 94 void RequestCompleted(); | |
| 95 | |
| 96 // Fetcher used while obtaining an OAuth token for client registration. | |
| 97 scoped_ptr<OAuth2AccessTokenFetcher> oauth2_access_token_fetcher_; | |
| 98 | |
| 99 // Helper class for fetching information from GAIA about the currently | |
| 100 // signed-in user. | |
| 101 scoped_ptr<policy::UserInfoFetcher> user_info_fetcher_; | |
| 102 | |
| 103 // Access token used to register the CloudPolicyClient and also access | |
| 104 // GAIA to get information about the signed in user. | |
| 105 std::string oauth_access_token_; | |
| 106 | |
| 107 net::URLRequestContextGetter* context_; | |
| 108 policy::CloudPolicyClient* client_; | |
| 109 base::Closure callback_; | |
| 110 }; | |
| 111 | |
| 112 CloudPolicyClientRegistrationHelper::CloudPolicyClientRegistrationHelper( | |
| 113 net::URLRequestContextGetter* context) : context_(context) { | |
| 114 DCHECK(context_); | |
| 115 } | |
| 116 | |
| 117 CloudPolicyClientRegistrationHelper::~CloudPolicyClientRegistrationHelper() { | |
| 118 // Clean up any pending observers in case the browser is shutdown while | |
| 119 // trying to register for policy. | |
| 120 if (client_) | |
| 121 client_->RemoveObserver(this); | |
| 122 } | |
| 123 | |
| 124 void CloudPolicyClientRegistrationHelper::RequestCompleted() { | |
| 125 if (client_) { | |
| 126 client_->RemoveObserver(this); | |
| 127 // |client_| may be freed by the callback so clear it now. | |
| 128 client_ = NULL; | |
| 129 callback_.Run(); | |
| 130 } | |
| 131 } | |
| 132 | |
| 133 void CloudPolicyClientRegistrationHelper::StartRegistration( | |
| 134 policy::CloudPolicyClient* client, | |
| 135 const std::string& login_token, | |
| 136 base::Closure callback) { | |
| 137 DVLOG(1) << "Starting registration process"; | |
| 138 DCHECK(client); | |
| 139 DCHECK(!client->is_registered()); | |
| 140 client_ = client; | |
| 141 callback_ = callback; | |
| 142 client_->AddObserver(this); | |
| 143 | |
| 144 // Start fetching an OAuth2 access token for the device management and | |
| 145 // userinfo services. | |
| 146 oauth2_access_token_fetcher_.reset( | |
| 147 new OAuth2AccessTokenFetcher(this, context_)); | |
| 148 std::vector<std::string> scopes; | |
| 149 scopes.push_back(kServiceScopeChromeOSDeviceManagement); | |
| 150 scopes.push_back(kServiceScopeGetUserInfo); | |
| 151 GaiaUrls* gaia_urls = GaiaUrls::GetInstance(); | |
| 152 oauth2_access_token_fetcher_->Start( | |
| 153 gaia_urls->oauth2_chrome_client_id(), | |
| 154 gaia_urls->oauth2_chrome_client_secret(), | |
| 155 login_token, | |
| 156 scopes); | |
| 157 } | |
| 158 | |
| 159 void CloudPolicyClientRegistrationHelper::OnGetTokenFailure( | |
| 160 const GoogleServiceAuthError& error) { | |
| 161 DLOG(WARNING) << "Could not fetch access token for " | |
| 162 << kServiceScopeChromeOSDeviceManagement; | |
| 163 oauth2_access_token_fetcher_.reset(); | |
| 164 | |
| 165 // Invoke the callback to let them know the fetch failed. | |
| 166 RequestCompleted(); | |
| 167 } | |
| 168 | |
| 169 void CloudPolicyClientRegistrationHelper::OnGetTokenSuccess( | |
| 170 const std::string& access_token, | |
| 171 const base::Time& expiration_time) { | |
| 172 // Cache the access token to be used after the GetUserInfo call. | |
| 173 oauth_access_token_ = access_token; | |
| 174 DVLOG(1) << "Fetched new scoped OAuth token:" << oauth_access_token_; | |
| 175 oauth2_access_token_fetcher_.reset(); | |
| 176 // Now we've gotten our access token - contact GAIA to see if this is a | |
| 177 // hosted domain. | |
| 178 user_info_fetcher_.reset(new policy::UserInfoFetcher(this, context_)); | |
| 179 user_info_fetcher_->Start(oauth_access_token_); | |
| 180 } | |
| 181 | |
| 182 void CloudPolicyClientRegistrationHelper::OnGetUserInfoFailure( | |
| 183 const GoogleServiceAuthError& error) { | |
| 184 DVLOG(1) << "Failed to fetch user info from GAIA: " << error.state(); | |
| 185 user_info_fetcher_.reset(); | |
| 186 RequestCompleted(); | |
| 187 } | |
| 188 | |
| 189 void CloudPolicyClientRegistrationHelper::OnGetUserInfoSuccess( | |
| 190 const DictionaryValue* data) { | |
| 191 user_info_fetcher_.reset(); | |
| 192 if (!data->HasKey(kGetHostedDomainKey) && !ShouldForceLoadPolicy()) { | |
| 193 DVLOG(1) << "User not from a hosted domain - skipping registration"; | |
| 194 RequestCompleted(); | |
| 195 return; | |
| 196 } | |
| 197 DVLOG(1) << "Registering CloudPolicyClient for user from hosted domain"; | |
| 198 // The user is from a hosted domain, so it's OK to register the | |
| 199 // CloudPolicyClient and make requests to DMServer. | |
| 200 if (client_->is_registered()) { | |
| 201 // Client should not be registered yet. | |
| 202 NOTREACHED(); | |
| 203 RequestCompleted(); | |
| 204 return; | |
| 205 } | |
| 206 | |
| 207 // Kick off registration of the CloudPolicyClient with our newly minted | |
| 208 // oauth_access_token_. | |
| 209 client_->Register(em::DeviceRegisterRequest::BROWSER, oauth_access_token_, | |
| 210 std::string(), false); | |
| 211 } | |
| 212 | |
| 213 void CloudPolicyClientRegistrationHelper::OnRegistrationStateChanged( | |
| 214 policy::CloudPolicyClient* client) { | |
| 215 DVLOG(1) << "Client registration succeeded"; | |
| 216 DCHECK_EQ(client, client_); | |
| 217 DCHECK(client->is_registered()); | |
| 218 RequestCompleted(); | |
| 219 } | |
| 220 | |
| 221 void CloudPolicyClientRegistrationHelper::OnClientError( | |
| 222 policy::CloudPolicyClient* client) { | |
| 223 DVLOG(1) << "Client registration failed"; | |
| 224 DCHECK_EQ(client, client_); | |
| 225 RequestCompleted(); | |
| 226 } | |
| 227 | |
| 228 UserPolicySigninService::UserPolicySigninService( | |
| 229 Profile* profile) | |
| 230 : profile_(profile) { | |
| 231 CommandLine* cmd_line = CommandLine::ForCurrentProcess(); | |
| 232 if (profile_->GetPrefs()->GetBoolean(prefs::kDisableCloudPolicyOnSignin) || | |
| 233 ProfileManager::IsImportProcess(*cmd_line)) { | |
| 234 return; | |
| 235 } | |
| 236 | |
| 237 // Initialize/shutdown the UserCloudPolicyManager when the user signs out. | |
| 238 registrar_.Add(this, | |
| 239 chrome::NOTIFICATION_GOOGLE_SIGNED_OUT, | |
| 240 content::Source<Profile>(profile)); | |
| 241 | |
| 242 // Listen for an OAuth token to become available so we can register a client | |
| 243 // if for some reason the client is not already registered (for example, if | |
| 244 // the policy load failed during initial signin). | |
| 245 registrar_.Add(this, | |
| 246 chrome::NOTIFICATION_TOKEN_AVAILABLE, | |
| 247 content::Source<TokenService>( | |
| 248 TokenServiceFactory::GetForProfile(profile))); | |
| 249 | |
| 250 // TokenService should not yet have loaded its tokens since this happens in | |
| 251 // the background after PKS initialization - so this service should always be | |
| 252 // created before the oauth token is available. | |
| 253 DCHECK(!TokenServiceFactory::GetForProfile(profile_)->HasOAuthLoginToken()); | |
| 254 | |
| 255 // Register a listener to be called back once the current profile has finished | |
| 256 // initializing, so we can startup the UserCloudPolicyManager. | |
| 257 registrar_.Add(this, | |
| 258 chrome::NOTIFICATION_PROFILE_ADDED, | |
| 259 content::Source<Profile>(profile)); | |
| 260 | |
| 261 // Register a listener for the import finished notification in a first run | |
| 262 // scenario, which indicates the profile is ready to be further initialized. | |
| 263 registrar_.Add(this, | |
| 264 chrome::NOTIFICATION_IMPORT_FINISHED, | |
| 265 content::Source<Profile>(profile)); | |
| 266 } | |
| 267 | |
| 268 UserPolicySigninService::~UserPolicySigninService() {} | |
| 269 | |
| 270 void UserPolicySigninService::RegisterPolicyClient( | |
| 271 const std::string& username, | |
| 272 const std::string& oauth2_refresh_token, | |
| 273 const PolicyRegistrationCallback& callback) { | |
| 274 DCHECK(!username.empty()); | |
| 275 DCHECK(!oauth2_refresh_token.empty()); | |
| 276 // We should not be called with a client already initialized. | |
| 277 DCHECK(!GetManager() || !GetManager()->core()->client()); | |
| 278 | |
| 279 // If the user should not get policy, just bail out. | |
| 280 if (!GetManager() || !ShouldLoadPolicyForUser(username)) { | |
| 281 DVLOG(1) << "Signed in user is not in the whitelist"; | |
| 282 callback.Run(scoped_ptr<CloudPolicyClient>().Pass()); | |
| 283 return; | |
| 284 } | |
| 285 | |
| 286 // If the DeviceManagementService is not yet initialized, start it up now. | |
| 287 g_browser_process->browser_policy_connector()-> | |
| 288 ScheduleServiceInitialization(0); | |
| 289 | |
| 290 // Create a new CloudPolicyClient for fetching the DMToken. | |
| 291 scoped_ptr<CloudPolicyClient> policy_client( | |
| 292 UserCloudPolicyManager::CreateCloudPolicyClient( | |
| 293 g_browser_process->browser_policy_connector()-> | |
| 294 device_management_service())); | |
| 295 | |
| 296 registration_helper_.reset( | |
| 297 new CloudPolicyClientRegistrationHelper(profile_->GetRequestContext())); | |
| 298 | |
| 299 // Fire off the registration process. Callback keeps the CloudPolicyClient | |
| 300 // alive for the length of the registration process. | |
| 301 // Grab a pointer to the client before base::Bind() clears the reference in | |
| 302 // |policy_client|. | |
| 303 CloudPolicyClient* client = policy_client.get(); | |
| 304 base::Closure registration_callback = | |
| 305 base::Bind(&UserPolicySigninService::CallPolicyRegistrationCallback, | |
| 306 base::Unretained(this), base::Passed(&policy_client), | |
| 307 callback); | |
| 308 registration_helper_->StartRegistration( | |
| 309 client, oauth2_refresh_token, registration_callback); | |
| 310 } | |
| 311 | |
| 312 void UserPolicySigninService::CallPolicyRegistrationCallback( | |
| 313 scoped_ptr<CloudPolicyClient> client, | |
| 314 PolicyRegistrationCallback callback) { | |
| 315 registration_helper_.reset(); | |
| 316 if (!client->is_registered()) { | |
| 317 // Registration failed, so free the client and pass NULL to the callback. | |
| 318 client.reset(); | |
| 319 } | |
| 320 callback.Run(client.Pass()); | |
| 321 } | |
| 322 | |
| 323 void UserPolicySigninService::FetchPolicyForSignedInUser( | |
| 324 scoped_ptr<CloudPolicyClient> client, | |
| 325 const PolicyFetchCallback& callback) { | |
| 326 DCHECK(client); | |
| 327 DCHECK(client->is_registered()); | |
| 328 // The user has just signed in, so the UserCloudPolicyManager should not yet | |
| 329 // be initialized. This routine will initialize the UserCloudPolicyManager | |
| 330 // with the passed client and will proactively ask the client to fetch | |
| 331 // policy without waiting for the CloudPolicyService to finish initialization. | |
| 332 UserCloudPolicyManager* manager = GetManager(); | |
| 333 DCHECK(manager); | |
| 334 DCHECK(!manager->core()->client()); | |
| 335 InitializeUserCloudPolicyManager(client.Pass()); | |
| 336 DCHECK(manager->IsClientRegistered()); | |
| 337 | |
| 338 // Now initiate a policy fetch. | |
| 339 manager->core()->service()->RefreshPolicy(callback); | |
| 340 } | |
| 341 | |
| 342 void UserPolicySigninService::StopObserving() { | |
| 343 UserCloudPolicyManager* manager = GetManager(); | |
| 344 if (manager && manager->core()->service()) | |
| 345 manager->core()->service()->RemoveObserver(this); | |
| 346 } | |
| 347 | |
| 348 void UserPolicySigninService::StartObserving() { | |
| 349 UserCloudPolicyManager* manager = GetManager(); | |
| 350 // Manager should be fully initialized by now. | |
| 351 DCHECK(manager); | |
| 352 DCHECK(manager->core()->service()); | |
| 353 manager->core()->service()->AddObserver(this); | |
| 354 } | |
| 355 | |
| 356 void UserPolicySigninService::Observe( | |
| 357 int type, | |
| 358 const content::NotificationSource& source, | |
| 359 const content::NotificationDetails& details) { | |
| 360 // If an import process is running, wait for NOTIFICATION_IMPORT_FINISHED | |
| 361 // before potentially creating the SigninManager. Its dependencies can access | |
| 362 // databases that the import process is also accessing, causing conflicts. | |
| 363 // Note that the profile manager is NULL in unit tests. | |
| 364 if (g_browser_process->profile_manager() && | |
| 365 g_browser_process->profile_manager()->will_import()) { | |
| 366 DCHECK_EQ(chrome::NOTIFICATION_PROFILE_ADDED, type); | |
| 367 return; | |
| 368 } | |
| 369 | |
| 370 // If using a TestingProfile with no SigninManager or UserCloudPolicyManager, | |
| 371 // skip initialization. | |
| 372 if (!GetManager() || !SigninManagerFactory::GetForProfile(profile_)) { | |
| 373 DVLOG(1) << "Skipping initialization for tests due to missing components."; | |
| 374 return; | |
| 375 } | |
| 376 | |
| 377 switch (type) { | |
| 378 case chrome::NOTIFICATION_GOOGLE_SIGNED_OUT: | |
| 379 ShutdownUserCloudPolicyManager(); | |
| 380 break; | |
| 381 case chrome::NOTIFICATION_IMPORT_FINISHED: | |
| 382 case chrome::NOTIFICATION_PROFILE_ADDED: { | |
| 383 // A new profile has been loaded - if it's signed in, then initialize the | |
| 384 // UCPM, otherwise shut down the UCPM (which deletes any cached policy | |
| 385 // data). This must be done here instead of at constructor time because | |
| 386 // the Profile is not fully initialized when this object is constructed | |
| 387 // (DoFinalInit() has not yet been called, so ProfileIOData and | |
| 388 // SSLConfigServiceManager have not been created yet). | |
| 389 // TODO(atwilson): Switch to using a timer instead, to avoid contention | |
| 390 // with other services at startup (http://crbug.com/165468). | |
| 391 SigninManager* signin_manager = | |
| 392 SigninManagerFactory::GetForProfile(profile_); | |
| 393 std::string username = signin_manager->GetAuthenticatedUsername(); | |
| 394 if (username.empty()) | |
| 395 ShutdownUserCloudPolicyManager(); | |
| 396 else | |
| 397 InitializeForSignedInUser(); | |
| 398 break; | |
| 399 } | |
| 400 case chrome::NOTIFICATION_TOKEN_AVAILABLE: { | |
| 401 const TokenService::TokenAvailableDetails& token_details = | |
| 402 *(content::Details<const TokenService::TokenAvailableDetails>( | |
| 403 details).ptr()); | |
| 404 if (token_details.service() == | |
| 405 GaiaConstants::kGaiaOAuth2LoginRefreshToken) { | |
| 406 SigninManager* signin_manager = | |
| 407 SigninManagerFactory::GetForProfile(profile_); | |
| 408 std::string username = signin_manager->GetAuthenticatedUsername(); | |
| 409 // Should not have GAIA tokens if the user isn't signed in. | |
| 410 DCHECK(!username.empty()); | |
| 411 // TokenService now has a refresh token (implying that the user is | |
| 412 // signed in) so initialize the UserCloudPolicyManager. | |
| 413 InitializeForSignedInUser(); | |
| 414 } | |
| 415 break; | |
| 416 } | |
| 417 default: | |
| 418 NOTREACHED(); | |
| 419 } | |
| 420 } | |
| 421 | |
| 422 bool UserPolicySigninService::ShouldLoadPolicyForUser( | |
| 423 const std::string& username) { | |
| 424 if (profile_->GetPrefs()->GetBoolean(prefs::kDisableCloudPolicyOnSignin)) | |
| 425 return false; // Cloud policy is disabled. | |
| 426 | |
| 427 if (username.empty()) | |
| 428 return false; // Not signed in. | |
| 429 | |
| 430 if (ShouldForceLoadPolicy()) | |
| 431 return true; | |
| 432 | |
| 433 return !BrowserPolicyConnector::IsNonEnterpriseUser(username); | |
| 434 } | |
| 435 | |
| 436 void UserPolicySigninService::InitializeUserCloudPolicyManager( | |
| 437 scoped_ptr<CloudPolicyClient> client) { | |
| 438 UserCloudPolicyManager* manager = GetManager(); | |
| 439 DCHECK(!manager->core()->client()); | |
| 440 // If there is no cached DMToken then we can detect this below (or when | |
| 441 // the OnInitializationCompleted() callback is invoked). | |
| 442 manager->Connect(g_browser_process->local_state(), client.Pass()); | |
| 443 DCHECK(manager->core()->service()); | |
| 444 StartObserving(); | |
| 445 ProhibitSignoutIfNeeded(); | |
| 446 } | |
| 447 | |
| 448 void UserPolicySigninService::InitializeForSignedInUser() { | |
| 449 SigninManager* signin_manager = | |
| 450 SigninManagerFactory::GetForProfile(profile_); | |
| 451 std::string username = signin_manager->GetAuthenticatedUsername(); | |
| 452 | |
| 453 if (!ShouldLoadPolicyForUser(username)) { | |
| 454 DVLOG(1) << "Policy load not enabled for user: " << username; | |
| 455 return; | |
| 456 } | |
| 457 DCHECK(!username.empty()); | |
| 458 | |
| 459 UserCloudPolicyManager* manager = GetManager(); | |
| 460 // Initialize the UCPM if it is not already initialized. | |
| 461 if (!manager->core()->service()) { | |
| 462 // If there is no cached DMToken then we can detect this when the | |
| 463 // OnInitializationCompleted() callback is invoked and this will | |
| 464 // initiate a policy fetch. | |
| 465 BrowserPolicyConnector* connector = | |
| 466 g_browser_process->browser_policy_connector(); | |
| 467 InitializeUserCloudPolicyManager( | |
| 468 UserCloudPolicyManager::CreateCloudPolicyClient( | |
| 469 connector->device_management_service()).Pass()); | |
| 470 } | |
| 471 | |
| 472 // If the CloudPolicyService is initialized, kick off registration. If the | |
| 473 // TokenService doesn't have an OAuth token yet (e.g. this is during initial | |
| 474 // signin, or when dynamically loading a signed-in policy) this does nothing | |
| 475 // until the OAuth token is loaded. | |
| 476 if (manager->core()->service()->IsInitializationComplete()) | |
| 477 OnInitializationCompleted(manager->core()->service()); | |
| 478 } | |
| 479 | |
| 480 void UserPolicySigninService::ShutdownUserCloudPolicyManager() { | |
| 481 // Stop any in-progress token fetch. | |
| 482 registration_helper_.reset(); | |
| 483 | |
| 484 StopObserving(); | |
| 485 | |
| 486 UserCloudPolicyManager* manager = GetManager(); | |
| 487 if (manager) // Can be null in unit tests. | |
| 488 manager->DisconnectAndRemovePolicy(); | |
| 489 } | |
| 490 | |
| 491 void UserPolicySigninService::OnInitializationCompleted( | |
| 492 CloudPolicyService* service) { | |
| 493 UserCloudPolicyManager* manager = GetManager(); | |
| 494 DCHECK_EQ(service, manager->core()->service()); | |
| 495 DCHECK(service->IsInitializationComplete()); | |
| 496 // The service is now initialized - if the client is not yet registered, then | |
| 497 // it means that there is no cached policy and so we need to initiate a new | |
| 498 // client registration. | |
| 499 DVLOG_IF(1, manager->IsClientRegistered()) | |
| 500 << "Client already registered - not fetching DMToken"; | |
| 501 if (!manager->IsClientRegistered()) { | |
| 502 std::string token = TokenServiceFactory::GetForProfile(profile_)-> | |
| 503 GetOAuth2LoginRefreshToken(); | |
| 504 if (token.empty()) { | |
| 505 // No token yet - this class listens for NOTIFICATION_TOKEN_AVAILABLE | |
| 506 // and will re-attempt registration once the token is available. | |
| 507 DLOG(WARNING) << "No OAuth Refresh Token - delaying policy download"; | |
| 508 return; | |
| 509 } | |
| 510 RegisterCloudPolicyService(token); | |
| 511 } | |
| 512 // If client is registered now, prohibit signout. | |
| 513 ProhibitSignoutIfNeeded(); | |
| 514 } | |
| 515 | |
| 516 void UserPolicySigninService::RegisterCloudPolicyService( | |
| 517 std::string login_token) { | |
| 518 DCHECK(!GetManager()->IsClientRegistered()); | |
| 519 DVLOG(1) << "Fetching new DM Token"; | |
| 520 // Do nothing if already starting the registration process. | |
| 521 if (registration_helper_) | |
| 522 return; | |
| 523 | |
| 524 // Start the process of registering the CloudPolicyClient. Once it completes, | |
| 525 // policy fetch will automatically happen. | |
| 526 registration_helper_.reset( | |
| 527 new CloudPolicyClientRegistrationHelper(profile_->GetRequestContext())); | |
| 528 registration_helper_->StartRegistration( | |
| 529 GetManager()->core()->client(), | |
| 530 login_token, | |
| 531 base::Bind(&UserPolicySigninService::OnRegistrationComplete, | |
| 532 base::Unretained(this))); | |
| 533 } | |
| 534 | |
| 535 void UserPolicySigninService::OnRegistrationComplete() { | |
| 536 ProhibitSignoutIfNeeded(); | |
| 537 registration_helper_.reset(); | |
| 538 } | |
| 539 | |
| 540 void UserPolicySigninService::ProhibitSignoutIfNeeded() { | |
| 541 if (GetManager()->IsClientRegistered()) { | |
| 542 DVLOG(1) << "User is registered for policy - prohibiting signout"; | |
| 543 SigninManager* signin_manager = | |
| 544 SigninManagerFactory::GetForProfile(profile_); | |
| 545 signin_manager->ProhibitSignout(); | |
| 546 } | |
| 547 } | |
| 548 | |
| 549 void UserPolicySigninService::Shutdown() { | |
| 550 // Stop any pending registration helper activity. We do this here instead of | |
| 551 // in the destructor because we want to shutdown the registration helper | |
| 552 // before UserCloudPolicyManager shuts down the CloudPolicyClient. | |
| 553 registration_helper_.reset(); | |
| 554 StopObserving(); | |
| 555 } | |
| 556 | |
| 557 UserCloudPolicyManager* UserPolicySigninService::GetManager() { | |
| 558 return UserCloudPolicyManagerFactory::GetForProfile(profile_); | |
| 559 } | |
| 560 | |
| 561 } // namespace policy | |
| OLD | NEW |