Index: chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.cc |
diff --git a/chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.cc b/chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.cc |
similarity index 51% |
rename from chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.cc |
rename to chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.cc |
index 36cacfa750a859c9281089f2408867a0c1e59e2b..207a807714c65845f169c8e94ae4ffa961c7b029 100644 |
--- a/chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.cc |
+++ b/chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.cc |
@@ -2,7 +2,7 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.h" |
+#include "chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.h" |
#include <utility> |
@@ -10,6 +10,7 @@ |
#include "base/command_line.h" |
#include "base/files/file_path.h" |
#include "base/logging.h" |
+#include "base/memory/ptr_util.h" |
#include "base/memory/ref_counted.h" |
#include "base/path_service.h" |
#include "base/sequenced_task_runner.h" |
@@ -18,11 +19,13 @@ |
#include "base/time/time.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" |
+#include "chrome/browser/chromeos/policy/user_active_directory_policy_manager.h" |
#include "chrome/browser/chromeos/policy/user_cloud_external_data_manager.h" |
#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h" |
#include "chrome/browser/chromeos/policy/user_cloud_policy_store_chromeos.h" |
#include "chrome/browser/chromeos/profiles/profile_helper.h" |
#include "chrome/browser/chromeos/settings/cros_settings.h" |
+#include "chrome/browser/chromeos/settings/install_attributes.h" |
#include "chrome/browser/policy/schema_registry_service.h" |
#include "chrome/browser/policy/schema_registry_service_factory.h" |
#include "chrome/browser/profiles/profile.h" |
@@ -33,6 +36,7 @@ |
#include "components/policy/core/browser/browser_policy_connector.h" |
#include "components/policy/core/common/cloud/cloud_external_data_manager.h" |
#include "components/policy/core/common/cloud/device_management_service.h" |
+#include "components/policy/core/common/configuration_policy_provider.h" |
#include "components/policy/policy_constants.h" |
#include "components/user_manager/user.h" |
#include "components/user_manager/user_manager.h" |
@@ -64,91 +68,145 @@ const int kInitialPolicyFetchTimeoutSeconds = 10; |
} // namespace |
// static |
-UserCloudPolicyManagerFactoryChromeOS* |
- UserCloudPolicyManagerFactoryChromeOS::GetInstance() { |
- return base::Singleton<UserCloudPolicyManagerFactoryChromeOS>::get(); |
+UserPolicyManagerFactoryChromeOS* |
+UserPolicyManagerFactoryChromeOS::GetInstance() { |
+ return base::Singleton<UserPolicyManagerFactoryChromeOS>::get(); |
+} |
+ |
+// static |
+ConfigurationPolicyProvider* UserPolicyManagerFactoryChromeOS::GetForProfile( |
+ Profile* profile) { |
+ ConfigurationPolicyProvider* cloud_provider = |
+ GetInstance()->GetCloudPolicyManagerForProfile(profile); |
+ if (cloud_provider) { |
+ return cloud_provider; |
+ } |
+ return GetInstance()->GetActiveDirectoryPolicyManagerForProfile(profile); |
} |
// static |
UserCloudPolicyManagerChromeOS* |
- UserCloudPolicyManagerFactoryChromeOS::GetForProfile( |
- Profile* profile) { |
- return GetInstance()->GetManagerForProfile(profile); |
+UserPolicyManagerFactoryChromeOS::GetCloudPolicyManagerForProfile( |
+ Profile* profile) { |
+ return GetInstance()->GetCloudPolicyManager(profile); |
} |
// static |
-std::unique_ptr<UserCloudPolicyManagerChromeOS> |
-UserCloudPolicyManagerFactoryChromeOS::CreateForProfile( |
+UserActiveDirectoryPolicyManager* |
+UserPolicyManagerFactoryChromeOS::GetActiveDirectoryPolicyManagerForProfile( |
+ Profile* profile) { |
+ return GetInstance()->GetActiveDirectoryPolicyManager(profile); |
+} |
+ |
+// static |
+std::unique_ptr<ConfigurationPolicyProvider> |
+UserPolicyManagerFactoryChromeOS::CreateForProfile( |
Profile* profile, |
bool force_immediate_load, |
scoped_refptr<base::SequencedTaskRunner> background_task_runner) { |
- return GetInstance()->CreateManagerForProfile( |
- profile, force_immediate_load, background_task_runner); |
+ return GetInstance()->CreateManagerForProfile(profile, force_immediate_load, |
+ background_task_runner); |
} |
-UserCloudPolicyManagerFactoryChromeOS::UserCloudPolicyManagerFactoryChromeOS() |
+UserPolicyManagerFactoryChromeOS::UserPolicyManagerFactoryChromeOS() |
: BrowserContextKeyedBaseFactory( |
- "UserCloudPolicyManagerChromeOS", |
- BrowserContextDependencyManager::GetInstance()) { |
+ "UserCloudPolicyManagerChromeOS", |
+ BrowserContextDependencyManager::GetInstance()) { |
DependsOn(SchemaRegistryServiceFactory::GetInstance()); |
} |
-UserCloudPolicyManagerFactoryChromeOS:: |
- ~UserCloudPolicyManagerFactoryChromeOS() {} |
+UserPolicyManagerFactoryChromeOS::~UserPolicyManagerFactoryChromeOS() {} |
UserCloudPolicyManagerChromeOS* |
- UserCloudPolicyManagerFactoryChromeOS::GetManagerForProfile( |
- Profile* profile) { |
+UserPolicyManagerFactoryChromeOS::GetCloudPolicyManager(Profile* profile) { |
+ // Get the manager for the original profile, since the PolicyService is |
+ // also shared between the incognito Profile and the original Profile. |
+ const auto it = cloud_managers_.find(profile->GetOriginalProfile()); |
+ return it != cloud_managers_.end() ? it->second : nullptr; |
+} |
+ |
+UserActiveDirectoryPolicyManager* |
+UserPolicyManagerFactoryChromeOS::GetActiveDirectoryPolicyManager( |
+ Profile* profile) { |
// Get the manager for the original profile, since the PolicyService is |
// also shared between the incognito Profile and the original Profile. |
- ManagerMap::const_iterator it = managers_.find(profile->GetOriginalProfile()); |
- return it != managers_.end() ? it->second : NULL; |
+ const auto it = |
+ active_directory_managers_.find(profile->GetOriginalProfile()); |
+ return it != active_directory_managers_.end() ? it->second : nullptr; |
} |
-std::unique_ptr<UserCloudPolicyManagerChromeOS> |
-UserCloudPolicyManagerFactoryChromeOS::CreateManagerForProfile( |
+std::unique_ptr<ConfigurationPolicyProvider> |
+UserPolicyManagerFactoryChromeOS::CreateManagerForProfile( |
Profile* profile, |
bool force_immediate_load, |
scoped_refptr<base::SequencedTaskRunner> background_task_runner) { |
+ DCHECK(cloud_managers_.find(profile) == cloud_managers_.end()); |
+ DCHECK(active_directory_managers_.find(profile) == |
+ active_directory_managers_.end()); |
+ |
const base::CommandLine* command_line = |
base::CommandLine::ForCurrentProcess(); |
// Don't initialize cloud policy for the signin profile. |
if (chromeos::ProfileHelper::IsSigninProfile(profile)) |
- return std::unique_ptr<UserCloudPolicyManagerChromeOS>(); |
+ return {}; |
- // |user| should never be NULL except for the signin profile. This object is |
- // created as part of the Profile creation, which happens right after |
+ // |user| should never be nullptr except for the signin profile. This object |
+ // is created as part of the Profile creation, which happens right after |
// sign-in. The just-signed-in User is the active user during that time. |
const user_manager::User* user = |
chromeos::ProfileHelper::Get()->GetUserByProfile(profile); |
CHECK(user); |
// User policy exists for enterprise accounts only: |
- // - For regular enterprise users (those who have a GAIA account), a |
+ // - For regular cloud-managed users (those who have a GAIA account), a |
// |UserCloudPolicyManagerChromeOS| is created here. |
+ // - For Active Directory managed users, a |UserActiveDirectoryPolicyManager| |
+ // is created. |
// - For device-local accounts, policy is provided by |
// |DeviceLocalAccountPolicyService|. |
// All other user types do not have user policy. |
- const AccountId account_id = user->GetAccountId(); |
- if (!user->HasGaiaAccount() || user->IsSupervised() || |
+ const AccountId& account_id = user->GetAccountId(); |
+ if (user->IsSupervised() || |
BrowserPolicyConnector::IsNonEnterpriseUser(account_id.GetUserEmail())) { |
- return std::unique_ptr<UserCloudPolicyManagerChromeOS>(); |
+ return {}; |
} |
policy::BrowserPolicyConnectorChromeOS* connector = |
g_browser_process->platform_part()->browser_policy_connector_chromeos(); |
+ bool is_active_directory = false; |
+ switch (account_id.GetAccountType()) { |
+ case AccountType::UNKNOWN: |
+ case AccountType::GOOGLE: |
+ // TODO(tnagel): Return nullptr for unknown accounts once AccountId |
+ // migration is finished. |
+ if (!user->HasGaiaAccount()) { |
+ return {}; |
+ } |
+ is_active_directory = false; |
+ break; |
+ case AccountType::ACTIVE_DIRECTORY: |
+ // Ensure install attributes are locked into Active Directory mode before |
+ // allowing Active Directory policy which is not signed. |
+ if (!connector->GetInstallAttributes()->IsActiveDirectoryManaged()) { |
+ return {}; |
+ } |
+ is_active_directory = true; |
+ break; |
+ } |
+ |
const bool is_browser_restart = |
command_line->HasSwitch(chromeos::switches::kLoginUser); |
const user_manager::UserManager* const user_manager = |
user_manager::UserManager::Get(); |
- // We want to block for policy in a few situations: if the user is new, or |
- // if we are forcing an online signin. An online signin will be forced if |
- // there has been a credential error, or if the initial session creation |
- // was not completed (the oauth_token_status is not set to valid by |
- // OAuth2LoginManager until profile creation/session restore is complete). |
+ // We want to block for policy in a few situations: if the user is new, or if |
+ // we are forcing an online signin. An online signin will be forced if there |
+ // has been a credential error, or if the initial session creation was not |
+ // completed (the oauth_token_status is not set to valid by OAuth2LoginManager |
+ // until profile creation/session restore is complete). |
+ // TODO(tnagel): Don't limit blocking to cloud managed users. |
const bool block_forever_for_policy = |
- !user_manager->IsLoggedInAsStub() && |
+ !is_active_directory && !user_manager->IsLoggedInAsStub() && |
(user_manager->IsCurrentUserNew() || |
user_manager->GetActiveUser()->force_online_signin() || |
user_manager->GetActiveUser()->oauth_token_status() != |
@@ -174,15 +232,16 @@ UserCloudPolicyManagerFactoryChromeOS::CreateManagerForProfile( |
const base::FilePath component_policy_cache_dir = |
profile_dir.Append(kPolicy).Append(kComponentsDir); |
const base::FilePath external_data_dir = |
- profile_dir.Append(kPolicy).Append(kPolicyExternalDataDir); |
+ profile_dir.Append(kPolicy).Append(kPolicyExternalDataDir); |
base::FilePath policy_key_dir; |
CHECK(PathService::Get(chromeos::DIR_USER_POLICY_KEYS, &policy_key_dir)); |
- std::unique_ptr<UserCloudPolicyStoreChromeOS> store( |
- new UserCloudPolicyStoreChromeOS( |
+ std::unique_ptr<UserCloudPolicyStoreChromeOS> store = |
+ base::MakeUnique<UserCloudPolicyStoreChromeOS>( |
chromeos::DBusThreadManager::Get()->GetCryptohomeClient(), |
chromeos::DBusThreadManager::Get()->GetSessionManagerClient(), |
- background_task_runner, account_id, policy_key_dir)); |
+ background_task_runner, account_id, policy_key_dir, |
+ is_active_directory); |
scoped_refptr<base::SequencedTaskRunner> backend_task_runner = |
content::BrowserThread::GetBlockingPool()->GetSequencedTaskRunner( |
@@ -201,58 +260,76 @@ UserCloudPolicyManagerFactoryChromeOS::CreateManagerForProfile( |
content::BrowserThread::GetTaskRunnerForThread( |
content::BrowserThread::FILE); |
- std::unique_ptr<UserCloudPolicyManagerChromeOS> manager( |
- new UserCloudPolicyManagerChromeOS( |
- std::move(store), std::move(external_data_manager), |
- component_policy_cache_dir, wait_for_policy_fetch, |
- initial_policy_fetch_timeout, base::ThreadTaskRunnerHandle::Get(), |
- file_task_runner, io_task_runner)); |
- |
- bool wildcard_match = false; |
- if (connector->IsEnterpriseManaged() && |
- chromeos::CrosSettings::IsWhitelisted(account_id.GetUserEmail(), |
- &wildcard_match) && |
- wildcard_match && |
- !connector->IsNonEnterpriseUser(account_id.GetUserEmail())) { |
- manager->EnableWildcardLoginCheck(account_id.GetUserEmail()); |
+ if (is_active_directory) { |
+ std::unique_ptr<UserActiveDirectoryPolicyManager> manager = |
+ base::MakeUnique<UserActiveDirectoryPolicyManager>(account_id, |
+ std::move(store)); |
+ manager->Init( |
+ SchemaRegistryServiceFactory::GetForContext(profile)->registry()); |
+ |
+ active_directory_managers_[profile] = manager.get(); |
+ return std::move(manager); |
+ } else { |
+ std::unique_ptr<UserCloudPolicyManagerChromeOS> manager = |
+ base::MakeUnique<UserCloudPolicyManagerChromeOS>( |
+ std::move(store), std::move(external_data_manager), |
+ component_policy_cache_dir, wait_for_policy_fetch, |
+ initial_policy_fetch_timeout, base::ThreadTaskRunnerHandle::Get(), |
+ file_task_runner, io_task_runner); |
+ |
+ // TODO(tnagel): Enable whitelist for Active Directory. |
+ bool wildcard_match = false; |
+ if (connector->IsEnterpriseManaged() && |
+ chromeos::CrosSettings::IsWhitelisted(account_id.GetUserEmail(), |
+ &wildcard_match) && |
+ wildcard_match && |
+ !connector->IsNonEnterpriseUser(account_id.GetUserEmail())) { |
+ manager->EnableWildcardLoginCheck(account_id.GetUserEmail()); |
+ } |
+ |
+ manager->Init( |
+ SchemaRegistryServiceFactory::GetForContext(profile)->registry()); |
+ manager->Connect(g_browser_process->local_state(), |
+ device_management_service, |
+ g_browser_process->system_request_context()); |
+ |
+ cloud_managers_[profile] = manager.get(); |
+ return std::move(manager); |
} |
- |
- manager->Init( |
- SchemaRegistryServiceFactory::GetForContext(profile)->registry()); |
- manager->Connect(g_browser_process->local_state(), device_management_service, |
- g_browser_process->system_request_context()); |
- |
- DCHECK(managers_.find(profile) == managers_.end()); |
- managers_[profile] = manager.get(); |
- return manager; |
} |
-void UserCloudPolicyManagerFactoryChromeOS::BrowserContextShutdown( |
+void UserPolicyManagerFactoryChromeOS::BrowserContextShutdown( |
content::BrowserContext* context) { |
Profile* profile = static_cast<Profile*>(context); |
if (profile->IsOffTheRecord()) |
return; |
- UserCloudPolicyManagerChromeOS* manager = GetManagerForProfile(profile); |
- if (manager) |
- manager->Shutdown(); |
+ UserCloudPolicyManagerChromeOS* cloud_manager = |
+ GetCloudPolicyManager(profile); |
+ if (cloud_manager) |
+ cloud_manager->Shutdown(); |
+ UserActiveDirectoryPolicyManager* active_directory_manager = |
+ GetActiveDirectoryPolicyManager(profile); |
+ if (active_directory_manager) |
+ active_directory_manager->Shutdown(); |
} |
-void UserCloudPolicyManagerFactoryChromeOS::BrowserContextDestroyed( |
+void UserPolicyManagerFactoryChromeOS::BrowserContextDestroyed( |
content::BrowserContext* context) { |
Profile* profile = static_cast<Profile*>(context); |
- managers_.erase(profile); |
+ cloud_managers_.erase(profile); |
+ active_directory_managers_.erase(profile); |
BrowserContextKeyedBaseFactory::BrowserContextDestroyed(context); |
} |
-void UserCloudPolicyManagerFactoryChromeOS::SetEmptyTestingFactory( |
+void UserPolicyManagerFactoryChromeOS::SetEmptyTestingFactory( |
content::BrowserContext* context) {} |
-bool UserCloudPolicyManagerFactoryChromeOS::HasTestingFactory( |
+bool UserPolicyManagerFactoryChromeOS::HasTestingFactory( |
content::BrowserContext* context) { |
return false; |
} |
-void UserCloudPolicyManagerFactoryChromeOS::CreateServiceNow( |
+void UserPolicyManagerFactoryChromeOS::CreateServiceNow( |
content::BrowserContext* context) {} |
} // namespace policy |