| 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 6fa426cb0bfa1ec0d445fb2fe479ea3f1990737c..31921cf6cf49dc2fbdeeb2b8c2555b190049b005 100644
|
| --- a/chrome/browser/chromeos/login/signed_settings.cc
|
| +++ b/chrome/browser/chromeos/login/signed_settings.cc
|
| @@ -83,83 +83,6 @@ SignedSettings::ReturnCode SignedSettings::MapKeyOpCode(
|
| KEY_UNAVAILABLE : BAD_SIGNATURE);
|
| }
|
|
|
| -// static
|
| -bool SignedSettings::EnumerateWhitelist(std::vector<std::string>* whitelisted) {
|
| - OwnershipService* service = OwnershipService::GetSharedInstance();
|
| - if (!service->has_cached_policy())
|
| - return false;
|
| - em::ChromeDeviceSettingsProto pol;
|
| - pol.ParseFromString(service->cached_policy().policy_value());
|
| - if (!pol.has_user_whitelist())
|
| - return false;
|
| -
|
| - const RepeatedPtrField<std::string>& whitelist =
|
| - pol.user_whitelist().user_whitelist();
|
| - for (RepeatedPtrField<std::string>::const_iterator it = whitelist.begin();
|
| - it != whitelist.end();
|
| - ++it) {
|
| - whitelisted->push_back(*it);
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -class CheckWhitelistOp : public SignedSettings {
|
| - public:
|
| - CheckWhitelistOp(const std::string& email,
|
| - SignedSettings::Delegate<bool>* d);
|
| - virtual ~CheckWhitelistOp();
|
| - 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);
|
| -
|
| - private:
|
| - bool LookUpInPolicy(const std::string& email);
|
| - // 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);
|
| -
|
| - const std::string email_;
|
| - SignedSettings::Delegate<bool>* d_;
|
| -};
|
| -
|
| -class WhitelistOp : public SignedSettings,
|
| - public SignedSettings::Delegate<bool> {
|
| - public:
|
| - WhitelistOp(const std::string& email,
|
| - bool add_to_whitelist,
|
| - SignedSettings::Delegate<bool>* d);
|
| - virtual ~WhitelistOp();
|
| - 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 ModifyWhitelist(const std::string& email,
|
| - bool add_to_whitelist,
|
| - em::UserWhitelistProto* whitelist_proto);
|
| - // 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);
|
| -
|
| - const std::string email_;
|
| - const bool add_to_whitelist_;
|
| - SignedSettings::Delegate<bool>* d_;
|
| - em::PolicyFetchResponse to_store_;
|
| - scoped_refptr<SignedSettings> store_op_;
|
| -};
|
| -
|
| class StorePropertyOp : public SignedSettings,
|
| public SignedSettings::Delegate<bool> {
|
| public:
|
| @@ -272,25 +195,6 @@ class RetrievePolicyOp : public SignedSettings {
|
| };
|
|
|
| // static
|
| -SignedSettings* SignedSettings::CreateCheckWhitelistOp(
|
| - const std::string& email,
|
| - SignedSettings::Delegate<bool>* d) {
|
| - DCHECK(d != NULL);
|
| - return new CheckWhitelistOp(Authenticator::Canonicalize(email), d);
|
| -}
|
| -
|
| -// static
|
| -SignedSettings* SignedSettings::CreateWhitelistOp(
|
| - const std::string& email,
|
| - bool add_to_whitelist,
|
| - SignedSettings::Delegate<bool>* d) {
|
| - DCHECK(d != NULL);
|
| - return new WhitelistOp(Authenticator::Canonicalize(email),
|
| - add_to_whitelist,
|
| - d);
|
| -}
|
| -
|
| -// static
|
| SignedSettings* SignedSettings::CreateStorePropertyOp(
|
| const std::string& name,
|
| const base::Value& value,
|
| @@ -323,200 +227,6 @@ SignedSettings* SignedSettings::CreateRetrievePolicyOp(
|
| return new RetrievePolicyOp(d);
|
| }
|
|
|
| -CheckWhitelistOp::CheckWhitelistOp(const std::string& email,
|
| - SignedSettings::Delegate<bool>* d)
|
| - : email_(email),
|
| - d_(d) {
|
| -}
|
| -
|
| -CheckWhitelistOp::~CheckWhitelistOp() {}
|
| -
|
| -void CheckWhitelistOp::Execute() {
|
| - std::vector<uint8> sig;
|
| - std::string email_to_check = email_;
|
| - if (!service_->has_cached_policy()) {
|
| - TryToFetchPolicyAndCallBack();
|
| - return;
|
| - }
|
| - if (LookUpInPolicy(email_to_check)) {
|
| - VLOG(2) << "Whitelist check was successful for " << email_to_check;
|
| - Succeed(true);
|
| - return;
|
| - }
|
| - // If the exact match was not found try to match against a wildcard entry
|
| - // where the domain only matches (e.g. *@example.com). In theory we should
|
| - // always have correctly formated mail address here but a little precaution
|
| - // does no harm.
|
| - if (email_.find('@') != std::string::npos) {
|
| - email_to_check = std::string("*").append(email_.substr(email_.find('@')));
|
| - if (LookUpInPolicy(email_to_check)) {
|
| - VLOG(2) << "Whitelist check was successful for " << email_to_check;
|
| - Succeed(true);
|
| - return;
|
| - }
|
| - }
|
| - Fail(NOT_FOUND);
|
| - return;
|
| -}
|
| -
|
| -void CheckWhitelistOp::Fail(SignedSettings::ReturnCode code) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&CheckWhitelistOp::PerformCallback, this, code, false));
|
| -}
|
| -
|
| -void CheckWhitelistOp::Succeed(bool value) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&CheckWhitelistOp::PerformCallback, this, SUCCESS, value));
|
| -}
|
| -
|
| -void CheckWhitelistOp::OnKeyOpComplete(
|
| - const OwnerManager::KeyOpCode return_code,
|
| - const std::vector<uint8>& payload) {
|
| - NOTREACHED();
|
| - // 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(&CheckWhitelistOp::OnKeyOpComplete, this, return_code,
|
| - payload));
|
| - return;
|
| - }
|
| - if (return_code == OwnerManager::SUCCESS) {
|
| - VLOG(2) << "Whitelist check was successful.";
|
| - Succeed(true);
|
| - } else {
|
| - VLOG(2) << "Whitelist check failed.";
|
| - Fail(SignedSettings::MapKeyOpCode(return_code));
|
| - }
|
| -}
|
| -
|
| -bool CheckWhitelistOp::LookUpInPolicy(const std::string& email) {
|
| - em::ChromeDeviceSettingsProto pol;
|
| - pol.ParseFromString(service_->cached_policy().policy_value());
|
| - if (!pol.has_user_whitelist())
|
| - return false;
|
| -
|
| - const RepeatedPtrField<std::string>& whitelist =
|
| - pol.user_whitelist().user_whitelist();
|
| - for (RepeatedPtrField<std::string>::const_iterator it = whitelist.begin();
|
| - it != whitelist.end();
|
| - ++it) {
|
| - if (email == *it)
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -void CheckWhitelistOp::PerformCallback(SignedSettings::ReturnCode code,
|
| - bool value) {
|
| - d_->OnSettingsOpCompleted(code, value);
|
| -}
|
| -
|
| -WhitelistOp::WhitelistOp(const std::string& email,
|
| - bool add_to_whitelist,
|
| - SignedSettings::Delegate<bool>* d)
|
| - : email_(email),
|
| - add_to_whitelist_(add_to_whitelist),
|
| - d_(d) {
|
| -}
|
| -
|
| -WhitelistOp::~WhitelistOp() {}
|
| -
|
| -void WhitelistOp::Execute() {
|
| - if (!service_->has_cached_policy()) {
|
| - TryToFetchPolicyAndCallBack();
|
| - return;
|
| - }
|
| - em::PolicyData to_sign;
|
| - to_sign.CheckTypeAndMergeFrom(service_->cached_policy());
|
| - em::ChromeDeviceSettingsProto pol;
|
| - pol.ParseFromString(to_sign.policy_value());
|
| - em::UserWhitelistProto* whitelist_proto = pol.mutable_user_whitelist();
|
| - ModifyWhitelist(email_, add_to_whitelist_, whitelist_proto);
|
| - to_sign.set_policy_value(pol.SerializeAsString());
|
| - to_store_.set_policy_data(to_sign.SerializeAsString());
|
| - service_->StartSigningAttempt(to_store_.policy_data(), this);
|
| -}
|
| -
|
| -void WhitelistOp::Fail(SignedSettings::ReturnCode code) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&WhitelistOp::PerformCallback, this, code, false));
|
| -}
|
| -
|
| -void WhitelistOp::Succeed(bool value) {
|
| - BrowserThread::PostTask(
|
| - BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&WhitelistOp::PerformCallback, this, SUCCESS, value));
|
| -}
|
| -
|
| -void WhitelistOp::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(&WhitelistOp::OnKeyOpComplete, this, return_code, sig));
|
| - return;
|
| - }
|
| - VLOG(2) << "WhitelistOp::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 WhitelistOp::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 WhitelistOp::ModifyWhitelist(const std::string& email,
|
| - bool add_to_whitelist,
|
| - em::UserWhitelistProto* whitelist_proto) {
|
| - int i = 0;
|
| - const RepeatedPtrField<string>& whitelist = whitelist_proto->user_whitelist();
|
| - for (RepeatedPtrField<string>::const_iterator it = whitelist.begin();
|
| - it != whitelist.end();
|
| - ++it, ++i) {
|
| - if (email == *it)
|
| - break;
|
| - }
|
| - // |i| contains the index of |email|, if it is in |whitelist|.
|
| - if (add_to_whitelist) {
|
| - if (i >= whitelist.size()) // |email| was not in |whitelist|, we must add.
|
| - whitelist_proto->add_user_whitelist(email);
|
| - return;
|
| - } else {
|
| - if (i < whitelist.size()) { // |email| was in |whitelist|, we must remove.
|
| - RepeatedPtrField<string>* change_list =
|
| - whitelist_proto->mutable_user_whitelist();
|
| - change_list->SwapElements(i, whitelist.size() - 1); // Move to end.
|
| - change_list->RemoveLast();
|
| - }
|
| - return;
|
| - }
|
| - LOG(WARNING) << "Whitelist modification no-op: " << email;
|
| -}
|
| -
|
| -void WhitelistOp::PerformCallback(SignedSettings::ReturnCode code, bool value) {
|
| - d_->OnSettingsOpCompleted(code, value);
|
| -}
|
| -
|
| StorePropertyOp::StorePropertyOp(const std::string& name,
|
| const base::Value& value,
|
| SignedSettings::Delegate<bool>* d)
|
|
|