blob: 4eba329abf3b63f8c7a61a4a8e095711591ee43e [file] [log] [blame]
Vitaly Buka4615e0d2015-10-14 15:35:12 -07001// Copyright 2015 The Weave Authors. All rights reserved.
Vitaly Buka7ce499f2015-06-09 08:04:11 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Vitaly Buka912b6982015-07-06 11:13:03 -07005#ifndef LIBWEAVE_SRC_PRIVET_PRIVET_HANDLER_H_
6#define LIBWEAVE_SRC_PRIVET_PRIVET_HANDLER_H_
Vitaly Buka7ce499f2015-06-09 08:04:11 -07007
8#include <map>
9#include <string>
10#include <utility>
11
12#include <base/macros.h>
13#include <base/memory/weak_ptr.h>
14#include <base/scoped_observer.h>
Alex Vakulenko532140d2015-12-11 17:18:21 -080015#include <base/time/default_clock.h>
Vitaly Buka7ce499f2015-06-09 08:04:11 -070016
Stefan Sauer2d16dfa2015-09-25 17:08:35 +020017#include "src/privet/cloud_delegate.h"
Vitaly Buka7ce499f2015-06-09 08:04:11 -070018
19namespace base {
20class Value;
21class DictionaryValue;
22} // namespace base
23
Vitaly Bukab6f015a2015-07-09 14:59:23 -070024namespace weave {
25namespace privet {
Vitaly Buka7ce499f2015-06-09 08:04:11 -070026
27class DeviceDelegate;
28class IdentityDelegate;
29class SecurityDelegate;
30class WifiDelegate;
31
Vitaly Buka7ce499f2015-06-09 08:04:11 -070032// Privet V3 HTTP/HTTPS requests handler.
33// API details at https://developers.google.com/cloud-devices/
34class PrivetHandler : public CloudDelegate::Observer {
35 public:
36 // Callback to handle requests asynchronously.
37 // |status| is HTTP status code.
38 // |output| is result returned in HTTP response. Contains result of
39 // successfully request of information about error.
40 using RequestCallback =
41 base::Callback<void(int status, const base::DictionaryValue& output)>;
42
43 PrivetHandler(CloudDelegate* cloud,
44 DeviceDelegate* device,
45 SecurityDelegate* pairing,
Alex Vakulenko532140d2015-12-11 17:18:21 -080046 WifiDelegate* wifi,
47 base::Clock* clock = nullptr);
Vitaly Buka7ce499f2015-06-09 08:04:11 -070048 ~PrivetHandler() override;
49
Alex Vakulenkod91d6252015-12-05 17:14:39 -080050 void OnTraitDefsChanged() override;
Alex Vakulenko551a82b2015-12-07 14:46:12 -080051 void OnStateChanged() override;
Alex Vakulenkod91d6252015-12-05 17:14:39 -080052 void OnComponentTreeChanged() override;
Vitaly Buka7ce499f2015-06-09 08:04:11 -070053
Vitaly Buka1a39c812015-10-08 21:20:58 -070054 std::vector<std::string> GetHttpPaths() const;
55 std::vector<std::string> GetHttpsPaths() const;
56
Vitaly Buka7ce499f2015-06-09 08:04:11 -070057 // Handles HTTP/HTTPS Privet request.
58 // |api| is the path from the HTTP request, e.g /privet/info.
59 // |auth_header| is the Authentication header from HTTP request.
Alex Vakulenkoefee3a22015-11-17 15:08:38 -080060 // |input| is the POST data from HTTP request. If nullptr, data format is
Vitaly Buka7ce499f2015-06-09 08:04:11 -070061 // not valid JSON.
62 // |callback| will be called exactly once during or after |HandleRequest|
63 // call.
64 void HandleRequest(const std::string& api,
65 const std::string& auth_header,
66 const base::DictionaryValue* input,
67 const RequestCallback& callback);
68
69 private:
70 using ApiHandler = void (PrivetHandler::*)(const base::DictionaryValue&,
71 const UserInfo&,
72 const RequestCallback&);
73
Alex Vakulenkoefee3a22015-11-17 15:08:38 -080074 // Adds a handler for both HTTP and HTTPS interfaces.
Vitaly Buka7ce499f2015-06-09 08:04:11 -070075 void AddHandler(const std::string& path, ApiHandler handler, AuthScope scope);
76
Alex Vakulenkoefee3a22015-11-17 15:08:38 -080077 // Adds a handler for both HTTPS interface only.
78 void AddSecureHandler(const std::string& path,
79 ApiHandler handler,
80 AuthScope scope);
81
Vitaly Buka7ce499f2015-06-09 08:04:11 -070082 void HandleInfo(const base::DictionaryValue&,
83 const UserInfo& user_info,
84 const RequestCallback& callback);
85 void HandlePairingStart(const base::DictionaryValue& input,
86 const UserInfo& user_info,
87 const RequestCallback& callback);
88 void HandlePairingConfirm(const base::DictionaryValue& input,
89 const UserInfo& user_info,
90 const RequestCallback& callback);
91 void HandlePairingCancel(const base::DictionaryValue& input,
92 const UserInfo& user_info,
93 const RequestCallback& callback);
94 void HandleAuth(const base::DictionaryValue& input,
95 const UserInfo& user_info,
96 const RequestCallback& callback);
Vitaly Buka2d24e0e2015-12-10 14:56:37 -080097 void HandleAccessControlClaim(const base::DictionaryValue& input,
98 const UserInfo& user_info,
99 const RequestCallback& callback);
100 void HandleAccessControlConfirm(const base::DictionaryValue& input,
101 const UserInfo& user_info,
102 const RequestCallback& callback);
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700103 void HandleSetupStart(const base::DictionaryValue& input,
104 const UserInfo& user_info,
105 const RequestCallback& callback);
106 void HandleSetupStatus(const base::DictionaryValue&,
107 const UserInfo& user_info,
108 const RequestCallback& callback);
109 void HandleState(const base::DictionaryValue& input,
110 const UserInfo& user_info,
111 const RequestCallback& callback);
112 void HandleCommandDefs(const base::DictionaryValue& input,
113 const UserInfo& user_info,
114 const RequestCallback& callback);
115 void HandleCommandsExecute(const base::DictionaryValue& input,
116 const UserInfo& user_info,
117 const RequestCallback& callback);
118 void HandleCommandsStatus(const base::DictionaryValue& input,
119 const UserInfo& user_info,
120 const RequestCallback& callback);
121 void HandleCommandsList(const base::DictionaryValue& input,
122 const UserInfo& user_info,
123 const RequestCallback& callback);
124 void HandleCommandsCancel(const base::DictionaryValue& input,
125 const UserInfo& user_info,
126 const RequestCallback& callback);
Alex Vakulenkoefee3a22015-11-17 15:08:38 -0800127 void HandleCheckForUpdates(const base::DictionaryValue& input,
128 const UserInfo& user_info,
129 const RequestCallback& callback);
Alex Vakulenko551a82b2015-12-07 14:46:12 -0800130 void HandleTraits(const base::DictionaryValue& input,
131 const UserInfo& user_info,
132 const RequestCallback& callback);
133 void HandleComponents(const base::DictionaryValue& input,
134 const UserInfo& user_info,
135 const RequestCallback& callback);
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700136
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700137 void ReplyWithSetupStatus(const RequestCallback& callback) const;
Alex Vakulenkoefee3a22015-11-17 15:08:38 -0800138 void ReplyToUpdateRequest(const RequestCallback& callback) const;
139 void OnUpdateRequestTimeout(int update_request_id);
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700140
Alex Vakulenkof9691322015-12-07 14:34:48 -0800141 CloudDelegate* cloud_{nullptr};
142 DeviceDelegate* device_{nullptr};
143 SecurityDelegate* security_{nullptr};
144 WifiDelegate* wifi_{nullptr};
Alex Vakulenko532140d2015-12-11 17:18:21 -0800145 base::DefaultClock default_clock_;
146 base::Clock* clock_{nullptr};
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700147
Alex Vakulenkoefee3a22015-11-17 15:08:38 -0800148 struct HandlerParameters {
149 ApiHandler handler;
150 AuthScope scope;
151 bool https_only = true;
152 };
153 std::map<std::string, HandlerParameters> handlers_;
154
155 struct UpdateRequestParameters {
156 RequestCallback callback;
Alex Vakulenkof9691322015-12-07 14:34:48 -0800157 int request_id{0};
158 uint64_t state_fingerprint{0};
159 uint64_t traits_fingerprint{0};
160 uint64_t components_fingerprint{0};
Alex Vakulenkoefee3a22015-11-17 15:08:38 -0800161 };
162 std::vector<UpdateRequestParameters> update_requests_;
163 int last_update_request_id_{0};
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700164
Alex Vakulenkof9691322015-12-07 14:34:48 -0800165 uint64_t state_fingerprint_{1};
166 uint64_t traits_fingerprint_{1};
167 uint64_t components_fingerprint_{1};
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700168 ScopedObserver<CloudDelegate, CloudDelegate::Observer> cloud_observer_{this};
169
170 base::WeakPtrFactory<PrivetHandler> weak_ptr_factory_{this};
171
172 DISALLOW_COPY_AND_ASSIGN(PrivetHandler);
173};
174
Vitaly Bukab6f015a2015-07-09 14:59:23 -0700175} // namespace privet
176} // namespace weave
Vitaly Buka7ce499f2015-06-09 08:04:11 -0700177
Vitaly Buka912b6982015-07-06 11:13:03 -0700178#endif // LIBWEAVE_SRC_PRIVET_PRIVET_HANDLER_H_