buffet: Add same as privetd D-Bus methods and properties We are moving privet code into buffet. BUG=brillo:1161 TEST=`FEATURES=test emerge-gizmo buffet` Change-Id: I49993ed66f40d828d046dd5b2c7c44edfc394276 Reviewed-on: https://chromium-review.googlesource.com/276601 Reviewed-by: Alex Vakulenko <avakulenko@chromium.org> Reviewed-by: Vitaly Buka <vitalybuka@chromium.org> Commit-Queue: Vitaly Buka <vitalybuka@chromium.org> Tested-by: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/buffet/dbus_bindings/org.chromium.Buffet.Manager.xml b/buffet/dbus_bindings/org.chromium.Buffet.Manager.xml index 0fa4282..67028b5 100644 --- a/buffet/dbus_bindings/org.chromium.Buffet.Manager.xml +++ b/buffet/dbus_bindings/org.chromium.Buffet.Manager.xml
@@ -76,6 +76,38 @@ <arg name="echoed_message" type="s" direction="out"/> <annotation name="org.chromium.DBus.Method.Kind" value="simple"/> </method> + <method name="EnableWiFiBootstrapping"> + <tp:docstring> + Enables WiFiBootstrapping if manual bootstrapping is selected via the + configuration file. This will re-purpose a WiFi interface for use in + bootstrapping. This breaks any existing WiFi connection on the + interface. + </tp:docstring> + <arg name="listener_path" type="o" direction="in"> + <tp:docstring> + Path to an object exposed by the caller. This object must support + the org.chromium.Buffet.WiFiBootstrapListener interface. + </tp:docstring> + </arg> + <arg name="options" type="a{sv}" direction="in"/> + <annotation name="org.chromium.DBus.Method.Kind" value="normal"/> + </method> + <method name="DisableWiFiBootstrapping"> + <tp:docstring> + If a previous call to EnableWiFiBootstrapping was successful and + has not been cancelled or completed since, disables that bootstrapping + process. + </tp:docstring> + <annotation name="org.chromium.DBus.Method.Kind" value="normal"/> + </method> + <method name="EnableGCDBootstrapping"> + <arg name="listener_path" type="o" direction="in"/> + <arg name="options" type="a{sv}" direction="in"/> + <annotation name="org.chromium.DBus.Method.Kind" value="normal"/> + </method> + <method name="DisableGCDBootstrapping"> + <annotation name="org.chromium.DBus.Method.Kind" value="normal"/> + </method> <property name="Status" type="s" access="read"> <tp:docstring> @@ -155,5 +187,55 @@ device. </tp:docstring> </property> + <property name="WiFiBootstrapState" type="s" access="read"> + <tp:docstring> + Contains one of the following values describing the state of WiFi + bootstrapping: + “disabled” - Bootstrapping has been disabled in the config file. + “waiting” - buffet is waiting to receive WiFi credentials from + a paired peer. + “connecting” - buffet has received WiFi credentials, and is now + attempting to connect to a WiFi network. + “monitoring” - buffet is monitoring our connectivity and will + re-enable bootstrapping if connectivity fails in + automatic mode. + + Note: more values may be added later to this list. + </tp:docstring> + </property> + <property name="GCDBootstrapState" type="s" access="read"> + <tp:docstring> + Contains one of the following values describing the state of GCD + bootstrapping: + “disabled” - GCD registration has been disabled in the config file. + “offline” - GCD registration is unknown because the device is offline. + “connecting” - GCD registration is unknown because the device is still + connecting to the cloud. + “waiting” - Waiting to be configured with GCD credentials. + “registering” - Registering the device with the GCD servers. + “online” - Device is online and registered with GCD servers. + + Note: more values may be added later to this list. + + Clients that wish to present a single linear bootstrapping flow to users + may treat GCD bootstrapping states as a suffix to WiFi bootstrapping + states. If we have no cloud connectivity, we cannot possibly do GCD + registration/credential verification. + </tp:docstring> + </property> + <property name="PairingInfo" type="a{sv}" access="read"> + <tp:docstring> + Describes the state of device pairing. While no pairing attempt is in + progress, this dictionary will be empty. When a client initiates a + pairing transaction via /privet/v3/pairing/start, dictionary will + contain the following keys: + “sessionId” - ID of the pairing session; generated by device + “pairingMode” - Selected type of pairing from /privet/v3/pairing/start + (e.g. “pinCode” or “embeddedCode”) + “code” - The pin code or embedded code as appropriate to the + “pairingMode” value. See design document. + This value will be a string. + </tp:docstring> + </property> </interface> </node>
diff --git a/buffet/manager.cc b/buffet/manager.cc index 6ca276d..5b6a6e5 100644 --- a/buffet/manager.cc +++ b/buffet/manager.cc
@@ -25,6 +25,9 @@ #include "buffet/base_api_handler.h" #include "buffet/commands/command_instance.h" #include "buffet/commands/schema_constants.h" +#include "buffet/privet/constants.h" +#include "buffet/privet/security_manager.h" +#include "buffet/privet/wifi_bootstrap_manager.h" #include "buffet/states/state_change_queue.h" #include "buffet/states/state_manager.h" #include "buffet/storage_impls.h" @@ -35,10 +38,16 @@ namespace buffet { namespace { + // Max of 100 state update events should be enough in the queue. const size_t kMaxStateChangeQueueSize = 100; // The number of seconds each HTTP request will be allowed before timing out. const int kRequestTimeoutSeconds = 30; + +const char kPairingSessionIdKey[] = "sessionId"; +const char kPairingModeKey[] = "mode"; +const char kPairingCodeKey[] = "code"; + } // anonymous namespace Manager::Manager(const base::WeakPtr<ExportedObjectManager>& object_manager) @@ -222,6 +231,40 @@ return message; } +bool Manager::EnableWiFiBootstrapping( + chromeos::ErrorPtr* error, + const dbus::ObjectPath& in_listener_path, + const chromeos::VariantDictionary& in_options) { + chromeos::Error::AddTo(error, FROM_HERE, privetd::errors::kDomain, + privetd::errors::kNotImplemented, + "Manual WiFi bootstrapping is not implemented"); + return false; +} + +bool Manager::DisableWiFiBootstrapping(chromeos::ErrorPtr* error) { + chromeos::Error::AddTo(error, FROM_HERE, privetd::errors::kDomain, + privetd::errors::kNotImplemented, + "Manual WiFi bootstrapping is not implemented"); + return false; +} + +bool Manager::EnableGCDBootstrapping( + chromeos::ErrorPtr* error, + const dbus::ObjectPath& in_listener_path, + const chromeos::VariantDictionary& in_options) { + chromeos::Error::AddTo(error, FROM_HERE, privetd::errors::kDomain, + privetd::errors::kNotImplemented, + "Manual GCD bootstrapping is not implemented"); + return false; +} + +bool Manager::DisableGCDBootstrapping(chromeos::ErrorPtr* error) { + chromeos::Error::AddTo(error, FROM_HERE, privetd::errors::kDomain, + privetd::errors::kNotImplemented, + "Manual GCD bootstrapping is not implemented"); + return false; +} + bool Manager::UpdateDeviceInfo(chromeos::ErrorPtr* error, const std::string& in_name, const std::string& in_description, @@ -277,4 +320,46 @@ dbus_adaptor_.SetAnonymousAccessRole(config.local_anonymous_access_role()); } +void Manager::UpdateWiFiBootstrapState( + privetd::WifiBootstrapManager::State state) { + switch (state) { + case privetd::WifiBootstrapManager::kDisabled: + dbus_adaptor_.SetWiFiBootstrapState("disabled"); + break; + case privetd::WifiBootstrapManager::kBootstrapping: + dbus_adaptor_.SetWiFiBootstrapState("waiting"); + break; + case privetd::WifiBootstrapManager::kMonitoring: + dbus_adaptor_.SetWiFiBootstrapState("monitoring"); + break; + case privetd::WifiBootstrapManager::kConnecting: + dbus_adaptor_.SetWiFiBootstrapState("connecting"); + break; + } +} + +void Manager::OnPairingStart(const std::string& session_id, + privetd::PairingType pairing_type, + const std::vector<uint8_t>& code) { + // For now, just overwrite the exposed PairInfo with + // the most recent pairing attempt. + dbus_adaptor_.SetPairingInfo(chromeos::VariantDictionary{ + {kPairingSessionIdKey, session_id}, + {kPairingModeKey, PairingTypeToString(pairing_type)}, + {kPairingCodeKey, code}, + }); +} + +void Manager::OnPairingEnd(const std::string& session_id) { + auto exposed_pairing_attempt = dbus_adaptor_.GetPairingInfo(); + auto it = exposed_pairing_attempt.find(kPairingSessionIdKey); + if (it == exposed_pairing_attempt.end()) { + return; + } + std::string exposed_session{it->second.TryGet<std::string>()}; + if (exposed_session == session_id) { + dbus_adaptor_.SetPairingInfo(chromeos::VariantDictionary{}); + } +} + } // namespace buffet
diff --git a/buffet/manager.h b/buffet/manager.h index 35e6e25..781fa03 100644 --- a/buffet/manager.h +++ b/buffet/manager.h
@@ -22,6 +22,8 @@ #include "buffet/commands/command_manager.h" #include "buffet/device_registration_info.h" #include "buffet/org.chromium.Buffet.Manager.h" +#include "buffet/privet/privet_manager.h" +#include "buffet/privet/wifi_bootstrap_manager.h" namespace chromeos { namespace dbus_utils { @@ -86,11 +88,26 @@ const std::vector<std::string>& in_names, const std::string& in_visibility) override; std::string TestMethod(const std::string& message) override; + bool EnableWiFiBootstrapping( + chromeos::ErrorPtr* error, + const dbus::ObjectPath& in_listener_path, + const chromeos::VariantDictionary& in_options) override; + bool DisableWiFiBootstrapping(chromeos::ErrorPtr* error) override; + bool EnableGCDBootstrapping( + chromeos::ErrorPtr* error, + const dbus::ObjectPath& in_listener_path, + const chromeos::VariantDictionary& in_options) override; + bool DisableGCDBootstrapping(chromeos::ErrorPtr* error) override; void OnCommandDefsChanged(); void OnStateChanged(); void OnRegistrationChanged(RegistrationStatus status); void OnConfigChanged(const BuffetConfig& config); + void UpdateWiFiBootstrapState(privetd::WifiBootstrapManager::State state); + void OnPairingStart(const std::string& session_id, + privetd::PairingType pairing_type, + const std::vector<uint8_t>& code); + void OnPairingEnd(const std::string& session_id); org::chromium::Buffet::ManagerAdaptor dbus_adaptor_{this}; chromeos::dbus_utils::DBusObject dbus_object_;
diff --git a/buffet/privet/dbus_manager.cc b/buffet/privet/dbus_manager.cc deleted file mode 100644 index c6aa416..0000000 --- a/buffet/privet/dbus_manager.cc +++ /dev/null
@@ -1,138 +0,0 @@ -// Copyright 2015 The Chromium OS Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "buffet/privet/dbus_manager.h" - -#include <base/memory/ref_counted.h> -#include <chromeos/any.h> - -#include "buffet/privet/constants.h" -#include "buffet/privet/security_delegate.h" -#include "buffet/privet/security_manager.h" - -using chromeos::Any; -using chromeos::dbus_utils::AsyncEventSequencer; -using chromeos::dbus_utils::DBusObject; -using chromeos::dbus_utils::ExportedObjectManager; -using org::chromium::privetd::ManagerAdaptor; - -namespace privetd { - -namespace { - -const char kPingResponse[] = "Hello world!"; -const char kPairingSessionIdKey[] = "sessionId"; -const char kPairingModeKey[] = "mode"; -const char kPairingCodeKey[] = "code"; - -} // namespace - -DBusManager::DBusManager(ExportedObjectManager* object_manager, - WifiBootstrapManager* wifi_bootstrap_manager, - CloudDelegate* cloud_delegate, - SecurityManager* security_manager) - : dbus_object_{new DBusObject{object_manager, - object_manager->GetBus(), - ManagerAdaptor::GetObjectPath()}} { - if (wifi_bootstrap_manager) { - wifi_bootstrap_manager->RegisterStateListener( - base::Bind(&DBusManager::UpdateWiFiBootstrapState, - weak_ptr_factory_.GetWeakPtr())); - } else { - UpdateWiFiBootstrapState(WifiBootstrapManager::kDisabled); - } - security_manager->RegisterPairingListeners( - base::Bind(&DBusManager::OnPairingStart, weak_ptr_factory_.GetWeakPtr()), - base::Bind(&DBusManager::OnPairingEnd, weak_ptr_factory_.GetWeakPtr())); - // TODO(wiley) Watch for appropriate state variables from |cloud_delegate|. -} - -void DBusManager::RegisterAsync(const CompletionAction& on_done) { - scoped_refptr<AsyncEventSequencer> sequencer(new AsyncEventSequencer()); - dbus_adaptor_.RegisterWithDBusObject(dbus_object_.get()); - dbus_object_->RegisterAsync( - sequencer->GetHandler("Failed exporting DBusManager.", true)); - sequencer->OnAllTasksCompletedCall({on_done}); -} - -bool DBusManager::EnableWiFiBootstrapping( - chromeos::ErrorPtr* error, - const dbus::ObjectPath& in_listener_path, - const chromeos::VariantDictionary& in_options) { - chromeos::Error::AddTo(error, FROM_HERE, errors::kDomain, - errors::kNotImplemented, - "Manual WiFi bootstrapping is not implemented"); - return false; -} - -bool DBusManager::DisableWiFiBootstrapping(chromeos::ErrorPtr* error) { - chromeos::Error::AddTo(error, FROM_HERE, errors::kDomain, - errors::kNotImplemented, - "Manual WiFi bootstrapping is not implemented"); - return false; -} - -bool DBusManager::EnableGCDBootstrapping( - chromeos::ErrorPtr* error, - const dbus::ObjectPath& in_listener_path, - const chromeos::VariantDictionary& in_options) { - chromeos::Error::AddTo(error, FROM_HERE, errors::kDomain, - errors::kNotImplemented, - "Manual GCD bootstrapping is not implemented"); - return false; -} - -bool DBusManager::DisableGCDBootstrapping(chromeos::ErrorPtr* error) { - chromeos::Error::AddTo(error, FROM_HERE, errors::kDomain, - errors::kNotImplemented, - "Manual GCD bootstrapping is not implemented"); - return false; -} - -std::string DBusManager::Ping() { - return kPingResponse; -} - -void DBusManager::UpdateWiFiBootstrapState(WifiBootstrapManager::State state) { - switch (state) { - case WifiBootstrapManager::kDisabled: - dbus_adaptor_.SetWiFiBootstrapState("disabled"); - break; - case WifiBootstrapManager::kBootstrapping: - dbus_adaptor_.SetWiFiBootstrapState("waiting"); - break; - case WifiBootstrapManager::kMonitoring: - dbus_adaptor_.SetWiFiBootstrapState("monitoring"); - break; - case WifiBootstrapManager::kConnecting: - dbus_adaptor_.SetWiFiBootstrapState("connecting"); - break; - } -} - -void DBusManager::OnPairingStart(const std::string& session_id, - PairingType pairing_type, - const std::vector<uint8_t>& code) { - // For now, just overwrite the exposed PairInfo with - // the most recent pairing attempt. - dbus_adaptor_.SetPairingInfo(chromeos::VariantDictionary{ - {kPairingSessionIdKey, session_id}, - {kPairingModeKey, PairingTypeToString(pairing_type)}, - {kPairingCodeKey, code}, - }); -} - -void DBusManager::OnPairingEnd(const std::string& session_id) { - auto exposed_pairing_attempt = dbus_adaptor_.GetPairingInfo(); - auto it = exposed_pairing_attempt.find(kPairingSessionIdKey); - if (it == exposed_pairing_attempt.end()) { - return; - } - std::string exposed_session{it->second.TryGet<std::string>()}; - if (exposed_session == session_id) { - dbus_adaptor_.SetPairingInfo(chromeos::VariantDictionary{}); - } -} - -} // namespace privetd
diff --git a/buffet/privet/dbus_manager.h b/buffet/privet/dbus_manager.h deleted file mode 100644 index 03cce45..0000000 --- a/buffet/privet/dbus_manager.h +++ /dev/null
@@ -1,76 +0,0 @@ -// Copyright 2015 The Chromium OS 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 BUFFET_PRIVET_DBUS_MANAGER_H_ -#define BUFFET_PRIVET_DBUS_MANAGER_H_ - -#include <memory> -#include <string> -#include <vector> - -#include <base/macros.h> -#include <chromeos/dbus/async_event_sequencer.h> -#include <chromeos/dbus/dbus_object.h> -#include <chromeos/errors/error.h> -#include <chromeos/variant_dictionary.h> -#include <dbus/object_path.h> - -#include "buffet/privet/org.chromium.privetd.Manager.h" -#include "buffet/privet/wifi_bootstrap_manager.h" - -namespace chromeos { -namespace dbus_utils { -class ExportedObjectManager; -} // dbus_utils -} // chromeos - -namespace privetd { - -class CloudDelegate; -class SecurityManager; -enum class PairingType; - -// Exposes most of the privetd DBus interface. -class DBusManager : public org::chromium::privetd::ManagerInterface { - public: - using CompletionAction = - chromeos::dbus_utils::AsyncEventSequencer::CompletionAction; - - DBusManager(chromeos::dbus_utils::ExportedObjectManager* object_manager, - WifiBootstrapManager* wifi_bootstrap_manager, - CloudDelegate* cloud_delegate, - SecurityManager* security_manager); - ~DBusManager() override = default; - void RegisterAsync(const CompletionAction& on_done); - - // DBus handlers - bool EnableWiFiBootstrapping( - chromeos::ErrorPtr* error, - const dbus::ObjectPath& in_listener_path, - const chromeos::VariantDictionary& in_options) override; - bool DisableWiFiBootstrapping(chromeos::ErrorPtr* error) override; - bool EnableGCDBootstrapping( - chromeos::ErrorPtr* error, - const dbus::ObjectPath& in_listener_path, - const chromeos::VariantDictionary& in_options) override; - bool DisableGCDBootstrapping(chromeos::ErrorPtr* error) override; - std::string Ping() override; - - private: - void UpdateWiFiBootstrapState(WifiBootstrapManager::State state); - void OnPairingStart(const std::string& session_id, - PairingType pairing_type, - const std::vector<uint8_t>& code); - void OnPairingEnd(const std::string& session_id); - - org::chromium::privetd::ManagerAdaptor dbus_adaptor_{this}; - std::unique_ptr<chromeos::dbus_utils::DBusObject> dbus_object_; - base::WeakPtrFactory<DBusManager> weak_ptr_factory_{this}; - - DISALLOW_COPY_AND_ASSIGN(DBusManager); -}; - -} // namespace privetd - -#endif // BUFFET_PRIVET_DBUS_MANAGER_H_