Index: chrome/browser/chromeos/login/signed_settings.cc |
diff --git a/chrome/browser/chromeos/login/signed_settings.cc b/chrome/browser/chromeos/login/signed_settings.cc |
index 32709d543dc63babe52c88f521209fa12e1cde81..84b4838c6410256ad6814b6a1cff4d6aab9ac29b 100644 |
--- a/chrome/browser/chromeos/login/signed_settings.cc |
+++ b/chrome/browser/chromeos/login/signed_settings.cc |
@@ -9,17 +9,13 @@ |
#include "base/bind.h" |
#include "base/memory/ref_counted.h" |
-#include "base/stringprintf.h" |
#include "base/threading/thread_restrictions.h" |
-#include "base/values.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/chromeos/cros/cros_library.h" |
-#include "chrome/browser/chromeos/cros_settings_names.h" |
#include "chrome/browser/chromeos/dbus/dbus_thread_manager.h" |
#include "chrome/browser/chromeos/dbus/session_manager_client.h" |
#include "chrome/browser/chromeos/login/authenticator.h" |
#include "chrome/browser/chromeos/login/ownership_service.h" |
-#include "chrome/browser/chromeos/login/signed_settings_temp_storage.h" |
#include "chrome/browser/policy/proto/chrome_device_policy.pb.h" |
#include "chrome/browser/policy/proto/device_management_backend.pb.h" |
#include "content/public/browser/browser_thread.h" |
@@ -29,39 +25,14 @@ using content::BrowserThread; |
using google::protobuf::RepeatedPtrField; |
using std::string; |
-// static |
-const char SignedSettings::kDevicePolicyType[] = "google/chromeos/device"; |
- |
-SignedSettings::Relay::Relay(SignedSettings* s) : settings_(s) { |
-} |
- |
-SignedSettings::Relay::~Relay() {} |
- |
-void SignedSettings::Relay::OnSettingsOpCompleted( |
- SignedSettings::ReturnCode code, |
- const em::PolicyFetchResponse& value) { |
- if (code == SignedSettings::SUCCESS) { |
- settings_->Execute(); |
- return; |
- } |
- settings_->Fail(code); |
-} |
+const char kDevicePolicyType[] = "google/chromeos/device"; |
SignedSettings::SignedSettings() |
- : service_(OwnershipService::GetSharedInstance()), |
- relay_(NULL), |
- polfetcher_(NULL) { |
+ : service_(OwnershipService::GetSharedInstance()) { |
} |
SignedSettings::~SignedSettings() {} |
-void SignedSettings::TryToFetchPolicyAndCallBack() { |
- relay_.reset(new Relay(this)); |
- polfetcher_ = SignedSettings::CreateRetrievePolicyOp(relay_.get()); |
- polfetcher_->set_service(service_); |
- polfetcher_->Execute(); |
-} |
- |
// static |
bool SignedSettings::PolicyIsSane(const em::PolicyFetchResponse& value, |
em::PolicyData* poldata) { |
@@ -83,64 +54,6 @@ SignedSettings::ReturnCode SignedSettings::MapKeyOpCode( |
KEY_UNAVAILABLE : BAD_SIGNATURE); |
} |
-class StorePropertyOp : public SignedSettings, |
- public SignedSettings::Delegate<bool> { |
- public: |
- StorePropertyOp(const std::string& name, |
- const base::Value& value, |
- SignedSettings::Delegate<bool>* d); |
- virtual ~StorePropertyOp(); |
- void Execute(); |
- void Fail(SignedSettings::ReturnCode code); |
- void Succeed(bool value); |
- // Implementation of OwnerManager::Delegate |
- void OnKeyOpComplete(const OwnerManager::KeyOpCode return_code, |
- const std::vector<uint8>& payload); |
- // Implementation of SignedSettings::Delegate |
- void OnSettingsOpCompleted(ReturnCode code, bool value); |
- |
- private: |
- void SetInPolicy(const std::string& prop, |
- const base::Value& value, |
- em::PolicyData* poldata); |
- // Always call d_->OnSettingOpCompleted() via this call. |
- // It guarantees that the callback will not be triggered until _after_ |
- // Execute() returns, which is implicitly assumed by SignedSettingsHelper |
- // in some cases. |
- void PerformCallback(SignedSettings::ReturnCode code, bool value); |
- |
- std::string name_; |
- scoped_ptr<base::Value> value_; |
- SignedSettings::Delegate<bool>* d_; |
- em::PolicyFetchResponse to_store_; |
- scoped_refptr<SignedSettings> store_op_; |
-}; |
- |
-class RetrievePropertyOp : public SignedSettings { |
- public: |
- RetrievePropertyOp(const std::string& name, |
- SignedSettings::Delegate<const base::Value*>* d); |
- virtual ~RetrievePropertyOp(); |
- void Execute(); |
- void Fail(SignedSettings::ReturnCode code); |
- void Succeed(const base::Value* value); |
- // Implementation of OwnerManager::Delegate::OnKeyOpComplete() |
- void OnKeyOpComplete(const OwnerManager::KeyOpCode return_code, |
- const std::vector<uint8>& payload); |
- |
- private: |
- base::Value* LookUpInPolicy(const std::string& prop); |
- // Always call d_->OnSettingOpCompleted() via this call. |
- // It guarantees that the callback will not be triggered until _after_ |
- // Execute() returns, which is implicitly assumed by SignedSettingsHelper |
- // in some cases. |
- void PerformCallback(SignedSettings::ReturnCode code, |
- const base::Value* value); |
- |
- std::string name_; |
- SignedSettings::Delegate<const base::Value*>* d_; |
-}; |
- |
class StorePolicyOp : public SignedSettings { |
public: |
StorePolicyOp(em::PolicyFetchResponse* policy, |
@@ -195,23 +108,6 @@ class RetrievePolicyOp : public SignedSettings { |
}; |
// static |
-SignedSettings* SignedSettings::CreateStorePropertyOp( |
- const std::string& name, |
- const base::Value& value, |
- SignedSettings::Delegate<bool>* d) { |
- DCHECK(d != NULL); |
- return new StorePropertyOp(name, value, d); |
-} |
- |
-// static |
-SignedSettings* SignedSettings::CreateRetrievePropertyOp( |
- const std::string& name, |
- SignedSettings::Delegate<const base::Value*>* d) { |
- DCHECK(d != NULL); |
- return new RetrievePropertyOp(name, d); |
-} |
- |
-// static |
SignedSettings* SignedSettings::CreateStorePolicyOp( |
em::PolicyFetchResponse* policy, |
SignedSettings::Delegate<bool>* d) { |
@@ -227,314 +123,6 @@ SignedSettings* SignedSettings::CreateRetrievePolicyOp( |
return new RetrievePolicyOp(d); |
} |
-StorePropertyOp::StorePropertyOp(const std::string& name, |
- const base::Value& value, |
- SignedSettings::Delegate<bool>* d) |
- : name_(name), |
- value_(value.DeepCopy()), |
- d_(d), |
- store_op_(NULL) { |
-} |
- |
-StorePropertyOp::~StorePropertyOp() {} |
- |
-void StorePropertyOp::Execute() { |
- if (service_->GetStatus(true) != OwnershipService::OWNERSHIP_TAKEN) { |
- if (g_browser_process && |
- g_browser_process->local_state() && |
- SignedSettingsTempStorage::Store(name_, *value_, |
- g_browser_process->local_state())) { |
- Succeed(true); |
- return; |
- } |
- } |
- if (!service_->has_cached_policy()) { |
- TryToFetchPolicyAndCallBack(); |
- return; |
- } |
- // Posts a task to the FILE thread to sign policy. |
- em::PolicyData to_sign; |
- to_sign.CheckTypeAndMergeFrom(service_->cached_policy()); |
- SetInPolicy(name_, *value_, &to_sign); |
- to_store_.set_policy_data(to_sign.SerializeAsString()); |
- service_->StartSigningAttempt(to_store_.policy_data(), this); |
-} |
- |
-void StorePropertyOp::Fail(SignedSettings::ReturnCode code) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&StorePropertyOp::PerformCallback, this, code, false)); |
-} |
- |
-void StorePropertyOp::Succeed(bool value) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&StorePropertyOp::PerformCallback, this, SUCCESS, value)); |
-} |
- |
-void StorePropertyOp::OnKeyOpComplete(const OwnerManager::KeyOpCode return_code, |
- const std::vector<uint8>& sig) { |
- // Ensure we're on the UI thread, due to the need to send DBus traffic. |
- if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&StorePropertyOp::OnKeyOpComplete, this, return_code, sig)); |
- return; |
- } |
- VLOG(2) << "StorePropertyOp::OnKeyOpComplete return_code = " << return_code; |
- // Now, sure we're on the UI thread. |
- if (return_code == OwnerManager::SUCCESS) { |
- to_store_.set_policy_data_signature( |
- std::string(reinterpret_cast<const char*>(&sig[0]), sig.size())); |
- store_op_ = CreateStorePolicyOp(&to_store_, this); |
- // d_->OnSettingsOpCompleted() will be called by this call. |
- store_op_->Execute(); |
- } else { |
- Fail(SignedSettings::MapKeyOpCode(return_code)); |
- } |
-} |
- |
-void StorePropertyOp::OnSettingsOpCompleted(ReturnCode code, bool value) { |
- if (value && to_store_.has_policy_data()) { |
- em::PolicyData poldata; |
- poldata.ParseFromString(to_store_.policy_data()); |
- service_->set_cached_policy(poldata); |
- Succeed(value); |
- return; |
- } |
- Fail(NOT_FOUND); |
-} |
- |
-void StorePropertyOp::SetInPolicy(const std::string& prop, |
- const base::Value& value, |
- em::PolicyData* poldata) { |
- em::ChromeDeviceSettingsProto pol; |
- pol.ParseFromString(poldata->policy_value()); |
- if (prop == kAccountsPrefAllowNewUser) { |
- em::AllowNewUsersProto* allow = pol.mutable_allow_new_users(); |
- bool allow_value; |
- if (value.GetAsBoolean(&allow_value)) |
- allow->set_allow_new_users(allow_value); |
- else |
- NOTREACHED(); |
- } else if (prop == kAccountsPrefAllowGuest) { |
- em::GuestModeEnabledProto* guest = pol.mutable_guest_mode_enabled(); |
- bool guest_value; |
- if (value.GetAsBoolean(&guest_value)) |
- guest->set_guest_mode_enabled(guest_value); |
- else |
- NOTREACHED(); |
- } else if (prop == kAccountsPrefShowUserNamesOnSignIn) { |
- em::ShowUserNamesOnSigninProto* show = pol.mutable_show_user_names(); |
- bool show_value; |
- if (value.GetAsBoolean(&show_value)) |
- show->set_show_user_names(show_value); |
- else |
- NOTREACHED(); |
- } else if (prop == kSignedDataRoamingEnabled) { |
- em::DataRoamingEnabledProto* roam = pol.mutable_data_roaming_enabled(); |
- bool roaming_value; |
- if (value.GetAsBoolean(&roaming_value)) |
- roam->set_data_roaming_enabled(roaming_value); |
- else |
- NOTREACHED(); |
- } else if (prop == kSettingProxyEverywhere) { |
- // TODO(cmasone): NOTIMPLEMENTED() once http://crosbug.com/13052 is fixed. |
- std::string proxy_value; |
- if (value.GetAsString(&proxy_value)) { |
- bool success = |
- pol.mutable_device_proxy_settings()->ParseFromString(proxy_value); |
- DCHECK(success); |
- } else { |
- NOTREACHED(); |
- } |
- } else if (prop == kReleaseChannel) { |
- em::ReleaseChannelProto* release_channel = pol.mutable_release_channel(); |
- std::string channel_value; |
- if (value.GetAsString(&channel_value)) |
- release_channel->set_release_channel(channel_value); |
- else |
- NOTREACHED(); |
- } else if (prop == kStatsReportingPref) { |
- em::MetricsEnabledProto* metrics = pol.mutable_metrics_enabled(); |
- bool metrics_value; |
- if (value.GetAsBoolean(&metrics_value)) |
- metrics->set_metrics_enabled(metrics_value); |
- else |
- NOTREACHED(); |
- } else if (prop == kAccountsPrefUsers) { |
- em::UserWhitelistProto* whitelist_proto = pol.mutable_user_whitelist(); |
- whitelist_proto->clear_user_whitelist(); |
- const base::ListValue& users = static_cast<const base::ListValue&>(value); |
- for (base::ListValue::const_iterator i = users.begin(); |
- i != users.end(); ++i) { |
- std::string email; |
- if ((*i)->GetAsString(&email)) |
- whitelist_proto->add_user_whitelist(email.c_str()); |
- } |
- } else if (prop == kDeviceOwner) { |
- // We don't serialize this one to the policy blob. |
- } else { |
- NOTREACHED(); |
- } |
- poldata->set_policy_value(pol.SerializeAsString()); |
-} |
- |
-void StorePropertyOp::PerformCallback(SignedSettings::ReturnCode code, |
- bool value) { |
- d_->OnSettingsOpCompleted(code, value); |
-} |
- |
-RetrievePropertyOp::RetrievePropertyOp( |
- const std::string& name, |
- SignedSettings::Delegate<const base::Value*>* d) |
- : name_(name), |
- d_(d) { |
-} |
- |
-RetrievePropertyOp::~RetrievePropertyOp() {} |
- |
-void RetrievePropertyOp::Execute() { |
- base::Value* value; |
- // TODO(dilmah): Fix the race: |
- // At the moment when device becomes owned there is lapse of time after |
- // device has been owned and before temp_storage settings are finally |
- // persisted into signed settings. |
- // In this lapse of time Retrieve loses access to those settings. |
- if (service_->GetStatus(true) != OwnershipService::OWNERSHIP_TAKEN) { |
- if (g_browser_process && |
- g_browser_process->local_state() && |
- SignedSettingsTempStorage::Retrieve( |
- name_, &value, g_browser_process->local_state())) { |
- Succeed(value->DeepCopy()); |
- return; |
- } |
- } |
- |
- if (!service_->has_cached_policy()) { |
- TryToFetchPolicyAndCallBack(); |
- return; |
- } |
- value = LookUpInPolicy(name_); |
- if (!value) |
- Fail(NOT_FOUND); |
- else |
- Succeed(value); |
-} |
- |
-void RetrievePropertyOp::Fail(SignedSettings::ReturnCode code) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&RetrievePropertyOp::PerformCallback, this, |
- code, static_cast<const base::Value*>(NULL))); |
-} |
- |
-void RetrievePropertyOp::Succeed(const base::Value* value) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&RetrievePropertyOp::PerformCallback, this, |
- SUCCESS, base::Owned(value))); |
-} |
- |
-// DEPRECATED. |
-void RetrievePropertyOp::OnKeyOpComplete( |
- const OwnerManager::KeyOpCode return_code, |
- const std::vector<uint8>& sig) { |
- NOTREACHED(); |
-} |
- |
-base::Value* RetrievePropertyOp::LookUpInPolicy(const std::string& prop) { |
- if (prop == kDeviceOwner) { |
- const em::PolicyData& data = service_->cached_policy(); |
- if (data.has_username() && !data.has_request_token()) |
- return base::Value::CreateStringValue(data.username()); |
- } |
- VLOG(2) << "Looking up " << prop; |
- em::ChromeDeviceSettingsProto pol; |
- pol.ParseFromString(service_->cached_policy().policy_value()); |
- if (prop == kAccountsPrefAllowNewUser) { |
- if (pol.has_allow_new_users() && |
- pol.allow_new_users().has_allow_new_users() && |
- pol.allow_new_users().allow_new_users()) { |
- // New users allowed, user_whitelist() ignored. |
- return base::Value::CreateBooleanValue(true); |
- } |
- // If we have the allow_new_users bool, and it is true, we honor that above. |
- // In all other cases (don't have it, have it and it is set to false, etc), |
- // We will honor the user_whitelist() if it is there and populated. |
- // Otherwise we default to allowing new users. |
- if (!pol.has_user_whitelist()) |
- return base::Value::CreateBooleanValue(true); |
- return base::Value::CreateBooleanValue( |
- pol.user_whitelist().user_whitelist_size() == 0); |
- |
- } else if (prop == kAccountsPrefAllowGuest) { |
- if (!pol.has_guest_mode_enabled() || |
- !pol.guest_mode_enabled().has_guest_mode_enabled()) { |
- // Default to allowing guests; |
- return base::Value::CreateBooleanValue(true); |
- } |
- return base::Value::CreateBooleanValue( |
- pol.guest_mode_enabled().guest_mode_enabled()); |
- |
- } else if (prop == kAccountsPrefShowUserNamesOnSignIn) { |
- if (!pol.has_show_user_names() || |
- !pol.show_user_names().has_show_user_names()) { |
- // Default to showing pods on the login screen; |
- return base::Value::CreateBooleanValue(true); |
- } |
- return base::Value::CreateBooleanValue( |
- pol.show_user_names().show_user_names()); |
- |
- } else if (prop == kSignedDataRoamingEnabled) { |
- if (!pol.has_data_roaming_enabled() || |
- !pol.data_roaming_enabled().has_data_roaming_enabled()) { |
- // Default to disabling cellular data roaming; |
- return base::Value::CreateBooleanValue(false); |
- } |
- return base::Value::CreateBooleanValue( |
- pol.data_roaming_enabled().data_roaming_enabled()); |
- |
- } else if (prop == kSettingProxyEverywhere) { |
- // TODO(cmasone): NOTIMPLEMENTED() once http://crosbug.com/13052 is fixed. |
- std::string serialized; |
- if (pol.has_device_proxy_settings() && |
- pol.device_proxy_settings().SerializeToString(&serialized)) { |
- return base::Value::CreateStringValue(serialized); |
- } |
- |
- } else if (prop == kReleaseChannel) { |
- if (!pol.has_release_channel() || |
- !pol.release_channel().has_release_channel()) { |
- // Default to an invalid channel (will be ignored). |
- return base::Value::CreateStringValue(""); |
- } |
- return base::Value::CreateStringValue( |
- pol.release_channel().release_channel()); |
- |
- } else if (prop == kStatsReportingPref) { |
- if (pol.has_metrics_enabled()) { |
- return base::Value::CreateBooleanValue( |
- pol.metrics_enabled().metrics_enabled()); |
- } |
- } else if (prop == kAccountsPrefUsers) { |
- base::ListValue* list = new base::ListValue(); |
- const em::UserWhitelistProto& whitelist_proto = pol.user_whitelist(); |
- const RepeatedPtrField<string>& whitelist = |
- whitelist_proto.user_whitelist(); |
- for (RepeatedPtrField<string>::const_iterator it = whitelist.begin(); |
- it != whitelist.end(); ++it) { |
- list->Append(base::Value::CreateStringValue(*it)); |
- } |
- return list; |
- } |
- return NULL; |
-} |
- |
-void RetrievePropertyOp::PerformCallback(SignedSettings::ReturnCode code, |
- const base::Value* value) { |
- d_->OnSettingsOpCompleted(code, value); |
-} |
StorePolicyOp::StorePolicyOp(em::PolicyFetchResponse* policy, |
SignedSettings::Delegate<bool>* d) |
@@ -572,7 +160,6 @@ void StorePolicyOp::Succeed(bool ignored) { |
bool to_ret = true; |
em::PolicyData poldata; |
if (SignedSettings::PolicyIsSane(*policy_, &poldata)) { |
- service_->set_cached_policy(poldata); |
} else { |
code = NOT_FOUND; |
to_ret = false; |
@@ -642,7 +229,6 @@ void RetrievePolicyOp::Fail(SignedSettings::ReturnCode code) { |
void RetrievePolicyOp::Succeed(const em::PolicyFetchResponse& value) { |
em::PolicyData poldata; |
if (SignedSettings::PolicyIsSane(value, &poldata)) { |
- service_->set_cached_policy(poldata); |
BrowserThread::PostTask( |
BrowserThread::UI, FROM_HERE, |
base::Bind(&RetrievePolicyOp::PerformCallback, this, SUCCESS, value)); |