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.
5 #include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h"
10 #include "base/basictypes.h"
11 #include "base/compiler_specific.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/run_loop.h"
14 #include "base/thread_task_runner_handle.h"
15 #include "chrome/browser/chromeos/policy/enterprise_install_attributes.h"
16 #include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h"
17 #include "chrome/browser/chromeos/settings/device_settings_test_helper.h"
18 #include "chrome/test/base/scoped_testing_local_state.h"
19 #include "chrome/test/base/testing_browser_process.h"
20 #include "chromeos/cryptohome/cryptohome_util.h"
21 #include "chromeos/dbus/dbus_thread_manager.h"
22 #include "chromeos/dbus/fake_cryptohome_client.h"
23 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
24 #include "content/public/test/test_utils.h"
25 #include "policy/policy_constants.h"
26 #include "policy/proto/device_management_backend.pb.h"
27 #include "testing/gtest/include/gtest/gtest.h"
29 namespace em
= enterprise_management
;
35 void CopyLockResult(base::RunLoop
* loop
,
36 EnterpriseInstallAttributes::LockResult
* out
,
37 EnterpriseInstallAttributes::LockResult result
) {
44 class DeviceCloudPolicyStoreChromeOSTest
45 : public chromeos::DeviceSettingsTestBase
{
47 DeviceCloudPolicyStoreChromeOSTest()
48 : local_state_(TestingBrowserProcess::GetGlobal()),
49 fake_cryptohome_client_(new chromeos::FakeCryptohomeClient()),
51 new EnterpriseInstallAttributes(fake_cryptohome_client_
)),
52 store_(new DeviceCloudPolicyStoreChromeOS(
53 &device_settings_service_
,
54 install_attributes_
.get(),
55 base::ThreadTaskRunnerHandle::Get())) {}
57 void SetUp() override
{
58 DeviceSettingsTestBase::SetUp();
60 dbus_setter_
->SetCryptohomeClient(
61 scoped_ptr
<chromeos::CryptohomeClient
>(fake_cryptohome_client_
));
64 EnterpriseInstallAttributes::LockResult result
;
65 install_attributes_
->LockDevice(
66 PolicyBuilder::kFakeUsername
,
67 DEVICE_MODE_ENTERPRISE
,
68 PolicyBuilder::kFakeDeviceId
,
69 base::Bind(&CopyLockResult
, &loop
, &result
));
71 ASSERT_EQ(EnterpriseInstallAttributes::LOCK_SUCCESS
, result
);
74 void SetManagementModeAndLoad(em::PolicyData::ManagementMode mode
) {
75 device_policy_
.policy_data().set_management_mode(mode
);
76 device_policy_
.Build();
77 device_settings_test_helper_
.set_policy_blob(device_policy_
.GetBlob());
78 device_settings_service_
.Load();
79 FlushDeviceSettings();
80 EXPECT_EQ(chromeos::DeviceSettingsService::STORE_SUCCESS
,
81 device_settings_service_
.status());
84 void ExpectFailure(CloudPolicyStore::Status expected_status
) {
85 EXPECT_EQ(expected_status
, store_
->status());
86 EXPECT_TRUE(store_
->is_initialized());
87 EXPECT_FALSE(store_
->has_policy());
88 EXPECT_FALSE(store_
->is_managed());
91 void ExpectSuccessWithManagementMode(ManagementMode mode
) {
92 EXPECT_EQ(CloudPolicyStore::STATUS_OK
, store_
->status());
93 EXPECT_TRUE(store_
->is_initialized());
94 EXPECT_TRUE(store_
->has_policy());
95 EXPECT_TRUE(store_
->is_managed());
96 EXPECT_TRUE(store_
->policy());
97 EXPECT_TRUE(store_
->policy_map().empty());
99 EXPECT_EQ(mode
, GetManagementMode(*store_
->policy()));
102 void ExpectSuccess() {
103 EXPECT_EQ(CloudPolicyStore::STATUS_OK
, store_
->status());
104 EXPECT_TRUE(store_
->is_initialized());
105 EXPECT_TRUE(store_
->has_policy());
106 EXPECT_TRUE(store_
->is_managed());
107 EXPECT_TRUE(store_
->policy());
108 base::FundamentalValue
expected(false);
110 base::Value::Equals(&expected
,
111 store_
->policy_map().GetValue(
112 key::kDeviceMetricsReportingEnabled
)));
115 void PrepareExistingPolicy() {
117 FlushDeviceSettings();
120 device_policy_
.UnsetNewSigningKey();
121 device_policy_
.Build();
124 void PrepareNewSigningKey() {
125 device_policy_
.SetDefaultNewSigningKey();
126 device_policy_
.Build();
127 owner_key_util_
->SetPublicKeyFromPrivateKey(
128 *device_policy_
.GetNewSigningKey());
131 void ResetToNonEnterprise() {
133 chromeos::cryptohome_util::InstallAttributesSet("enterprise.owned",
135 install_attributes_
.reset(
136 new EnterpriseInstallAttributes(fake_cryptohome_client_
));
137 store_
.reset(new DeviceCloudPolicyStoreChromeOS(
138 &device_settings_service_
, install_attributes_
.get(),
139 base::ThreadTaskRunnerHandle::Get()));
142 ScopedTestingLocalState local_state_
;
143 chromeos::FakeCryptohomeClient
* fake_cryptohome_client_
;
144 scoped_ptr
<EnterpriseInstallAttributes
> install_attributes_
;
146 scoped_ptr
<DeviceCloudPolicyStoreChromeOS
> store_
;
149 DISALLOW_COPY_AND_ASSIGN(DeviceCloudPolicyStoreChromeOSTest
);
152 TEST_F(DeviceCloudPolicyStoreChromeOSTest
, LoadNoKey
) {
153 owner_key_util_
->Clear();
155 FlushDeviceSettings();
156 ExpectFailure(CloudPolicyStore::STATUS_BAD_STATE
);
159 TEST_F(DeviceCloudPolicyStoreChromeOSTest
, LoadNoPolicy
) {
160 device_settings_test_helper_
.set_policy_blob(std::string());
162 FlushDeviceSettings();
163 ExpectFailure(CloudPolicyStore::STATUS_LOAD_ERROR
);
166 TEST_F(DeviceCloudPolicyStoreChromeOSTest
, LoadNotEnterprise
) {
167 ResetToNonEnterprise();
169 FlushDeviceSettings();
170 ExpectFailure(CloudPolicyStore::STATUS_BAD_STATE
);
173 TEST_F(DeviceCloudPolicyStoreChromeOSTest
, LoadSuccess
) {
175 FlushDeviceSettings();
179 TEST_F(DeviceCloudPolicyStoreChromeOSTest
, UpdateFromServiceOnConsumerDevices
) {
180 ResetToNonEnterprise();
182 SetManagementModeAndLoad(em::PolicyData::CONSUMER_MANAGED
);
183 ExpectSuccessWithManagementMode(MANAGEMENT_MODE_CONSUMER_MANAGED
);
185 // Unenroll from consumer management.
186 SetManagementModeAndLoad(em::PolicyData::LOCAL_OWNER
);
187 ExpectSuccessWithManagementMode(MANAGEMENT_MODE_LOCAL_OWNER
);
190 TEST_F(DeviceCloudPolicyStoreChromeOSTest
, StoreSuccess
) {
191 PrepareExistingPolicy();
192 store_
->Store(device_policy_
.policy());
193 FlushDeviceSettings();
197 TEST_F(DeviceCloudPolicyStoreChromeOSTest
, StoreNoSignature
) {
198 PrepareExistingPolicy();
199 device_policy_
.policy().clear_policy_data_signature();
200 store_
->Store(device_policy_
.policy());
201 FlushDeviceSettings();
202 EXPECT_EQ(CloudPolicyStore::STATUS_VALIDATION_ERROR
, store_
->status());
203 EXPECT_EQ(CloudPolicyValidatorBase::VALIDATION_BAD_SIGNATURE
,
204 store_
->validation_status());
207 TEST_F(DeviceCloudPolicyStoreChromeOSTest
, StoreBadSignature
) {
208 PrepareExistingPolicy();
209 device_policy_
.policy().set_policy_data_signature("invalid");
210 store_
->Store(device_policy_
.policy());
211 FlushDeviceSettings();
212 EXPECT_EQ(CloudPolicyStore::STATUS_VALIDATION_ERROR
, store_
->status());
213 EXPECT_EQ(CloudPolicyValidatorBase::VALIDATION_BAD_SIGNATURE
,
214 store_
->validation_status());
217 TEST_F(DeviceCloudPolicyStoreChromeOSTest
, StoreKeyRotation
) {
218 PrepareExistingPolicy();
219 device_policy_
.SetDefaultNewSigningKey();
220 device_policy_
.Build();
221 store_
->Store(device_policy_
.policy());
222 content::RunAllBlockingPoolTasksUntilIdle();
223 device_settings_test_helper_
.FlushStore();
224 owner_key_util_
->SetPublicKeyFromPrivateKey(
225 *device_policy_
.GetNewSigningKey());
226 ReloadDeviceSettings();
230 TEST_F(DeviceCloudPolicyStoreChromeOSTest
,
231 StoreKeyRotationVerificationFailure
) {
232 PrepareExistingPolicy();
233 device_policy_
.SetDefaultNewSigningKey();
234 device_policy_
.Build();
235 *device_policy_
.policy().mutable_new_public_key_verification_signature() =
237 store_
->Store(device_policy_
.policy());
238 FlushDeviceSettings();
239 EXPECT_EQ(CloudPolicyStore::STATUS_VALIDATION_ERROR
, store_
->status());
240 EXPECT_EQ(CloudPolicyValidatorBase::VALIDATION_BAD_KEY_VERIFICATION_SIGNATURE
,
241 store_
->validation_status());
244 TEST_F(DeviceCloudPolicyStoreChromeOSTest
,
245 StoreKeyRotationMissingSignatureFailure
) {
246 PrepareExistingPolicy();
247 device_policy_
.SetDefaultNewSigningKey();
248 device_policy_
.Build();
249 device_policy_
.policy().clear_new_public_key_verification_signature();
250 store_
->Store(device_policy_
.policy());
251 FlushDeviceSettings();
252 EXPECT_EQ(CloudPolicyStore::STATUS_VALIDATION_ERROR
, store_
->status());
253 EXPECT_EQ(CloudPolicyValidatorBase::VALIDATION_BAD_KEY_VERIFICATION_SIGNATURE
,
254 store_
->validation_status());
257 TEST_F(DeviceCloudPolicyStoreChromeOSTest
, InstallInitialPolicySuccess
) {
258 PrepareNewSigningKey();
259 store_
->InstallInitialPolicy(device_policy_
.policy());
260 FlushDeviceSettings();
264 TEST_F(DeviceCloudPolicyStoreChromeOSTest
, InstallInitialPolicyNoSignature
) {
265 PrepareNewSigningKey();
266 device_policy_
.policy().clear_policy_data_signature();
267 store_
->InstallInitialPolicy(device_policy_
.policy());
268 FlushDeviceSettings();
269 ExpectFailure(CloudPolicyStore::STATUS_VALIDATION_ERROR
);
270 EXPECT_EQ(CloudPolicyValidatorBase::VALIDATION_BAD_INITIAL_SIGNATURE
,
271 store_
->validation_status());
274 TEST_F(DeviceCloudPolicyStoreChromeOSTest
,
275 InstallInitialPolicyVerificationFailure
) {
276 PrepareNewSigningKey();
277 *device_policy_
.policy().mutable_new_public_key_verification_signature() =
279 store_
->InstallInitialPolicy(device_policy_
.policy());
280 FlushDeviceSettings();
281 ExpectFailure(CloudPolicyStore::STATUS_VALIDATION_ERROR
);
282 EXPECT_EQ(CloudPolicyValidatorBase::VALIDATION_BAD_KEY_VERIFICATION_SIGNATURE
,
283 store_
->validation_status());
286 TEST_F(DeviceCloudPolicyStoreChromeOSTest
,
287 InstallInitialPolicyMissingSignatureFailure
) {
288 PrepareNewSigningKey();
289 device_policy_
.policy().clear_new_public_key_verification_signature();
290 store_
->InstallInitialPolicy(device_policy_
.policy());
291 FlushDeviceSettings();
292 ExpectFailure(CloudPolicyStore::STATUS_VALIDATION_ERROR
);
293 EXPECT_EQ(CloudPolicyValidatorBase::VALIDATION_BAD_KEY_VERIFICATION_SIGNATURE
,
294 store_
->validation_status());
297 TEST_F(DeviceCloudPolicyStoreChromeOSTest
, InstallInitialPolicyNoKey
) {
298 PrepareNewSigningKey();
299 device_policy_
.policy().clear_new_public_key();
300 store_
->InstallInitialPolicy(device_policy_
.policy());
301 FlushDeviceSettings();
302 ExpectFailure(CloudPolicyStore::STATUS_VALIDATION_ERROR
);
303 EXPECT_EQ(CloudPolicyValidatorBase::VALIDATION_BAD_INITIAL_SIGNATURE
,
304 store_
->validation_status());
307 TEST_F(DeviceCloudPolicyStoreChromeOSTest
, InstallInitialPolicyNotEnterprise
) {
308 PrepareNewSigningKey();
309 ResetToNonEnterprise();
310 store_
->InstallInitialPolicy(device_policy_
.policy());
311 FlushDeviceSettings();
312 ExpectFailure(CloudPolicyStore::STATUS_BAD_STATE
);
315 } // namespace policy