Home | History | Annotate | Download | only in settings
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_CHROMEOS_SETTINGS_SESSION_MANAGER_OPERATION_H_
      6 #define CHROME_BROWSER_CHROMEOS_SETTINGS_SESSION_MANAGER_OPERATION_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/callback.h"
     10 #include "base/memory/ref_counted.h"
     11 #include "base/memory/scoped_ptr.h"
     12 #include "chrome/browser/chromeos/policy/device_cloud_policy_validator.h"
     13 #include "chrome/browser/chromeos/settings/device_settings_service.h"
     14 
     15 namespace enterprise_management {
     16 class ChromeDeviceSettingsProto;
     17 class PolicyData;
     18 class PolicyFetchResponse;
     19 }
     20 
     21 namespace chromeos {
     22 
     23 class OwnerKeyUtil;
     24 class SessionManagerClient;
     25 
     26 // Handles a single transaction with session manager. This is a virtual base
     27 // class that contains common infrastructure for key and policy loading. There
     28 // are subclasses for loading, storing and signing policy blobs.
     29 class SessionManagerOperation {
     30  public:
     31   typedef base::Callback<void(SessionManagerOperation*,
     32                               DeviceSettingsService::Status)> Callback;
     33 
     34   // Creates a new load operation.
     35   explicit SessionManagerOperation(const Callback& callback);
     36   virtual ~SessionManagerOperation();
     37 
     38   // Starts the operation.
     39   void Start(SessionManagerClient* session_manager_client,
     40              scoped_refptr<OwnerKeyUtil> owner_key_util,
     41              scoped_refptr<OwnerKey> owner_key);
     42 
     43   // Restarts a load operation (if that part is already in progress).
     44   void RestartLoad(bool key_changed);
     45 
     46   // Accessors for recovering the loaded policy data after completion.
     47   scoped_ptr<enterprise_management::PolicyData>& policy_data() {
     48     return policy_data_;
     49   }
     50   scoped_ptr<enterprise_management::ChromeDeviceSettingsProto>&
     51       device_settings() {
     52     return device_settings_;
     53   }
     54 
     55   // Owner key as configured/loaded from disk.
     56   scoped_refptr<OwnerKey> owner_key() {
     57     return owner_key_;
     58   }
     59 
     60   // Whether the load operation is underway.
     61   bool is_loading() const {
     62     return is_loading_;
     63   }
     64 
     65   void set_force_key_load(bool force_key_load) {
     66     force_key_load_ = force_key_load;
     67   }
     68 
     69  protected:
     70   // Runs the operation. The result is reported through |callback_|.
     71   virtual void Run() = 0;
     72 
     73   // Ensures the owner key is loaded.
     74   void EnsureOwnerKey(const base::Closure& callback);
     75 
     76   // Starts a load operation.
     77   void StartLoading();
     78 
     79   // Reports the result status of the operation. Once this gets called, the
     80   // operation should not perform further processing or trigger callbacks.
     81   void ReportResult(DeviceSettingsService::Status status);
     82 
     83   SessionManagerClient* session_manager_client() {
     84     return session_manager_client_;
     85   }
     86 
     87  private:
     88   // Loads the owner key from disk. Must be run on a thread that can do I/O.
     89   static scoped_refptr<OwnerKey> LoadOwnerKey(
     90       scoped_refptr<OwnerKeyUtil> util,
     91       scoped_refptr<OwnerKey> current_key);
     92 
     93   // Stores the owner key loaded by LoadOwnerKey and calls |callback|.
     94   void StoreOwnerKey(const base::Closure& callback,
     95                      scoped_refptr<OwnerKey> new_key);
     96 
     97   // Triggers a device settings load.
     98   void RetrieveDeviceSettings();
     99 
    100   // Validates device settings after retrieval from session_manager.
    101   void ValidateDeviceSettings(const std::string& policy_blob);
    102 
    103   // Extracts status and device settings from the validator and reports them.
    104   void ReportValidatorStatus(policy::DeviceCloudPolicyValidator* validator);
    105 
    106   SessionManagerClient* session_manager_client_;
    107   scoped_refptr<OwnerKeyUtil> owner_key_util_;
    108 
    109   base::WeakPtrFactory<SessionManagerOperation> weak_factory_;
    110 
    111   Callback callback_;
    112 
    113   scoped_refptr<OwnerKey> owner_key_;
    114   bool force_key_load_;
    115 
    116   bool is_loading_;
    117   scoped_ptr<enterprise_management::PolicyData> policy_data_;
    118   scoped_ptr<enterprise_management::ChromeDeviceSettingsProto> device_settings_;
    119 
    120   DISALLOW_COPY_AND_ASSIGN(SessionManagerOperation);
    121 };
    122 
    123 // This operation loads the public owner key from disk if appropriate, fetches
    124 // the policy blob from session manager, and validates the loaded policy blob.
    125 class LoadSettingsOperation : public SessionManagerOperation {
    126  public:
    127   // Creates a new load operation.
    128   explicit LoadSettingsOperation(const Callback& callback);
    129   virtual ~LoadSettingsOperation();
    130 
    131  protected:
    132   // SessionManagerOperation:
    133   virtual void Run() OVERRIDE;
    134 
    135  private:
    136   DISALLOW_COPY_AND_ASSIGN(LoadSettingsOperation);
    137 };
    138 
    139 // Stores a pre-generated policy blob and reloads the device settings from
    140 // session_manager.
    141 class StoreSettingsOperation : public SessionManagerOperation {
    142  public:
    143   // Creates a new store operation.
    144   StoreSettingsOperation(
    145       const Callback& callback,
    146       scoped_ptr<enterprise_management::PolicyFetchResponse> policy);
    147   virtual ~StoreSettingsOperation();
    148 
    149  protected:
    150   // SessionManagerOperation:
    151   virtual void Run() OVERRIDE;
    152 
    153  private:
    154   // Handles the result of the store operation and triggers the load.
    155   void HandleStoreResult(bool success);
    156 
    157   scoped_ptr<enterprise_management::PolicyFetchResponse> policy_;
    158 
    159   base::WeakPtrFactory<StoreSettingsOperation> weak_factory_;
    160 
    161   DISALLOW_COPY_AND_ASSIGN(StoreSettingsOperation);
    162 };
    163 
    164 // Signs device settings and stores the resulting blob to session_manager.
    165 class SignAndStoreSettingsOperation : public SessionManagerOperation {
    166  public:
    167   // Creates a new sign-and-store operation.
    168   SignAndStoreSettingsOperation(
    169       const Callback& callback,
    170       scoped_ptr<enterprise_management::ChromeDeviceSettingsProto> new_settings,
    171       const std::string& username);
    172   virtual ~SignAndStoreSettingsOperation();
    173 
    174   // SessionManagerOperation:
    175   virtual void Run() OVERRIDE;
    176 
    177  private:
    178   // Given an owner key, starts the signing operation.
    179   void StartSigning();
    180 
    181   // Builds the policy blob and signs it using the owner key.
    182   static std::string AssembleAndSignPolicy(
    183       scoped_ptr<enterprise_management::ChromeDeviceSettingsProto> settings,
    184       const std::string& username,
    185       scoped_refptr<OwnerKey> owner_key);
    186 
    187   // Stores the signed device settings blob.
    188   void StoreDeviceSettingsBlob(std::string device_settings_blob);
    189 
    190   // Handles the result of the store operation and triggers the load.
    191   void HandleStoreResult(bool success);
    192 
    193   scoped_ptr<enterprise_management::ChromeDeviceSettingsProto> new_settings_;
    194   std::string username_;
    195 
    196   base::WeakPtrFactory<SignAndStoreSettingsOperation> weak_factory_;
    197 
    198   DISALLOW_COPY_AND_ASSIGN(SignAndStoreSettingsOperation);
    199 };
    200 
    201 }  // namespace
    202 
    203 #endif  // CHROME_BROWSER_CHROMEOS_SETTINGS_SESSION_MANAGER_OPERATION_H_
    204