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 CHROMEOS_DBUS_SHILL_MANAGER_CLIENT_H_
6#define CHROMEOS_DBUS_SHILL_MANAGER_CLIENT_H_
7
8#include <string>
9
10#include "base/basictypes.h"
11#include "chromeos/chromeos_export.h"
12#include "chromeos/dbus/dbus_client.h"
13#include "chromeos/dbus/dbus_method_call_status.h"
14#include "chromeos/dbus/shill_client_helper.h"
15
16namespace dbus {
17class ObjectPath;
18}
19
20namespace net {
21class IPEndPoint;
22}
23
24namespace chromeos {
25
26class ShillPropertyChangedObserver;
27
28// ShillManagerClient is used to communicate with the Shill Manager
29// service.  All methods should be called from the origin thread which
30// initializes the DBusThreadManager instance.
31class CHROMEOS_EXPORT ShillManagerClient : public DBusClient {
32 public:
33  typedef ShillClientHelper::PropertyChangedHandler PropertyChangedHandler;
34  typedef ShillClientHelper::DictionaryValueCallback DictionaryValueCallback;
35  typedef ShillClientHelper::ErrorCallback ErrorCallback;
36  typedef ShillClientHelper::StringCallback StringCallback;
37  typedef ShillClientHelper::BooleanCallback BooleanCallback;
38
39  // Interface for setting up devices, services, and technologies for testing.
40  // Accessed through GetTestInterface(), only implemented in the Stub Impl.
41  class TestInterface {
42   public:
43    virtual void AddDevice(const std::string& device_path) = 0;
44    virtual void RemoveDevice(const std::string& device_path) = 0;
45    virtual void ClearDevices() = 0;
46    virtual void AddTechnology(const std::string& type, bool enabled) = 0;
47    virtual void RemoveTechnology(const std::string& type) = 0;
48    virtual void SetTechnologyInitializing(const std::string& type,
49                                           bool initializing) = 0;
50    virtual void AddGeoNetwork(const std::string& technology,
51                               const base::DictionaryValue& network) = 0;
52
53    // Does not create an actual profile in the ProfileClient but update the
54    // profiles list and sends a notification to observers. This should only be
55    // called by the ProfileStub. In all other cases, use
56    // ShillProfileClient::TestInterface::AddProfile.
57    virtual void AddProfile(const std::string& profile_path) = 0;
58
59    // Used to reset all properties; does not notify observers.
60    virtual void ClearProperties() = 0;
61
62    // Set manager property.
63    virtual void SetManagerProperty(const std::string& key,
64                                    const base::Value& value) = 0;
65
66    // Modify services in the Manager's list.
67    virtual void AddManagerService(const std::string& service_path,
68                                   bool notify_observers) = 0;
69    virtual void RemoveManagerService(const std::string& service_path) = 0;
70    virtual void ClearManagerServices() = 0;
71
72    // Called by ShillServiceClient when a service's State property changes,
73    // before notifying observers. Sets the DefaultService property to empty
74    // if the state changes to a non-connected state.
75    virtual void ServiceStateChanged(const std::string& service_path,
76                                     const std::string& state) = 0;
77
78    // Called by ShillServiceClient when a service's State or Visibile
79    // property changes. If |notify| is true, notifies observers if a list
80    // changed. Services are sorted first by active, inactive, or disabled
81    // state, then by type.
82    virtual void SortManagerServices(bool notify) = 0;
83
84    // Sets up the default fake environment based on default initial states
85    // or states provided by the command line.
86    virtual void SetupDefaultEnvironment() = 0;
87
88    // Returns the interactive delay specified on the command line, 0 for none.
89    virtual int GetInteractiveDelay() const = 0;
90
91    // Sets the 'best' service to connect to on a ConnectToBestServices call.
92    virtual void SetBestServiceToConnect(const std::string& service_path) = 0;
93
94   protected:
95    virtual ~TestInterface() {}
96  };
97
98  // Properties used to verify the origin device.
99  struct VerificationProperties {
100    VerificationProperties();
101    ~VerificationProperties();
102
103    // A string containing a PEM-encoded X.509 certificate for use in verifying
104    // the signed data.
105    std::string certificate;
106
107    // A string containing a PEM-encoded RSA public key to be used to compare
108    // with the one in signedData
109    std::string public_key;
110
111    // A string containing a base64-encoded random binary data for use in
112    // verifying the signed data.
113    std::string nonce;
114
115    // A string containing the identifying data string signed by the device.
116    std::string signed_data;
117
118    // A string containing the serial number of the device.
119    std::string device_serial;
120
121    // A string containing the SSID of the device. Only set if the device has
122    // already been setup once.
123    std::string device_ssid;
124
125    // A string containing the BSSID of the device. Only set if the device has
126    // already been setup.
127    std::string device_bssid;
128  };
129
130  virtual ~ShillManagerClient();
131
132  // Factory function, creates a new instance which is owned by the caller.
133  // For normal usage, access the singleton via DBusThreadManager::Get().
134  static ShillManagerClient* Create();
135
136  // Adds a property changed |observer|.
137  virtual void AddPropertyChangedObserver(
138      ShillPropertyChangedObserver* observer) = 0;
139
140  // Removes a property changed |observer|.
141  virtual void RemovePropertyChangedObserver(
142      ShillPropertyChangedObserver* observer) = 0;
143
144  // Calls GetProperties method.
145  // |callback| is called after the method call succeeds.
146  virtual void GetProperties(const DictionaryValueCallback& callback) = 0;
147
148  // Calls GetNetworksForGeolocation method.
149  // |callback| is called after the method call succeeds.
150  virtual void GetNetworksForGeolocation(
151      const DictionaryValueCallback& callback) = 0;
152
153  // Calls SetProperty method.
154  // |callback| is called after the method call succeeds.
155  virtual void SetProperty(const std::string& name,
156                           const base::Value& value,
157                           const base::Closure& callback,
158                           const ErrorCallback& error_callback) = 0;
159
160  // Calls RequestScan method.
161  // |callback| is called after the method call succeeds.
162  virtual void RequestScan(const std::string& type,
163                           const base::Closure& callback,
164                           const ErrorCallback& error_callback) = 0;
165
166  // Calls EnableTechnology method.
167  // |callback| is called after the method call succeeds.
168  virtual void EnableTechnology(const std::string& type,
169                                const base::Closure& callback,
170                                const ErrorCallback& error_callback) = 0;
171
172  // Calls DisableTechnology method.
173  // |callback| is called after the method call succeeds.
174  virtual void DisableTechnology(const std::string& type,
175                                 const base::Closure& callback,
176                                 const ErrorCallback& error_callback) = 0;
177
178  // Calls ConfigureService method.
179  // |callback| is called after the method call succeeds.
180  virtual void ConfigureService(const base::DictionaryValue& properties,
181                                const ObjectPathCallback& callback,
182                                const ErrorCallback& error_callback) = 0;
183
184  // Calls ConfigureServiceForProfile method.
185  // |callback| is called with the created service if the method call succeeds.
186  virtual void ConfigureServiceForProfile(
187      const dbus::ObjectPath& profile_path,
188      const base::DictionaryValue& properties,
189      const ObjectPathCallback& callback,
190      const ErrorCallback& error_callback) = 0;
191
192  // Calls GetService method.
193  // |callback| is called after the method call succeeds.
194  virtual void GetService(const base::DictionaryValue& properties,
195                          const ObjectPathCallback& callback,
196                          const ErrorCallback& error_callback) = 0;
197
198  // Verifies that the given data corresponds to a trusted device, and returns
199  // true to the callback if it is.
200  virtual void VerifyDestination(const VerificationProperties& properties,
201                                 const BooleanCallback& callback,
202                                 const ErrorCallback& error_callback) = 0;
203
204  // Verifies that the given data corresponds to a trusted device, and if it is,
205  // returns the encrypted credentials for connecting to the network represented
206  // by the given |service_path|, encrypted using the |public_key| for the
207  // trusted device. If the device is not trusted, returns the empty string.
208  virtual void VerifyAndEncryptCredentials(
209      const VerificationProperties& properties,
210      const std::string& service_path,
211      const StringCallback& callback,
212      const ErrorCallback& error_callback) = 0;
213
214  // Verifies that the given data corresponds to a trusted device, and returns
215  // the |data| encrypted using the |public_key| for the trusted device. If the
216  // device is not trusted, returns the empty string.
217  virtual void VerifyAndEncryptData(const VerificationProperties& properties,
218                                    const std::string& data,
219                                    const StringCallback& callback,
220                                    const ErrorCallback& error_callback) = 0;
221
222  // For each technology present, connects to the "best" service available.
223  // Called once the user is logged in and certificates are loaded.
224  virtual void ConnectToBestServices(const base::Closure& callback,
225                                     const ErrorCallback& error_callback) = 0;
226
227  // Requests that shill program the NIC so that packets incoming on
228  // |ip_connection| wake up the CPU.
229  virtual void AddWakeOnPacketConnection(
230      const net::IPEndPoint& ip_endpoint,
231      const base::Closure& callback,
232      const ErrorCallback& error_callback) = 0;
233
234  // Removes a request to wake up on packets coming on |ip_connection|.
235  virtual void RemoveWakeOnPacketConnection(
236      const net::IPEndPoint& ip_endpoint,
237      const base::Closure& callback,
238      const ErrorCallback& error_callback) = 0;
239
240  // Clears all requests to wake up on packets.
241  virtual void RemoveAllWakeOnPacketConnections(
242      const base::Closure& callback,
243      const ErrorCallback& error_callback) = 0;
244
245  // Returns an interface for testing (stub only), or returns NULL.
246  virtual TestInterface* GetTestInterface() = 0;
247
248 protected:
249  friend class ShillManagerClientTest;
250
251  // Create() should be used instead.
252  ShillManagerClient();
253
254 private:
255  DISALLOW_COPY_AND_ASSIGN(ShillManagerClient);
256};
257
258}  // namespace chromeos
259
260#endif  // CHROMEOS_DBUS_SHILL_MANAGER_CLIENT_H_
261