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

Unified Diff: chrome/browser/policy/user_policy_signin_service.cc

Issue 12189011: Split up chrome/browser/policy subdirectory (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase, add chrome/browser/chromeos/policy/OWNERS Created 7 years, 9 months 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/policy/user_policy_signin_service.cc
diff --git a/chrome/browser/policy/user_policy_signin_service.cc b/chrome/browser/policy/user_policy_signin_service.cc
deleted file mode 100644
index b78e0ac76f1efe245795a5afab7d2bd03785334d..0000000000000000000000000000000000000000
--- a/chrome/browser/policy/user_policy_signin_service.cc
+++ /dev/null
@@ -1,561 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/policy/user_policy_signin_service.h"
-
-#include <vector>
-
-#include "base/command_line.h"
-#include "base/prefs/pref_service.h"
-#include "base/values.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/policy/browser_policy_connector.h"
-#include "chrome/browser/policy/cloud_policy_client.h"
-#include "chrome/browser/policy/cloud_policy_service.h"
-#include "chrome/browser/policy/user_cloud_policy_manager.h"
-#include "chrome/browser/policy/user_cloud_policy_manager_factory.h"
-#include "chrome/browser/policy/user_info_fetcher.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/signin/signin_manager.h"
-#include "chrome/browser/signin/signin_manager_factory.h"
-#include "chrome/browser/signin/token_service.h"
-#include "chrome/browser/signin/token_service_factory.h"
-#include "chrome/common/chrome_notification_types.h"
-#include "chrome/common/chrome_switches.h"
-#include "chrome/common/pref_names.h"
-#include "content/public/browser/notification_details.h"
-#include "content/public/browser/notification_source.h"
-#include "google_apis/gaia/gaia_constants.h"
-#include "google_apis/gaia/gaia_urls.h"
-#include "google_apis/gaia/oauth2_access_token_consumer.h"
-#include "google_apis/gaia/oauth2_access_token_fetcher.h"
-
-namespace em = enterprise_management;
-
-namespace {
-
-// Various OAuth service scopes required to do CloudPolicyClient registration.
-const char kServiceScopeChromeOSDeviceManagement[] =
- "https://www.googleapis.com/auth/chromeosdevicemanagement";
-const char kServiceScopeGetUserInfo[] =
- "https://www.googleapis.com/auth/userinfo.email";
-
-// The key under which the hosted-domain value is stored in the UserInfo
-// response.
-const char kGetHostedDomainKey[] = "hd";
-
-bool ShouldForceLoadPolicy() {
- return CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kForceLoadCloudPolicy);
-}
-
-} // namespace
-
-namespace policy {
-
-// Helper class that registers a CloudPolicyClient and returns the associated
-// DMToken to the caller.
-class CloudPolicyClientRegistrationHelper
- : public policy::CloudPolicyClient::Observer,
- public OAuth2AccessTokenConsumer,
- public policy::UserInfoFetcher::Delegate {
- public:
- explicit CloudPolicyClientRegistrationHelper(
- net::URLRequestContextGetter* context);
-
- virtual ~CloudPolicyClientRegistrationHelper();
-
- // Starts the client registration process. Callback is invoked when the
- // registration is complete.
- void StartRegistration(policy::CloudPolicyClient* client,
- const std::string& oauth2_login_token,
- base::Closure callback);
-
- // OAuth2AccessTokenConsumer implementation.
- virtual void OnGetTokenSuccess(const std::string& access_token,
- const base::Time& expiration_time) OVERRIDE;
- virtual void OnGetTokenFailure(const GoogleServiceAuthError& error) OVERRIDE;
-
- // UserInfoFetcher::Delegate implementation:
- virtual void OnGetUserInfoSuccess(const DictionaryValue* response) OVERRIDE;
- virtual void OnGetUserInfoFailure(
- const GoogleServiceAuthError& error) OVERRIDE;
-
- // CloudPolicyClient::Observer implementation.
- virtual void OnPolicyFetched(policy::CloudPolicyClient* client) OVERRIDE {}
- virtual void OnRegistrationStateChanged(
- policy::CloudPolicyClient* client) OVERRIDE;
- virtual void OnClientError(policy::CloudPolicyClient* client) OVERRIDE;
-
- private:
- // Invoked when the registration request has been completed.
- void RequestCompleted();
-
- // Fetcher used while obtaining an OAuth token for client registration.
- scoped_ptr<OAuth2AccessTokenFetcher> oauth2_access_token_fetcher_;
-
- // Helper class for fetching information from GAIA about the currently
- // signed-in user.
- scoped_ptr<policy::UserInfoFetcher> user_info_fetcher_;
-
- // Access token used to register the CloudPolicyClient and also access
- // GAIA to get information about the signed in user.
- std::string oauth_access_token_;
-
- net::URLRequestContextGetter* context_;
- policy::CloudPolicyClient* client_;
- base::Closure callback_;
-};
-
-CloudPolicyClientRegistrationHelper::CloudPolicyClientRegistrationHelper(
- net::URLRequestContextGetter* context) : context_(context) {
- DCHECK(context_);
-}
-
-CloudPolicyClientRegistrationHelper::~CloudPolicyClientRegistrationHelper() {
- // Clean up any pending observers in case the browser is shutdown while
- // trying to register for policy.
- if (client_)
- client_->RemoveObserver(this);
-}
-
-void CloudPolicyClientRegistrationHelper::RequestCompleted() {
- if (client_) {
- client_->RemoveObserver(this);
- // |client_| may be freed by the callback so clear it now.
- client_ = NULL;
- callback_.Run();
- }
-}
-
-void CloudPolicyClientRegistrationHelper::StartRegistration(
- policy::CloudPolicyClient* client,
- const std::string& login_token,
- base::Closure callback) {
- DVLOG(1) << "Starting registration process";
- DCHECK(client);
- DCHECK(!client->is_registered());
- client_ = client;
- callback_ = callback;
- client_->AddObserver(this);
-
- // Start fetching an OAuth2 access token for the device management and
- // userinfo services.
- oauth2_access_token_fetcher_.reset(
- new OAuth2AccessTokenFetcher(this, context_));
- std::vector<std::string> scopes;
- scopes.push_back(kServiceScopeChromeOSDeviceManagement);
- scopes.push_back(kServiceScopeGetUserInfo);
- GaiaUrls* gaia_urls = GaiaUrls::GetInstance();
- oauth2_access_token_fetcher_->Start(
- gaia_urls->oauth2_chrome_client_id(),
- gaia_urls->oauth2_chrome_client_secret(),
- login_token,
- scopes);
-}
-
-void CloudPolicyClientRegistrationHelper::OnGetTokenFailure(
- const GoogleServiceAuthError& error) {
- DLOG(WARNING) << "Could not fetch access token for "
- << kServiceScopeChromeOSDeviceManagement;
- oauth2_access_token_fetcher_.reset();
-
- // Invoke the callback to let them know the fetch failed.
- RequestCompleted();
-}
-
-void CloudPolicyClientRegistrationHelper::OnGetTokenSuccess(
- const std::string& access_token,
- const base::Time& expiration_time) {
- // Cache the access token to be used after the GetUserInfo call.
- oauth_access_token_ = access_token;
- DVLOG(1) << "Fetched new scoped OAuth token:" << oauth_access_token_;
- oauth2_access_token_fetcher_.reset();
- // Now we've gotten our access token - contact GAIA to see if this is a
- // hosted domain.
- user_info_fetcher_.reset(new policy::UserInfoFetcher(this, context_));
- user_info_fetcher_->Start(oauth_access_token_);
-}
-
-void CloudPolicyClientRegistrationHelper::OnGetUserInfoFailure(
- const GoogleServiceAuthError& error) {
- DVLOG(1) << "Failed to fetch user info from GAIA: " << error.state();
- user_info_fetcher_.reset();
- RequestCompleted();
-}
-
-void CloudPolicyClientRegistrationHelper::OnGetUserInfoSuccess(
- const DictionaryValue* data) {
- user_info_fetcher_.reset();
- if (!data->HasKey(kGetHostedDomainKey) && !ShouldForceLoadPolicy()) {
- DVLOG(1) << "User not from a hosted domain - skipping registration";
- RequestCompleted();
- return;
- }
- DVLOG(1) << "Registering CloudPolicyClient for user from hosted domain";
- // The user is from a hosted domain, so it's OK to register the
- // CloudPolicyClient and make requests to DMServer.
- if (client_->is_registered()) {
- // Client should not be registered yet.
- NOTREACHED();
- RequestCompleted();
- return;
- }
-
- // Kick off registration of the CloudPolicyClient with our newly minted
- // oauth_access_token_.
- client_->Register(em::DeviceRegisterRequest::BROWSER, oauth_access_token_,
- std::string(), false);
-}
-
-void CloudPolicyClientRegistrationHelper::OnRegistrationStateChanged(
- policy::CloudPolicyClient* client) {
- DVLOG(1) << "Client registration succeeded";
- DCHECK_EQ(client, client_);
- DCHECK(client->is_registered());
- RequestCompleted();
-}
-
-void CloudPolicyClientRegistrationHelper::OnClientError(
- policy::CloudPolicyClient* client) {
- DVLOG(1) << "Client registration failed";
- DCHECK_EQ(client, client_);
- RequestCompleted();
-}
-
-UserPolicySigninService::UserPolicySigninService(
- Profile* profile)
- : profile_(profile) {
- CommandLine* cmd_line = CommandLine::ForCurrentProcess();
- if (profile_->GetPrefs()->GetBoolean(prefs::kDisableCloudPolicyOnSignin) ||
- ProfileManager::IsImportProcess(*cmd_line)) {
- return;
- }
-
- // Initialize/shutdown the UserCloudPolicyManager when the user signs out.
- registrar_.Add(this,
- chrome::NOTIFICATION_GOOGLE_SIGNED_OUT,
- content::Source<Profile>(profile));
-
- // Listen for an OAuth token to become available so we can register a client
- // if for some reason the client is not already registered (for example, if
- // the policy load failed during initial signin).
- registrar_.Add(this,
- chrome::NOTIFICATION_TOKEN_AVAILABLE,
- content::Source<TokenService>(
- TokenServiceFactory::GetForProfile(profile)));
-
- // TokenService should not yet have loaded its tokens since this happens in
- // the background after PKS initialization - so this service should always be
- // created before the oauth token is available.
- DCHECK(!TokenServiceFactory::GetForProfile(profile_)->HasOAuthLoginToken());
-
- // Register a listener to be called back once the current profile has finished
- // initializing, so we can startup the UserCloudPolicyManager.
- registrar_.Add(this,
- chrome::NOTIFICATION_PROFILE_ADDED,
- content::Source<Profile>(profile));
-
- // Register a listener for the import finished notification in a first run
- // scenario, which indicates the profile is ready to be further initialized.
- registrar_.Add(this,
- chrome::NOTIFICATION_IMPORT_FINISHED,
- content::Source<Profile>(profile));
-}
-
-UserPolicySigninService::~UserPolicySigninService() {}
-
-void UserPolicySigninService::RegisterPolicyClient(
- const std::string& username,
- const std::string& oauth2_refresh_token,
- const PolicyRegistrationCallback& callback) {
- DCHECK(!username.empty());
- DCHECK(!oauth2_refresh_token.empty());
- // We should not be called with a client already initialized.
- DCHECK(!GetManager() || !GetManager()->core()->client());
-
- // If the user should not get policy, just bail out.
- if (!GetManager() || !ShouldLoadPolicyForUser(username)) {
- DVLOG(1) << "Signed in user is not in the whitelist";
- callback.Run(scoped_ptr<CloudPolicyClient>().Pass());
- return;
- }
-
- // If the DeviceManagementService is not yet initialized, start it up now.
- g_browser_process->browser_policy_connector()->
- ScheduleServiceInitialization(0);
-
- // Create a new CloudPolicyClient for fetching the DMToken.
- scoped_ptr<CloudPolicyClient> policy_client(
- UserCloudPolicyManager::CreateCloudPolicyClient(
- g_browser_process->browser_policy_connector()->
- device_management_service()));
-
- registration_helper_.reset(
- new CloudPolicyClientRegistrationHelper(profile_->GetRequestContext()));
-
- // Fire off the registration process. Callback keeps the CloudPolicyClient
- // alive for the length of the registration process.
- // Grab a pointer to the client before base::Bind() clears the reference in
- // |policy_client|.
- CloudPolicyClient* client = policy_client.get();
- base::Closure registration_callback =
- base::Bind(&UserPolicySigninService::CallPolicyRegistrationCallback,
- base::Unretained(this), base::Passed(&policy_client),
- callback);
- registration_helper_->StartRegistration(
- client, oauth2_refresh_token, registration_callback);
-}
-
-void UserPolicySigninService::CallPolicyRegistrationCallback(
- scoped_ptr<CloudPolicyClient> client,
- PolicyRegistrationCallback callback) {
- registration_helper_.reset();
- if (!client->is_registered()) {
- // Registration failed, so free the client and pass NULL to the callback.
- client.reset();
- }
- callback.Run(client.Pass());
-}
-
-void UserPolicySigninService::FetchPolicyForSignedInUser(
- scoped_ptr<CloudPolicyClient> client,
- const PolicyFetchCallback& callback) {
- DCHECK(client);
- DCHECK(client->is_registered());
- // The user has just signed in, so the UserCloudPolicyManager should not yet
- // be initialized. This routine will initialize the UserCloudPolicyManager
- // with the passed client and will proactively ask the client to fetch
- // policy without waiting for the CloudPolicyService to finish initialization.
- UserCloudPolicyManager* manager = GetManager();
- DCHECK(manager);
- DCHECK(!manager->core()->client());
- InitializeUserCloudPolicyManager(client.Pass());
- DCHECK(manager->IsClientRegistered());
-
- // Now initiate a policy fetch.
- manager->core()->service()->RefreshPolicy(callback);
-}
-
-void UserPolicySigninService::StopObserving() {
- UserCloudPolicyManager* manager = GetManager();
- if (manager && manager->core()->service())
- manager->core()->service()->RemoveObserver(this);
-}
-
-void UserPolicySigninService::StartObserving() {
- UserCloudPolicyManager* manager = GetManager();
- // Manager should be fully initialized by now.
- DCHECK(manager);
- DCHECK(manager->core()->service());
- manager->core()->service()->AddObserver(this);
-}
-
-void UserPolicySigninService::Observe(
- int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- // If an import process is running, wait for NOTIFICATION_IMPORT_FINISHED
- // before potentially creating the SigninManager. Its dependencies can access
- // databases that the import process is also accessing, causing conflicts.
- // Note that the profile manager is NULL in unit tests.
- if (g_browser_process->profile_manager() &&
- g_browser_process->profile_manager()->will_import()) {
- DCHECK_EQ(chrome::NOTIFICATION_PROFILE_ADDED, type);
- return;
- }
-
- // If using a TestingProfile with no SigninManager or UserCloudPolicyManager,
- // skip initialization.
- if (!GetManager() || !SigninManagerFactory::GetForProfile(profile_)) {
- DVLOG(1) << "Skipping initialization for tests due to missing components.";
- return;
- }
-
- switch (type) {
- case chrome::NOTIFICATION_GOOGLE_SIGNED_OUT:
- ShutdownUserCloudPolicyManager();
- break;
- case chrome::NOTIFICATION_IMPORT_FINISHED:
- case chrome::NOTIFICATION_PROFILE_ADDED: {
- // A new profile has been loaded - if it's signed in, then initialize the
- // UCPM, otherwise shut down the UCPM (which deletes any cached policy
- // data). This must be done here instead of at constructor time because
- // the Profile is not fully initialized when this object is constructed
- // (DoFinalInit() has not yet been called, so ProfileIOData and
- // SSLConfigServiceManager have not been created yet).
- // TODO(atwilson): Switch to using a timer instead, to avoid contention
- // with other services at startup (http://crbug.com/165468).
- SigninManager* signin_manager =
- SigninManagerFactory::GetForProfile(profile_);
- std::string username = signin_manager->GetAuthenticatedUsername();
- if (username.empty())
- ShutdownUserCloudPolicyManager();
- else
- InitializeForSignedInUser();
- break;
- }
- case chrome::NOTIFICATION_TOKEN_AVAILABLE: {
- const TokenService::TokenAvailableDetails& token_details =
- *(content::Details<const TokenService::TokenAvailableDetails>(
- details).ptr());
- if (token_details.service() ==
- GaiaConstants::kGaiaOAuth2LoginRefreshToken) {
- SigninManager* signin_manager =
- SigninManagerFactory::GetForProfile(profile_);
- std::string username = signin_manager->GetAuthenticatedUsername();
- // Should not have GAIA tokens if the user isn't signed in.
- DCHECK(!username.empty());
- // TokenService now has a refresh token (implying that the user is
- // signed in) so initialize the UserCloudPolicyManager.
- InitializeForSignedInUser();
- }
- break;
- }
- default:
- NOTREACHED();
- }
-}
-
-bool UserPolicySigninService::ShouldLoadPolicyForUser(
- const std::string& username) {
- if (profile_->GetPrefs()->GetBoolean(prefs::kDisableCloudPolicyOnSignin))
- return false; // Cloud policy is disabled.
-
- if (username.empty())
- return false; // Not signed in.
-
- if (ShouldForceLoadPolicy())
- return true;
-
- return !BrowserPolicyConnector::IsNonEnterpriseUser(username);
-}
-
-void UserPolicySigninService::InitializeUserCloudPolicyManager(
- scoped_ptr<CloudPolicyClient> client) {
- UserCloudPolicyManager* manager = GetManager();
- DCHECK(!manager->core()->client());
- // If there is no cached DMToken then we can detect this below (or when
- // the OnInitializationCompleted() callback is invoked).
- manager->Connect(g_browser_process->local_state(), client.Pass());
- DCHECK(manager->core()->service());
- StartObserving();
- ProhibitSignoutIfNeeded();
-}
-
-void UserPolicySigninService::InitializeForSignedInUser() {
- SigninManager* signin_manager =
- SigninManagerFactory::GetForProfile(profile_);
- std::string username = signin_manager->GetAuthenticatedUsername();
-
- if (!ShouldLoadPolicyForUser(username)) {
- DVLOG(1) << "Policy load not enabled for user: " << username;
- return;
- }
- DCHECK(!username.empty());
-
- UserCloudPolicyManager* manager = GetManager();
- // Initialize the UCPM if it is not already initialized.
- if (!manager->core()->service()) {
- // If there is no cached DMToken then we can detect this when the
- // OnInitializationCompleted() callback is invoked and this will
- // initiate a policy fetch.
- BrowserPolicyConnector* connector =
- g_browser_process->browser_policy_connector();
- InitializeUserCloudPolicyManager(
- UserCloudPolicyManager::CreateCloudPolicyClient(
- connector->device_management_service()).Pass());
- }
-
- // If the CloudPolicyService is initialized, kick off registration. If the
- // TokenService doesn't have an OAuth token yet (e.g. this is during initial
- // signin, or when dynamically loading a signed-in policy) this does nothing
- // until the OAuth token is loaded.
- if (manager->core()->service()->IsInitializationComplete())
- OnInitializationCompleted(manager->core()->service());
-}
-
-void UserPolicySigninService::ShutdownUserCloudPolicyManager() {
- // Stop any in-progress token fetch.
- registration_helper_.reset();
-
- StopObserving();
-
- UserCloudPolicyManager* manager = GetManager();
- if (manager) // Can be null in unit tests.
- manager->DisconnectAndRemovePolicy();
-}
-
-void UserPolicySigninService::OnInitializationCompleted(
- CloudPolicyService* service) {
- UserCloudPolicyManager* manager = GetManager();
- DCHECK_EQ(service, manager->core()->service());
- DCHECK(service->IsInitializationComplete());
- // The service is now initialized - if the client is not yet registered, then
- // it means that there is no cached policy and so we need to initiate a new
- // client registration.
- DVLOG_IF(1, manager->IsClientRegistered())
- << "Client already registered - not fetching DMToken";
- if (!manager->IsClientRegistered()) {
- std::string token = TokenServiceFactory::GetForProfile(profile_)->
- GetOAuth2LoginRefreshToken();
- if (token.empty()) {
- // No token yet - this class listens for NOTIFICATION_TOKEN_AVAILABLE
- // and will re-attempt registration once the token is available.
- DLOG(WARNING) << "No OAuth Refresh Token - delaying policy download";
- return;
- }
- RegisterCloudPolicyService(token);
- }
- // If client is registered now, prohibit signout.
- ProhibitSignoutIfNeeded();
-}
-
-void UserPolicySigninService::RegisterCloudPolicyService(
- std::string login_token) {
- DCHECK(!GetManager()->IsClientRegistered());
- DVLOG(1) << "Fetching new DM Token";
- // Do nothing if already starting the registration process.
- if (registration_helper_)
- return;
-
- // Start the process of registering the CloudPolicyClient. Once it completes,
- // policy fetch will automatically happen.
- registration_helper_.reset(
- new CloudPolicyClientRegistrationHelper(profile_->GetRequestContext()));
- registration_helper_->StartRegistration(
- GetManager()->core()->client(),
- login_token,
- base::Bind(&UserPolicySigninService::OnRegistrationComplete,
- base::Unretained(this)));
-}
-
-void UserPolicySigninService::OnRegistrationComplete() {
- ProhibitSignoutIfNeeded();
- registration_helper_.reset();
-}
-
-void UserPolicySigninService::ProhibitSignoutIfNeeded() {
- if (GetManager()->IsClientRegistered()) {
- DVLOG(1) << "User is registered for policy - prohibiting signout";
- SigninManager* signin_manager =
- SigninManagerFactory::GetForProfile(profile_);
- signin_manager->ProhibitSignout();
- }
-}
-
-void UserPolicySigninService::Shutdown() {
- // Stop any pending registration helper activity. We do this here instead of
- // in the destructor because we want to shutdown the registration helper
- // before UserCloudPolicyManager shuts down the CloudPolicyClient.
- registration_helper_.reset();
- StopObserving();
-}
-
-UserCloudPolicyManager* UserPolicySigninService::GetManager() {
- return UserCloudPolicyManagerFactory::GetForProfile(profile_);
-}
-
-} // namespace policy
« no previous file with comments | « chrome/browser/policy/user_policy_signin_service.h ('k') | chrome/browser/policy/user_policy_signin_service_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698