Index: chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc |
diff --git a/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc b/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc |
index 67728038e73c5d549a43c0c26adb7d6aeaac673a..d731e00e6c2705114852f3dca778661702f6a5de 100644 |
--- a/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc |
+++ b/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc |
@@ -8,14 +8,19 @@ |
#include "base/command_line.h" |
#include "base/logging.h" |
#include "base/message_loop/message_loop.h" |
+#include "base/prefs/pref_registry_simple.h" |
+#include "base/prefs/pref_service.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.h" |
+#include "chrome/browser/chromeos/login/startup_utils.h" |
#include "chrome/browser/chromeos/policy/device_cloud_policy_store_chromeos.h" |
#include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h" |
#include "chrome/browser/chromeos/policy/server_backed_state_keys_broker.h" |
#include "chrome/browser/chromeos/settings/device_oauth2_token_service.h" |
#include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h" |
+#include "chrome/common/pref_names.h" |
#include "chromeos/chromeos_switches.h" |
+#include "chromeos/system/statistics_provider.h" |
#include "components/policy/core/common/cloud/cloud_policy_constants.h" |
#include "google_apis/gaia/gaia_urls.h" |
#include "net/http/http_status_code.h" |
@@ -37,9 +42,28 @@ const int kLockRetryTimeoutMs = 10 * 60 * 1000; // 10 minutes. |
// testing DMServer implementations. |
const char kTestingRobotToken[] = "test-token"; |
+// Device requisition constants. |
+const char kNoRequisition[] = "none"; |
+const char kRemoraRequisition[] = "remora"; |
+const char kSharkRequisition[] = "shark"; |
+ |
+ |
+// Gets a machine flag from StatisticsProvider, returns the given |
+// |default_value| if not present. |
+bool GetMachineFlag(const std::string& key, bool default_value) { |
+ bool value = default_value; |
+ chromeos::system::StatisticsProvider* provider = |
+ chromeos::system::StatisticsProvider::GetInstance(); |
+ if (!provider->GetMachineFlag(key, &value)) |
+ return default_value; |
+ |
+ return value; |
+} |
+ |
} // namespace |
EnrollmentHandlerChromeOS::EnrollmentHandlerChromeOS( |
+ PrefService* local_state, |
DeviceCloudPolicyStoreChromeOS* store, |
EnterpriseInstallAttributes* install_attributes, |
ServerBackedStateKeysBroker* state_keys_broker, |
@@ -48,10 +72,10 @@ EnrollmentHandlerChromeOS::EnrollmentHandlerChromeOS( |
const std::string& auth_token, |
const std::string& client_id, |
bool is_auto_enrollment, |
- const std::string& requisition, |
const AllowedDeviceModes& allowed_device_modes, |
const EnrollmentCallback& completion_callback) |
- : store_(store), |
+ : local_state_(local_state), |
+ store_(store), |
install_attributes_(install_attributes), |
state_keys_broker_(state_keys_broker), |
client_(client.Pass()), |
@@ -59,7 +83,6 @@ EnrollmentHandlerChromeOS::EnrollmentHandlerChromeOS( |
auth_token_(auth_token), |
client_id_(client_id), |
is_auto_enrollment_(is_auto_enrollment), |
- requisition_(requisition), |
allowed_device_modes_(allowed_device_modes), |
completion_callback_(completion_callback), |
device_mode_(DEVICE_MODE_NOT_SET), |
@@ -68,6 +91,7 @@ EnrollmentHandlerChromeOS::EnrollmentHandlerChromeOS( |
weak_ptr_factory_(this) { |
CHECK(!client_->is_registered()); |
CHECK_EQ(DM_STATUS_SUCCESS, client_->status()); |
+ InitializeRequisition(); |
store_->AddObserver(this); |
client_->AddObserver(this); |
client_->AddNamespaceToFetch(PolicyNamespaceKey( |
@@ -219,7 +243,7 @@ void EnrollmentHandlerChromeOS::AttemptRegistration() { |
enrollment_step_ = STEP_REGISTRATION; |
client_->Register(em::DeviceRegisterRequest::DEVICE, |
auth_token_, client_id_, is_auto_enrollment_, |
- requisition_, current_state_key_); |
+ GetDeviceRequisition(), current_state_key_); |
} |
} |
@@ -415,4 +439,91 @@ void EnrollmentHandlerChromeOS::ReportResult(EnrollmentStatus status) { |
callback.Run(status); |
} |
+// static |
+void EnrollmentHandlerChromeOS::RegisterPrefs( |
+ PrefRegistrySimple* registry) { |
+ registry->RegisterStringPref(prefs::kDeviceEnrollmentRequisition, |
+ std::string()); |
+ registry->RegisterBooleanPref(prefs::kDeviceEnrollmentAutoStart, false); |
+ registry->RegisterBooleanPref(prefs::kDeviceEnrollmentCanExit, true); |
+ registry->RegisterDictionaryPref(prefs::kServerBackedDeviceState); |
+} |
+ |
+void Foo(PersistentPrefStore::PrefReadError) {} |
+ |
+void EnrollmentHandlerChromeOS::InitializeRequisition() { |
+ // OEM statistics are only loaded when OOBE is not completed. |
+ if (chromeos::StartupUtils::IsOobeCompleted()) |
+ return; |
+ |
+ const PrefService::Preference* pref = local_state_->FindPreference( |
+ prefs::kDeviceEnrollmentRequisition); |
+ if (pref->IsDefaultValue()) { |
+ std::string requisition; |
+ chromeos::system::StatisticsProvider::GetInstance()->GetMachineStatistic( |
+ chromeos::system::kOemDeviceRequisitionKey, &requisition); |
+ |
+ if (!requisition.empty()) { |
+ local_state_->SetString(prefs::kDeviceEnrollmentRequisition, |
+ requisition); |
+ if (requisition == kRemoraRequisition || |
+ requisition == kSharkRequisition) { |
+ local_state_->SetBoolean(prefs::kDeviceEnrollmentAutoStart, true); |
+ local_state_->SetBoolean(prefs::kDeviceEnrollmentCanExit, false); |
+ } else { |
+ local_state_->SetBoolean( |
+ prefs::kDeviceEnrollmentAutoStart, |
+ GetMachineFlag(chromeos::system::kOemIsEnterpriseManagedKey, |
+ false)); |
+ local_state_->SetBoolean( |
+ prefs::kDeviceEnrollmentCanExit, |
+ GetMachineFlag(chromeos::system::kOemCanExitEnterpriseEnrollmentKey, |
+ false)); |
+ } |
+ } |
+ } |
+} |
+ |
+std::string EnrollmentHandlerChromeOS::GetDeviceRequisition() const { |
+ std::string requisition; |
+ const PrefService::Preference* pref = local_state_->FindPreference( |
+ prefs::kDeviceEnrollmentRequisition); |
+ if (!pref->IsDefaultValue()) |
+ pref->GetValue()->GetAsString(&requisition); |
+ |
+ if (requisition == kNoRequisition) |
+ requisition.clear(); |
+ |
+ return requisition; |
+} |
+ |
+void EnrollmentHandlerChromeOS::SetDeviceRequisition( |
+ const std::string& requisition) { |
+ VLOG(1) << "SetDeviceRequisition " << requisition; |
+ if (local_state_) { |
+ if (requisition.empty()) { |
+ local_state_->ClearPref(prefs::kDeviceEnrollmentRequisition); |
+ local_state_->ClearPref(prefs::kDeviceEnrollmentAutoStart); |
+ local_state_->ClearPref(prefs::kDeviceEnrollmentCanExit); |
+ } else { |
+ local_state_->SetString(prefs::kDeviceEnrollmentRequisition, requisition); |
+ if (requisition == kNoRequisition) { |
+ local_state_->ClearPref(prefs::kDeviceEnrollmentAutoStart); |
+ local_state_->ClearPref(prefs::kDeviceEnrollmentCanExit); |
+ } else { |
+ local_state_->SetBoolean(prefs::kDeviceEnrollmentAutoStart, true); |
+ local_state_->SetBoolean(prefs::kDeviceEnrollmentCanExit, false); |
+ } |
+ } |
+ } |
+} |
+ |
+bool EnrollmentHandlerChromeOS::IsRemoraRequisition() const { |
+ return GetDeviceRequisition() == kRemoraRequisition; |
+} |
+ |
+bool EnrollmentHandlerChromeOS::IsSharkRequisition() const { |
+ return GetDeviceRequisition() == kSharkRequisition; |
+} |
+ |
} // namespace policy |