| OLD | NEW |
| 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/chromeos/policy/user_cloud_policy_store_chromeos.h" | 5 #include "chrome/browser/chromeos/policy/user_cloud_policy_store_chromeos.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 OnStoreError(AllOf(Eq(store_.get()), | 95 OnStoreError(AllOf(Eq(store_.get()), |
| 96 Property(&CloudPolicyStore::status, | 96 Property(&CloudPolicyStore::status, |
| 97 Eq(error))))); | 97 Eq(error))))); |
| 98 } | 98 } |
| 99 | 99 |
| 100 // Triggers a store_->Load() operation, handles the expected call to | 100 // Triggers a store_->Load() operation, handles the expected call to |
| 101 // |session_manager_client_| and sends |response|. | 101 // |session_manager_client_| and sends |response|. |
| 102 void PerformPolicyLoad(const std::string& response) { | 102 void PerformPolicyLoad(const std::string& response) { |
| 103 // Issue a load command. | 103 // Issue a load command. |
| 104 chromeos::SessionManagerClient::RetrievePolicyCallback retrieve_callback; | 104 chromeos::SessionManagerClient::RetrievePolicyCallback retrieve_callback; |
| 105 EXPECT_CALL(session_manager_client_, RetrieveUserPolicy(_)) | 105 EXPECT_CALL(session_manager_client_, |
| 106 .WillOnce(SaveArg<0>(&retrieve_callback)); | 106 RetrievePolicyForUser(PolicyBuilder::kFakeUsername, _)) |
| 107 .WillOnce(SaveArg<1>(&retrieve_callback)); |
| 107 store_->Load(); | 108 store_->Load(); |
| 108 RunUntilIdle(); | 109 RunUntilIdle(); |
| 109 Mock::VerifyAndClearExpectations(&session_manager_client_); | 110 Mock::VerifyAndClearExpectations(&session_manager_client_); |
| 110 ASSERT_FALSE(retrieve_callback.is_null()); | 111 ASSERT_FALSE(retrieve_callback.is_null()); |
| 111 | 112 |
| 112 // Run the callback. | 113 // Run the callback. |
| 113 retrieve_callback.Run(response); | 114 retrieve_callback.Run(response); |
| 114 RunUntilIdle(); | 115 RunUntilIdle(); |
| 115 } | 116 } |
| 116 | 117 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 136 // If |new_public_key| is set then it will be persisted after storing but | 137 // If |new_public_key| is set then it will be persisted after storing but |
| 137 // before loading the policy, so that the signature validation can succeed. | 138 // before loading the policy, so that the signature validation can succeed. |
| 138 // If |previous_value| is set then a previously existing policy with that | 139 // If |previous_value| is set then a previously existing policy with that |
| 139 // value will be expected; otherwise no previous policy is expected. | 140 // value will be expected; otherwise no previous policy is expected. |
| 140 // If |new_value| is set then a new policy with that value is expected after | 141 // If |new_value| is set then a new policy with that value is expected after |
| 141 // storing the |policy_| blob. | 142 // storing the |policy_| blob. |
| 142 void PerformStorePolicy(const std::vector<uint8>* new_public_key, | 143 void PerformStorePolicy(const std::vector<uint8>* new_public_key, |
| 143 const char* previous_value, | 144 const char* previous_value, |
| 144 const char* new_value) { | 145 const char* new_value) { |
| 145 chromeos::SessionManagerClient::StorePolicyCallback store_callback; | 146 chromeos::SessionManagerClient::StorePolicyCallback store_callback; |
| 146 EXPECT_CALL(session_manager_client_, StoreUserPolicy(policy_.GetBlob(), _)) | 147 EXPECT_CALL(session_manager_client_, |
| 147 .WillOnce(SaveArg<1>(&store_callback)); | 148 StorePolicyForUser(PolicyBuilder::kFakeUsername, |
| 149 policy_.GetBlob(), _, _)) |
| 150 .WillOnce(SaveArg<3>(&store_callback)); |
| 148 store_->Store(policy_.policy()); | 151 store_->Store(policy_.policy()); |
| 149 RunUntilIdle(); | 152 RunUntilIdle(); |
| 150 Mock::VerifyAndClearExpectations(&session_manager_client_); | 153 Mock::VerifyAndClearExpectations(&session_manager_client_); |
| 151 ASSERT_FALSE(store_callback.is_null()); | 154 ASSERT_FALSE(store_callback.is_null()); |
| 152 | 155 |
| 153 // The new policy shouldn't be present yet. | 156 // The new policy shouldn't be present yet. |
| 154 PolicyMap previous_policy; | 157 PolicyMap previous_policy; |
| 155 EXPECT_EQ(previous_value != NULL, store_->policy() != NULL); | 158 EXPECT_EQ(previous_value != NULL, store_->policy() != NULL); |
| 156 if (previous_value) { | 159 if (previous_value) { |
| 157 previous_policy.Set(key::kHomepageLocation, | 160 previous_policy.Set(key::kHomepageLocation, |
| 158 POLICY_LEVEL_MANDATORY, | 161 POLICY_LEVEL_MANDATORY, |
| 159 POLICY_SCOPE_USER, | 162 POLICY_SCOPE_USER, |
| 160 base::Value::CreateStringValue(previous_value)); | 163 base::Value::CreateStringValue(previous_value)); |
| 161 } | 164 } |
| 162 EXPECT_TRUE(previous_policy.Equals(store_->policy_map())); | 165 EXPECT_TRUE(previous_policy.Equals(store_->policy_map())); |
| 163 EXPECT_EQ(CloudPolicyStore::STATUS_OK, store_->status()); | 166 EXPECT_EQ(CloudPolicyStore::STATUS_OK, store_->status()); |
| 164 | 167 |
| 165 // Store the new public key so that the validation after the retrieve | 168 // Store the new public key so that the validation after the retrieve |
| 166 // operation completes can verify the signature. | 169 // operation completes can verify the signature. |
| 167 if (new_public_key) | 170 if (new_public_key) |
| 168 StoreUserPolicyKey(*new_public_key); | 171 StoreUserPolicyKey(*new_public_key); |
| 169 | 172 |
| 170 // Let the store operation complete. | 173 // Let the store operation complete. |
| 171 chromeos::SessionManagerClient::RetrievePolicyCallback retrieve_callback; | 174 chromeos::SessionManagerClient::RetrievePolicyCallback retrieve_callback; |
| 172 EXPECT_CALL(session_manager_client_, RetrieveUserPolicy(_)) | 175 EXPECT_CALL(session_manager_client_, |
| 173 .WillOnce(SaveArg<0>(&retrieve_callback)); | 176 RetrievePolicyForUser(PolicyBuilder::kFakeUsername, _)) |
| 177 .WillOnce(SaveArg<1>(&retrieve_callback)); |
| 174 store_callback.Run(true); | 178 store_callback.Run(true); |
| 175 RunUntilIdle(); | 179 RunUntilIdle(); |
| 176 EXPECT_TRUE(previous_policy.Equals(store_->policy_map())); | 180 EXPECT_TRUE(previous_policy.Equals(store_->policy_map())); |
| 177 EXPECT_EQ(CloudPolicyStore::STATUS_OK, store_->status()); | 181 EXPECT_EQ(CloudPolicyStore::STATUS_OK, store_->status()); |
| 178 Mock::VerifyAndClearExpectations(&session_manager_client_); | 182 Mock::VerifyAndClearExpectations(&session_manager_client_); |
| 179 ASSERT_FALSE(retrieve_callback.is_null()); | 183 ASSERT_FALSE(retrieve_callback.is_null()); |
| 180 | 184 |
| 181 // Finish the retrieve callback. | 185 // Finish the retrieve callback. |
| 182 EXPECT_CALL(observer_, OnStoreLoaded(store_.get())); | 186 EXPECT_CALL(observer_, OnStoreLoaded(store_.get())); |
| 183 retrieve_callback.Run(policy_.GetBlob()); | 187 retrieve_callback.Run(policy_.GetBlob()); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 policy_.Build(); | 260 policy_.Build(); |
| 257 std::vector<uint8> new_public_key; | 261 std::vector<uint8> new_public_key; |
| 258 ASSERT_TRUE(policy_.new_signing_key()->ExportPublicKey(&new_public_key)); | 262 ASSERT_TRUE(policy_.new_signing_key()->ExportPublicKey(&new_public_key)); |
| 259 ASSERT_NO_FATAL_FAILURE( | 263 ASSERT_NO_FATAL_FAILURE( |
| 260 PerformStorePolicy(&new_public_key, NULL, kDefaultHomepage)); | 264 PerformStorePolicy(&new_public_key, NULL, kDefaultHomepage)); |
| 261 } | 265 } |
| 262 | 266 |
| 263 TEST_F(UserCloudPolicyStoreChromeOSTest, StoreFail) { | 267 TEST_F(UserCloudPolicyStoreChromeOSTest, StoreFail) { |
| 264 // Store policy. | 268 // Store policy. |
| 265 chromeos::SessionManagerClient::StorePolicyCallback store_callback; | 269 chromeos::SessionManagerClient::StorePolicyCallback store_callback; |
| 266 EXPECT_CALL(session_manager_client_, StoreUserPolicy(policy_.GetBlob(), _)) | 270 EXPECT_CALL(session_manager_client_, |
| 267 .WillOnce(SaveArg<1>(&store_callback)); | 271 StorePolicyForUser(PolicyBuilder::kFakeUsername, |
| 272 policy_.GetBlob(), _, _)) |
| 273 .WillOnce(SaveArg<3>(&store_callback)); |
| 268 store_->Store(policy_.policy()); | 274 store_->Store(policy_.policy()); |
| 269 RunUntilIdle(); | 275 RunUntilIdle(); |
| 270 Mock::VerifyAndClearExpectations(&session_manager_client_); | 276 Mock::VerifyAndClearExpectations(&session_manager_client_); |
| 271 ASSERT_FALSE(store_callback.is_null()); | 277 ASSERT_FALSE(store_callback.is_null()); |
| 272 | 278 |
| 273 // Let the store operation complete. | 279 // Let the store operation complete. |
| 274 ExpectError(CloudPolicyStore::STATUS_STORE_ERROR); | 280 ExpectError(CloudPolicyStore::STATUS_STORE_ERROR); |
| 275 store_callback.Run(false); | 281 store_callback.Run(false); |
| 276 RunUntilIdle(); | 282 RunUntilIdle(); |
| 277 EXPECT_FALSE(store_->policy()); | 283 EXPECT_FALSE(store_->policy()); |
| 278 EXPECT_TRUE(store_->policy_map().empty()); | 284 EXPECT_TRUE(store_->policy_map().empty()); |
| 279 EXPECT_EQ(CloudPolicyStore::STATUS_STORE_ERROR, store_->status()); | 285 EXPECT_EQ(CloudPolicyStore::STATUS_STORE_ERROR, store_->status()); |
| 280 } | 286 } |
| 281 | 287 |
| 282 TEST_F(UserCloudPolicyStoreChromeOSTest, StoreValidationError) { | 288 TEST_F(UserCloudPolicyStoreChromeOSTest, StoreValidationError) { |
| 283 policy_.policy_data().clear_policy_type(); | 289 policy_.policy_data().clear_policy_type(); |
| 284 policy_.Build(); | 290 policy_.Build(); |
| 285 | 291 |
| 286 // Store policy. | 292 // Store policy. |
| 287 chromeos::SessionManagerClient::StorePolicyCallback store_callback; | 293 chromeos::SessionManagerClient::StorePolicyCallback store_callback; |
| 288 ExpectError(CloudPolicyStore::STATUS_VALIDATION_ERROR); | 294 ExpectError(CloudPolicyStore::STATUS_VALIDATION_ERROR); |
| 289 EXPECT_CALL(session_manager_client_, StoreUserPolicy(policy_.GetBlob(), _)) | 295 EXPECT_CALL(session_manager_client_, |
| 296 StorePolicyForUser(PolicyBuilder::kFakeUsername, |
| 297 policy_.GetBlob(), _, _)) |
| 290 .Times(0); | 298 .Times(0); |
| 291 store_->Store(policy_.policy()); | 299 store_->Store(policy_.policy()); |
| 292 RunUntilIdle(); | 300 RunUntilIdle(); |
| 293 Mock::VerifyAndClearExpectations(&session_manager_client_); | 301 Mock::VerifyAndClearExpectations(&session_manager_client_); |
| 294 } | 302 } |
| 295 | 303 |
| 296 TEST_F(UserCloudPolicyStoreChromeOSTest, StoreWithoutPolicyKey) { | 304 TEST_F(UserCloudPolicyStoreChromeOSTest, StoreWithoutPolicyKey) { |
| 297 // Make the dbus call to cryptohome fail. | 305 // Make the dbus call to cryptohome fail. |
| 298 Mock::VerifyAndClearExpectations(&cryptohome_client_); | 306 Mock::VerifyAndClearExpectations(&cryptohome_client_); |
| 299 EXPECT_CALL(cryptohome_client_, | 307 EXPECT_CALL(cryptohome_client_, |
| 300 GetSanitizedUsername(PolicyBuilder::kFakeUsername, _)) | 308 GetSanitizedUsername(PolicyBuilder::kFakeUsername, _)) |
| 301 .Times(AnyNumber()) | 309 .Times(AnyNumber()) |
| 302 .WillRepeatedly(SendSanitizedUsername(chromeos::DBUS_METHOD_CALL_FAILURE, | 310 .WillRepeatedly(SendSanitizedUsername(chromeos::DBUS_METHOD_CALL_FAILURE, |
| 303 std::string())); | 311 std::string())); |
| 304 | 312 |
| 305 // Store policy. | 313 // Store policy. |
| 306 chromeos::SessionManagerClient::StorePolicyCallback store_callback; | 314 chromeos::SessionManagerClient::StorePolicyCallback store_callback; |
| 307 ExpectError(CloudPolicyStore::STATUS_VALIDATION_ERROR); | 315 ExpectError(CloudPolicyStore::STATUS_VALIDATION_ERROR); |
| 308 EXPECT_CALL(session_manager_client_, StoreUserPolicy(policy_.GetBlob(), _)) | 316 EXPECT_CALL(session_manager_client_, |
| 317 StorePolicyForUser(PolicyBuilder::kFakeUsername, |
| 318 policy_.GetBlob(), _, _)) |
| 309 .Times(0); | 319 .Times(0); |
| 310 store_->Store(policy_.policy()); | 320 store_->Store(policy_.policy()); |
| 311 RunUntilIdle(); | 321 RunUntilIdle(); |
| 312 Mock::VerifyAndClearExpectations(&session_manager_client_); | 322 Mock::VerifyAndClearExpectations(&session_manager_client_); |
| 313 } | 323 } |
| 314 | 324 |
| 315 TEST_F(UserCloudPolicyStoreChromeOSTest, StoreWithInvalidSignature) { | 325 TEST_F(UserCloudPolicyStoreChromeOSTest, StoreWithInvalidSignature) { |
| 316 // Break the signature. | 326 // Break the signature. |
| 317 policy_.policy().mutable_policy_data_signature()->append("garbage"); | 327 policy_.policy().mutable_policy_data_signature()->append("garbage"); |
| 318 | 328 |
| 319 // Store policy. | 329 // Store policy. |
| 320 chromeos::SessionManagerClient::StorePolicyCallback store_callback; | 330 chromeos::SessionManagerClient::StorePolicyCallback store_callback; |
| 321 ExpectError(CloudPolicyStore::STATUS_VALIDATION_ERROR); | 331 ExpectError(CloudPolicyStore::STATUS_VALIDATION_ERROR); |
| 322 EXPECT_CALL(session_manager_client_, StoreUserPolicy(policy_.GetBlob(), _)) | 332 EXPECT_CALL(session_manager_client_, |
| 333 StorePolicyForUser(PolicyBuilder::kFakeUsername, |
| 334 policy_.GetBlob(), _, _)) |
| 323 .Times(0); | 335 .Times(0); |
| 324 store_->Store(policy_.policy()); | 336 store_->Store(policy_.policy()); |
| 325 RunUntilIdle(); | 337 RunUntilIdle(); |
| 326 Mock::VerifyAndClearExpectations(&session_manager_client_); | 338 Mock::VerifyAndClearExpectations(&session_manager_client_); |
| 327 } | 339 } |
| 328 | 340 |
| 329 TEST_F(UserCloudPolicyStoreChromeOSTest, Load) { | 341 TEST_F(UserCloudPolicyStoreChromeOSTest, Load) { |
| 330 EXPECT_CALL(observer_, OnStoreLoaded(store_.get())); | 342 EXPECT_CALL(observer_, OnStoreLoaded(store_.get())); |
| 331 ASSERT_NO_FATAL_FAILURE(PerformPolicyLoad(policy_.GetBlob())); | 343 ASSERT_NO_FATAL_FAILURE(PerformPolicyLoad(policy_.GetBlob())); |
| 332 Mock::VerifyAndClearExpectations(&observer_); | 344 Mock::VerifyAndClearExpectations(&observer_); |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 PerformStorePolicy(&new_public_key, kDefaultHomepage, kNewHomepage)); | 515 PerformStorePolicy(&new_public_key, kDefaultHomepage, kNewHomepage)); |
| 504 VerifyPolicyMap(kNewHomepage); | 516 VerifyPolicyMap(kNewHomepage); |
| 505 | 517 |
| 506 // Verify that the legacy cache has been removed. | 518 // Verify that the legacy cache has been removed. |
| 507 EXPECT_FALSE(file_util::PathExists(policy_file())); | 519 EXPECT_FALSE(file_util::PathExists(policy_file())); |
| 508 } | 520 } |
| 509 | 521 |
| 510 } // namespace | 522 } // namespace |
| 511 | 523 |
| 512 } // namespace policy | 524 } // namespace policy |
| OLD | NEW |