diff options
author | atwilson@chromium.org <atwilson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-09 14:54:28 +0000 |
---|---|---|
committer | atwilson@chromium.org <atwilson@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-09-09 14:54:28 +0000 |
commit | 8d8a949192e5215c3df6ca45f293f3a202ad6598 (patch) | |
tree | d0d032af6693e2773fad5bfd83a3dfe94b9cae4b | |
parent | 5ba2fa14634cc42f06dab446ede77354795bc62a (diff) | |
download | chromium_src-8d8a949192e5215c3df6ca45f293f3a202ad6598.zip chromium_src-8d8a949192e5215c3df6ca45f293f3a202ad6598.tar.gz chromium_src-8d8a949192e5215c3df6ca45f293f3a202ad6598.tar.bz2 |
Turn off future-timestamp cloud policy checks on desktop
BUG=279099
Review URL: https://chromiumcodereview.appspot.com/24041002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@222028 0039d316-1c4b-4281-b951-d872f2087c98
7 files changed, 42 insertions, 17 deletions
diff --git a/chrome/browser/chromeos/policy/user_cloud_policy_store_chromeos.cc b/chrome/browser/chromeos/policy/user_cloud_policy_store_chromeos.cc index 2d6232d..cce3d66 100644 --- a/chrome/browser/chromeos/policy/user_cloud_policy_store_chromeos.cc +++ b/chrome/browser/chromeos/policy/user_cloud_policy_store_chromeos.cc @@ -243,7 +243,8 @@ void UserCloudPolicyStoreChromeOS::LoadImmediately() { policy_key_loaded_ = true; scoped_ptr<UserCloudPolicyValidator> validator = - CreateValidator(policy.Pass()); + CreateValidator(policy.Pass(), + CloudPolicyValidatorBase::TIMESTAMP_REQUIRED); validator->ValidateUsername(username_); const bool allow_rotation = false; validator->ValidateSignature(policy_key_, allow_rotation); @@ -255,7 +256,8 @@ void UserCloudPolicyStoreChromeOS::ValidatePolicyForStore( scoped_ptr<em::PolicyFetchResponse> policy) { // Create and configure a validator. scoped_ptr<UserCloudPolicyValidator> validator = - CreateValidator(policy.Pass()); + CreateValidator(policy.Pass(), + CloudPolicyValidatorBase::TIMESTAMP_REQUIRED); validator->ValidateUsername(username_); if (policy_key_.empty()) { validator->ValidateInitialKey(); @@ -353,7 +355,8 @@ void UserCloudPolicyStoreChromeOS::ValidateRetrievedPolicy( scoped_ptr<em::PolicyFetchResponse> policy) { // Create and configure a validator for the loaded policy. scoped_ptr<UserCloudPolicyValidator> validator = - CreateValidator(policy.Pass()); + CreateValidator(policy.Pass(), + CloudPolicyValidatorBase::TIMESTAMP_REQUIRED); validator->ValidateUsername(username_); const bool allow_rotation = false; validator->ValidateSignature(policy_key_, allow_rotation); @@ -404,7 +407,8 @@ void UserCloudPolicyStoreChromeOS::OnLegacyLoadFinished( // Create and configure a validator for the loaded legacy policy. Note that // the signature on this policy is not verified. scoped_ptr<UserCloudPolicyValidator> validator = - CreateValidator(policy.Pass()); + CreateValidator(policy.Pass(), + CloudPolicyValidatorBase::TIMESTAMP_REQUIRED); validator->ValidateUsername(username_); validator.release()->StartValidation( base::Bind(&UserCloudPolicyStoreChromeOS::OnLegacyPolicyValidated, diff --git a/chrome/browser/policy/cloud/cloud_policy_validator.cc b/chrome/browser/policy/cloud/cloud_policy_validator.cc index c6e6ded..b45392e 100644 --- a/chrome/browser/policy/cloud/cloud_policy_validator.cc +++ b/chrome/browser/policy/cloud/cloud_policy_validator.cc @@ -278,7 +278,8 @@ CloudPolicyValidatorBase::Status CloudPolicyValidatorBase::CheckTimestamp() { LOG(ERROR) << "Policy too old: " << policy_data_->timestamp(); return VALIDATION_BAD_TIMESTAMP; } - if (policy_data_->timestamp() > timestamp_not_after_) { + if (timestamp_option_ != TIMESTAMP_NOT_BEFORE && + policy_data_->timestamp() > timestamp_not_after_) { LOG(ERROR) << "Policy from the future: " << policy_data_->timestamp(); return VALIDATION_BAD_TIMESTAMP; } diff --git a/chrome/browser/policy/cloud/cloud_policy_validator.h b/chrome/browser/policy/cloud/cloud_policy_validator.h index d53a0c6..2635e4a 100644 --- a/chrome/browser/policy/cloud/cloud_policy_validator.h +++ b/chrome/browser/policy/cloud/cloud_policy_validator.h @@ -79,9 +79,16 @@ class CloudPolicyValidatorBase { }; enum ValidateTimestampOption { - // The policy must have a timestamp field. + // The policy must have a timestamp field and it should be checked against + // both the start and end times. TIMESTAMP_REQUIRED, + // The timestamp should only be compared vs the |not_before| value (this + // is appropriate for platforms with unreliable system times, where we want + // to ensure that fresh policy is newer than existing policy, but we can't + // do any other validation). + TIMESTAMP_NOT_BEFORE, + // No timestamp field is required. TIMESTAMP_NOT_REQUIRED, }; @@ -102,11 +109,11 @@ class CloudPolicyValidatorBase { } // Instructs the validator to check that the policy timestamp is not before - // |not_before| and not after |now| + grace interval. If + // |not_before| and not after |not_after| + grace interval. If // |timestamp_option| is set to TIMESTAMP_REQUIRED, then the policy will fail // validation if it does not have a timestamp field. void ValidateTimestamp(base::Time not_before, - base::Time now, + base::Time not_after, ValidateTimestampOption timestamp_option); // Validates the username in the policy blob matches |expected_user|. diff --git a/chrome/browser/policy/cloud/cloud_policy_validator_unittest.cc b/chrome/browser/policy/cloud/cloud_policy_validator_unittest.cc index 27cc7e4..1efe9a6 100644 --- a/chrome/browser/policy/cloud/cloud_policy_validator_unittest.cc +++ b/chrome/browser/policy/cloud/cloud_policy_validator_unittest.cc @@ -36,7 +36,7 @@ class CloudPolicyValidatorTest : public testing::Test { timestamp_(base::Time::UnixEpoch() + base::TimeDelta::FromMilliseconds( PolicyBuilder::kFakeTimestamp)), - ignore_missing_timestamp_(CloudPolicyValidatorBase::TIMESTAMP_REQUIRED), + timestamp_option_(CloudPolicyValidatorBase::TIMESTAMP_REQUIRED), ignore_missing_dm_token_(CloudPolicyValidatorBase::DM_TOKEN_REQUIRED), allow_key_rotation_(true), existing_dm_token_(PolicyBuilder::kFakeToken), @@ -67,7 +67,7 @@ class CloudPolicyValidatorTest : public testing::Test { UserCloudPolicyValidator* validator = UserCloudPolicyValidator::Create(policy_.GetCopy()); validator->ValidateTimestamp(timestamp_, timestamp_, - ignore_missing_timestamp_); + timestamp_option_); validator->ValidateUsername(PolicyBuilder::kFakeUsername); validator->ValidateDomain(PolicyBuilder::kFakeDomain); validator->ValidateDMToken(existing_dm_token_, ignore_missing_dm_token_); @@ -92,7 +92,7 @@ class CloudPolicyValidatorTest : public testing::Test { base::MessageLoop loop_; base::Time timestamp_; - CloudPolicyValidatorBase::ValidateTimestampOption ignore_missing_timestamp_; + CloudPolicyValidatorBase::ValidateTimestampOption timestamp_option_; CloudPolicyValidatorBase::ValidateDMTokenOption ignore_missing_dm_token_; std::string signing_key_; bool allow_key_rotation_; @@ -153,7 +153,7 @@ TEST_F(CloudPolicyValidatorTest, ErrorNoTimestamp) { } TEST_F(CloudPolicyValidatorTest, IgnoreMissingTimestamp) { - ignore_missing_timestamp_ = CloudPolicyValidatorBase::TIMESTAMP_NOT_REQUIRED; + timestamp_option_ = CloudPolicyValidatorBase::TIMESTAMP_NOT_REQUIRED; policy_.policy_data().clear_timestamp(); Validate(CheckStatus(CloudPolicyValidatorBase::VALIDATION_OK)); } @@ -172,6 +172,15 @@ TEST_F(CloudPolicyValidatorTest, ErrorTimestampFromTheFuture) { Validate(CheckStatus(CloudPolicyValidatorBase::VALIDATION_BAD_TIMESTAMP)); } +TEST_F(CloudPolicyValidatorTest, IgnoreErrorTimestampFromTheFuture) { + base::Time timestamp(timestamp_ + base::TimeDelta::FromMinutes(5)); + timestamp_option_ = + CloudPolicyValidatorBase::TIMESTAMP_NOT_BEFORE; + policy_.policy_data().set_timestamp( + (timestamp - base::Time::UnixEpoch()).InMilliseconds()); + Validate(CheckStatus(CloudPolicyValidatorBase::VALIDATION_OK)); +} + TEST_F(CloudPolicyValidatorTest, ErrorNoRequestToken) { policy_.policy_data().clear_request_token(); Validate(CheckStatus(CloudPolicyValidatorBase::VALIDATION_WRONG_TOKEN)); diff --git a/chrome/browser/policy/cloud/user_cloud_policy_store.cc b/chrome/browser/policy/cloud/user_cloud_policy_store.cc index 3592b85..981e87e 100644 --- a/chrome/browser/policy/cloud/user_cloud_policy_store.cc +++ b/chrome/browser/policy/cloud/user_cloud_policy_store.cc @@ -210,8 +210,9 @@ void UserCloudPolicyStore::Validate( bool validate_in_background, const UserCloudPolicyValidator::CompletionCallback& callback) { // Configure the validator. - scoped_ptr<UserCloudPolicyValidator> validator = - CreateValidator(policy.Pass()); + scoped_ptr<UserCloudPolicyValidator> validator = CreateValidator( + policy.Pass(), + CloudPolicyValidatorBase::TIMESTAMP_NOT_BEFORE); SigninManager* signin = SigninManagerFactory::GetForProfileIfExists(profile_); if (signin) { std::string username = signin->GetAuthenticatedUsername(); diff --git a/chrome/browser/policy/cloud/user_cloud_policy_store_base.cc b/chrome/browser/policy/cloud/user_cloud_policy_store_base.cc index b2c38fc..2d097ba 100644 --- a/chrome/browser/policy/cloud/user_cloud_policy_store_base.cc +++ b/chrome/browser/policy/cloud/user_cloud_policy_store_base.cc @@ -24,14 +24,15 @@ UserCloudPolicyStoreBase::~UserCloudPolicyStoreBase() { } scoped_ptr<UserCloudPolicyValidator> UserCloudPolicyStoreBase::CreateValidator( - scoped_ptr<enterprise_management::PolicyFetchResponse> policy) { + scoped_ptr<enterprise_management::PolicyFetchResponse> policy, + CloudPolicyValidatorBase::ValidateTimestampOption timestamp_option) { // Configure the validator. UserCloudPolicyValidator* validator = UserCloudPolicyValidator::Create(policy.Pass()); validator->ValidatePolicyType(GetChromeUserPolicyType()); validator->ValidateAgainstCurrentPolicy( policy_.get(), - CloudPolicyValidatorBase::TIMESTAMP_REQUIRED, + timestamp_option, CloudPolicyValidatorBase::DM_TOKEN_REQUIRED); validator->ValidatePayload(); return scoped_ptr<UserCloudPolicyValidator>(validator); diff --git a/chrome/browser/policy/cloud/user_cloud_policy_store_base.h b/chrome/browser/policy/cloud/user_cloud_policy_store_base.h index 514983a..e00a3d2 100644 --- a/chrome/browser/policy/cloud/user_cloud_policy_store_base.h +++ b/chrome/browser/policy/cloud/user_cloud_policy_store_base.h @@ -11,6 +11,7 @@ #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/policy/cloud/cloud_policy_store.h" +#include "chrome/browser/policy/cloud/cloud_policy_validator.h" namespace policy { @@ -25,7 +26,8 @@ class UserCloudPolicyStoreBase : public CloudPolicyStore { // Creates a validator configured to validate a user policy. The caller owns // the resulting object until StartValidation() is invoked. scoped_ptr<UserCloudPolicyValidator> CreateValidator( - scoped_ptr<enterprise_management::PolicyFetchResponse> policy); + scoped_ptr<enterprise_management::PolicyFetchResponse> policy, + CloudPolicyValidatorBase::ValidateTimestampOption option); // Sets |policy_data| and |payload| as the active policy. void InstallPolicy( |