// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SIGNED_SETTINGS_H_ #define CHROME_BROWSER_CHROMEOS_LOGIN_SIGNED_SETTINGS_H_ #pragma once #include <string> #include <vector> #include "base/memory/ref_counted.h" #include "chrome/browser/chromeos/login/owner_manager.h" // There are two categories of operations that can be performed on the // Chrome OS owner-signed settings store: // 1) doing stuff to the whitelist (adding/removing/checking) // 2) Storing/Retrieving arbitrary name=value pairs // // Unfortunately, it is currently a limitation that only one of each // category can be in-flight at a time. You can be doing exactly one thing // to the whitelist, and exactly one thing to the property store at a time. // I've filed an issue on me to remove that restriction. // http://code.google.com/p/chromium-os/issues/detail?id=6415 // The pattern of use here is that the caller instantiates some // subclass of SignedSettings by calling one of the create // methods. Then, call Execute() on this object from the UI // thread. It'll go off and do work (on the FILE thread and over DBus), // and then call the appropriate method of the Delegate you passed in // -- again, on the UI thread. namespace enterprise_management { class PolicyFetchResponse; class PolicyData; } // namespace enterprise_management namespace em = enterprise_management; namespace chromeos { class OwnershipService; class SignedSettings : public base::RefCountedThreadSafe<SignedSettings>, public OwnerManager::Delegate { public: enum ReturnCode { SUCCESS, NOT_FOUND, // Email address or property name not found. KEY_UNAVAILABLE, // Owner key not yet configured. OPERATION_FAILED, // IPC to signed settings daemon failed. BAD_SIGNATURE // Signature verification failed. }; template <class T> class Delegate { public: // This method will be called on the UI thread. virtual void OnSettingsOpCompleted(ReturnCode code, T value) {} }; SignedSettings(); virtual ~SignedSettings(); // These are both "whitelist" operations, and only one instance of // one type can be in flight at a time. static SignedSettings* CreateCheckWhitelistOp( const std::string& email, SignedSettings::Delegate<bool>* d); static SignedSettings* CreateWhitelistOp(const std::string& email, bool add_to_whitelist, SignedSettings::Delegate<bool>* d); // These are both "property" operations, and only one instance of // one type can be in flight at a time. static SignedSettings* CreateStorePropertyOp( const std::string& name, const std::string& value, SignedSettings::Delegate<bool>* d); static SignedSettings* CreateRetrievePropertyOp( const std::string& name, SignedSettings::Delegate<std::string>* d); // These are both "policy" operations, and only one instance of // one type can be in flight at a time. static SignedSettings* CreateStorePolicyOp( em::PolicyFetchResponse* policy, SignedSettings::Delegate<bool>* d); static SignedSettings* CreateRetrievePolicyOp( SignedSettings::Delegate<const em::PolicyFetchResponse&>* d); static bool EnumerateWhitelist(std::vector<std::string>* whitelisted); static ReturnCode MapKeyOpCode(OwnerManager::KeyOpCode code); virtual void Execute() = 0; virtual void Fail(ReturnCode code) = 0; // Implementation of OwnerManager::Delegate void OnKeyOpComplete(const OwnerManager::KeyOpCode return_code, const std::vector<uint8>& payload) = 0; protected: static bool PolicyIsSane(const em::PolicyFetchResponse& value, em::PolicyData* poldata); void set_service(OwnershipService* service) { service_ = service; } void TryToFetchPolicyAndCallBack(); OwnershipService* service_; private: friend class SignedSettingsTest; friend class SignedSettingsHelperTest; class Relay : public SignedSettings::Delegate<const em::PolicyFetchResponse&> { public: // |s| must outlive your Relay instance. explicit Relay(SignedSettings* s); virtual ~Relay(); // Implementation of SignedSettings::Delegate virtual void OnSettingsOpCompleted(SignedSettings::ReturnCode code, const em::PolicyFetchResponse& value); private: SignedSettings* settings_; DISALLOW_COPY_AND_ASSIGN(Relay); }; // Format of this string is documented in device_management_backend.proto. static const char kDevicePolicyType[]; scoped_ptr<Relay> relay_; scoped_refptr<SignedSettings> polfetcher_; DISALLOW_COPY_AND_ASSIGN(SignedSettings); }; } // namespace chromeos #endif // CHROME_BROWSER_CHROMEOS_LOGIN_SIGNED_SETTINGS_H_