Index: chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc |
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc |
index 5656ee7c15c412be3607e4d82c3d29658491ed89..ec89b27cea3adc30bdff332fac20ac206b87b54d 100644 |
--- a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc |
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc |
@@ -7,8 +7,11 @@ |
#include "base/bind.h" |
#include "base/bind_helpers.h" |
#include "base/command_line.h" |
+#include "base/port.h" |
#include "base/prefs/pref_registry_simple.h" |
#include "base/prefs/pref_service.h" |
+#include "base/strings/string_number_conversions.h" |
+#include "base/time/time.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/chromeos/attestation/attestation_policy_observer.h" |
#include "chrome/browser/chromeos/login/startup_utils.h" |
@@ -44,13 +47,10 @@ const char kNoRequisition[] = "none"; |
// Overridden no requisition value. |
const char kRemoraRequisition[] = "remora"; |
-// MachineInfo key names. |
-const char kMachineInfoSystemHwqual[] = "hardware_class"; |
- |
// These are the machine serial number keys that we check in order until we |
// find a non-empty serial number. The VPD spec says the serial number should be |
// in the "serial_number" key for v2+ VPDs. However, legacy devices used a |
-// different keys to report their serial number, which we fall back to if |
+// different key to report their serial number, which we fall back to if |
// "serial_number" is not present. |
// |
// Product_S/N is still special-cased due to inconsistencies with serial |
@@ -96,6 +96,12 @@ bool GetMachineFlag(const std::string& key, bool default_value) { |
} // namespace |
+const int |
+DeviceCloudPolicyManagerChromeOS::kDeviceStateKeyTimeQuantumPower; |
+ |
+const int |
+DeviceCloudPolicyManagerChromeOS::kDeviceStateKeyFutureQuanta; |
+ |
DeviceCloudPolicyManagerChromeOS::DeviceCloudPolicyManagerChromeOS( |
scoped_ptr<DeviceCloudPolicyStoreChromeOS> store, |
const scoped_refptr<base::SequencedTaskRunner>& task_runner, |
@@ -145,7 +151,8 @@ void DeviceCloudPolicyManagerChromeOS::StartEnrollment( |
device_store_.get(), install_attributes_, CreateClient(), |
background_task_runner_, auth_token, |
install_attributes_->GetDeviceId(), is_auto_enrollment, |
- GetDeviceRequisition(), GetDeviceStateKey(), allowed_device_modes, |
+ GetDeviceRequisition(), GetCurrentDeviceStateKey(), |
+ allowed_device_modes, |
base::Bind(&DeviceCloudPolicyManagerChromeOS::EnrollmentCompleted, |
base::Unretained(this), callback))); |
enrollment_handler_->StartEnrollment(); |
@@ -268,16 +275,19 @@ std::string DeviceCloudPolicyManagerChromeOS::GetMachineID() { |
// static |
std::string DeviceCloudPolicyManagerChromeOS::GetMachineModel() { |
- return GetMachineStatistic(kMachineInfoSystemHwqual); |
+ return GetMachineStatistic(chromeos::system::kHardwareClassKey); |
} |
// static |
-std::string DeviceCloudPolicyManagerChromeOS::GetDeviceStateKey() { |
- // TODO(mnissler): Figure out which stable device identifiers should be used |
- // here and update the code. See http://crbug.com/352599. |
- std::string group_code_key = |
- GetMachineStatistic(chromeos::system::kOffersGroupCodeKey); |
- return crypto::SHA256HashString(group_code_key + GetMachineID()); |
+std::string DeviceCloudPolicyManagerChromeOS::GetCurrentDeviceStateKey() { |
+ std::vector<std::string> state_keys; |
+ if (GetDeviceStateKeys(base::Time::Now(), &state_keys) && |
+ !state_keys.empty()) { |
+ // The key for the current time is always the first one. |
+ return state_keys[0]; |
+ } |
+ |
+ return std::string(); |
} |
scoped_ptr<CloudPolicyClient> DeviceCloudPolicyManagerChromeOS::CreateClient() { |
@@ -298,8 +308,8 @@ scoped_ptr<CloudPolicyClient> DeviceCloudPolicyManagerChromeOS::CreateClient() { |
if (CommandLine::ForCurrentProcess()->HasSwitch( |
chromeos::switches::kEnterpriseEnableForcedReEnrollment)) { |
std::vector<std::string> state_keys; |
- state_keys.push_back(GetDeviceStateKey()); |
- client->SetStateKeysToUpload(state_keys); |
+ if (GetDeviceStateKeys(base::Time::Now(), &state_keys)) |
+ client->SetStateKeysToUpload(state_keys); |
} |
return client.Pass(); |
@@ -377,4 +387,41 @@ std::string DeviceCloudPolicyManagerChromeOS::GetRestoreMode() const { |
return restore_mode; |
} |
+// static |
+bool DeviceCloudPolicyManagerChromeOS::GetDeviceStateKeys( |
+ const base::Time& timestamp, |
+ std::vector<std::string>* state_keys) { |
+ state_keys->clear(); |
+ |
+ std::string disk_serial_number = |
+ GetMachineStatistic(chromeos::system::kDiskSerialNumber); |
+ if (disk_serial_number.empty()) { |
+ LOG(ERROR) << "Missing disk serial number"; |
+ return false; |
+ } |
+ |
+ std::string machine_id = GetMachineID(); |
+ if (machine_id.empty()) |
+ return false; |
+ |
+ // Tolerate missing group code keys, some old devices may not have it. |
+ std::string group_code_key = |
+ GetMachineStatistic(chromeos::system::kOffersGroupCodeKey); |
+ |
+ // Get the current time in quantized form. |
+ int64 quantum_size = GG_INT64_C(1) << kDeviceStateKeyTimeQuantumPower; |
+ int64 quantized_time = |
+ (timestamp - base::Time::UnixEpoch()).InSeconds() & ~(quantum_size - 1); |
+ for (int i = 0; i < kDeviceStateKeyFutureQuanta; ++i) { |
+ state_keys->push_back(crypto::SHA256HashString( |
+ crypto::SHA256HashString(group_code_key) + |
+ crypto::SHA256HashString(disk_serial_number) + |
+ crypto::SHA256HashString(machine_id) + |
+ crypto::SHA256HashString(base::Int64ToString(quantized_time)))); |
+ quantized_time += quantum_size; |
+ } |
+ |
+ return true; |
+} |
+ |
} // namespace policy |