Index: components/policy/core/common/cloud/cloud_policy_validator_unittest.cc |
diff --git a/components/policy/core/common/cloud/cloud_policy_validator_unittest.cc b/components/policy/core/common/cloud/cloud_policy_validator_unittest.cc |
index bde96f0ab002cf725bde96df8098d98d2474454f..e617ff26f207fe1feb22f7676e5659eadb14aab3 100644 |
--- a/components/policy/core/common/cloud/cloud_policy_validator_unittest.cc |
+++ b/components/policy/core/common/cloud/cloud_policy_validator_unittest.cc |
@@ -16,6 +16,7 @@ |
#include "components/policy/core/common/cloud/policy_builder.h" |
#include "components/policy/core/common/policy_switches.h" |
#include "crypto/rsa_private_key.h" |
+#include "policy/proto/device_management_backend.pb.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -41,7 +42,8 @@ class CloudPolicyValidatorTest : public testing::Test { |
timestamp_option_(CloudPolicyValidatorBase::TIMESTAMP_REQUIRED), |
ignore_missing_dm_token_(CloudPolicyValidatorBase::DM_TOKEN_REQUIRED), |
allow_key_rotation_(true), |
- existing_dm_token_(PolicyBuilder::kFakeToken) { |
+ existing_dm_token_(PolicyBuilder::kFakeToken), |
+ owning_domain_(PolicyBuilder::kFakeDomain){ |
policy_.SetDefaultNewSigningKey(); |
} |
@@ -51,8 +53,16 @@ class CloudPolicyValidatorTest : public testing::Test { |
} |
void Validate(testing::Action<void(UserCloudPolicyValidator*)> check_action) { |
+ policy_.Build(); |
+ ValidatePolicy(check_action, policy_.GetCopy()); |
+ } |
+ |
+ void ValidatePolicy( |
+ testing::Action<void(UserCloudPolicyValidator*)> check_action, |
+ scoped_ptr<enterprise_management::PolicyFetchResponse> policy_response) { |
// Create a validator. |
- scoped_ptr<UserCloudPolicyValidator> validator = CreateValidator(); |
+ scoped_ptr<UserCloudPolicyValidator> validator = CreateValidator( |
+ policy_response.Pass()); |
// Run validation and check the result. |
EXPECT_CALL(*this, ValidationCompletion(validator.get())).WillOnce( |
@@ -64,12 +74,12 @@ class CloudPolicyValidatorTest : public testing::Test { |
Mock::VerifyAndClearExpectations(this); |
} |
- scoped_ptr<UserCloudPolicyValidator> CreateValidator() { |
+ scoped_ptr<UserCloudPolicyValidator> CreateValidator( |
+ scoped_ptr<enterprise_management::PolicyFetchResponse> policy_response) { |
std::vector<uint8> public_key_bytes; |
EXPECT_TRUE( |
PolicyBuilder::CreateTestSigningKey()->ExportPublicKey( |
&public_key_bytes)); |
- policy_.Build(); |
// Convert from bytes to string format (which is what ValidateSignature() |
// takes). |
@@ -78,20 +88,25 @@ class CloudPolicyValidatorTest : public testing::Test { |
public_key_bytes.size()); |
UserCloudPolicyValidator* validator = UserCloudPolicyValidator::Create( |
- policy_.GetCopy(), base::MessageLoopProxy::current()); |
+ policy_response.Pass(), base::MessageLoopProxy::current()); |
validator->ValidateTimestamp(timestamp_, timestamp_, |
timestamp_option_); |
validator->ValidateUsername(PolicyBuilder::kFakeUsername); |
- validator->ValidateDomain(PolicyBuilder::kFakeDomain); |
+ if (!owning_domain_.empty()) |
+ validator->ValidateDomain(owning_domain_); |
validator->ValidateDMToken(existing_dm_token_, ignore_missing_dm_token_); |
validator->ValidatePolicyType(dm_protocol::kChromeUserPolicyType); |
validator->ValidatePayload(); |
+ validator->ValidateCachedKey(public_key, |
+ PolicyBuilder::GetTestSigningKeySignature(), |
+ GetPolicyVerificationKey(), |
+ owning_domain_); |
validator->ValidateSignature(public_key, |
GetPolicyVerificationKey(), |
- PolicyBuilder::GetTestSigningKeySignature(), |
+ owning_domain_, |
allow_key_rotation_); |
if (allow_key_rotation_) |
- validator->ValidateInitialKey(GetPolicyVerificationKey()); |
+ validator->ValidateInitialKey(GetPolicyVerificationKey(), owning_domain_); |
return make_scoped_ptr(validator); |
} |
@@ -113,6 +128,7 @@ class CloudPolicyValidatorTest : public testing::Test { |
std::string signing_key_; |
bool allow_key_rotation_; |
std::string existing_dm_token_; |
+ std::string owning_domain_; |
UserPolicyBuilder policy_; |
@@ -127,7 +143,9 @@ TEST_F(CloudPolicyValidatorTest, SuccessfulValidation) { |
} |
TEST_F(CloudPolicyValidatorTest, SuccessfulRunValidation) { |
- scoped_ptr<UserCloudPolicyValidator> validator = CreateValidator(); |
+ policy_.Build(); |
+ scoped_ptr<UserCloudPolicyValidator> validator = CreateValidator( |
+ policy_.GetCopy()); |
// Run validation immediately (no background tasks). |
validator->RunValidation(); |
CheckSuccessfulValidation(validator.get()); |
@@ -240,7 +258,7 @@ TEST_F(CloudPolicyValidatorTest, ErrorNoUsername) { |
} |
TEST_F(CloudPolicyValidatorTest, ErrorInvalidUsername) { |
- policy_.policy_data().set_username("invalid"); |
+ policy_.policy_data().set_username("invalid@example.com"); |
Validate(CheckStatus(CloudPolicyValidatorBase::VALIDATION_BAD_USERNAME)); |
} |
@@ -302,12 +320,42 @@ TEST_F(CloudPolicyValidatorTest, ErrorInvalidPublicKeySignature) { |
// Validation key is not currently checked on Chrome OS |
// (http://crbug.com/328038). |
TEST_F(CloudPolicyValidatorTest, ErrorInvalidPublicKeyVerificationSignature) { |
+ policy_.Build(); |
policy_.policy().set_new_public_key_verification_signature("invalid"); |
- Validate(CheckStatus( |
- CloudPolicyValidatorBase::VALIDATION_BAD_KEY_VERIFICATION_SIGNATURE)); |
+ ValidatePolicy(CheckStatus( |
+ CloudPolicyValidatorBase::VALIDATION_BAD_KEY_VERIFICATION_SIGNATURE), |
+ policy_.GetCopy()); |
+} |
+ |
+TEST_F(CloudPolicyValidatorTest, ErrorDomainMismatchForKeyVerification) { |
+ policy_.Build(); |
+ // Generate a non-matching owning_domain, which should cause a validation |
+ // failure. |
+ owning_domain_ = "invalid.com"; |
+ ValidatePolicy(CheckStatus( |
+ CloudPolicyValidatorBase::VALIDATION_BAD_KEY_VERIFICATION_SIGNATURE), |
+ policy_.GetCopy()); |
+} |
+ |
+TEST_F(CloudPolicyValidatorTest, ErrorDomainExtractedFromUsernameMismatch) { |
+ // Generate a non-matching username domain, which should cause a validation |
+ // failure when we try to verify the signing key with it. |
+ policy_.policy_data().set_username("wonky@invalid.com"); |
+ policy_.Build(); |
+ owning_domain_ = ""; |
+ ValidatePolicy(CheckStatus( |
+ CloudPolicyValidatorBase::VALIDATION_BAD_KEY_VERIFICATION_SIGNATURE), |
+ policy_.GetCopy()); |
} |
#endif |
+TEST_F(CloudPolicyValidatorTest, SuccessfulNoDomainValidation) { |
+ // Don't pass in a domain - this tells the validation code to instead |
+ // extract the domain from the username. |
+ owning_domain_ = ""; |
+ Validate(Invoke(this, &CloudPolicyValidatorTest::CheckSuccessfulValidation)); |
+} |
+ |
TEST_F(CloudPolicyValidatorTest, ErrorNoRotationAllowed) { |
allow_key_rotation_ = false; |
Validate(CheckStatus(CloudPolicyValidatorBase::VALIDATION_BAD_SIGNATURE)); |