1 // Copyright 2014 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.
5 #ifndef CHROME_BROWSER_LOCAL_DISCOVERY_PRIVETV3_SESSION_H_
6 #define CHROME_BROWSER_LOCAL_DISCOVERY_PRIVETV3_SESSION_H_
10 #include "base/callback.h"
11 #include "base/gtest_prod_util.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/scoped_vector.h"
14 #include "base/memory/weak_ptr.h"
15 #include "chrome/common/extensions/api/gcd_private.h"
16 #include "net/url_request/url_fetcher.h"
19 class DictionaryValue
;
23 class P224EncryptedKeyExchange
;
26 namespace local_discovery
{
28 class PrivetHTTPClient
;
29 class PrivetJSONOperation
;
30 class PrivetURLFetcher
;
32 // Manages secure communication between browser and local Privet device.
33 class PrivetV3Session
{
35 class FetcherDelegate
;
38 typedef extensions::api::gcd_private::PairingType PairingType
;
39 typedef extensions::api::gcd_private::Status Result
;
41 typedef base::Callback
<
42 void(Result result
, const base::DictionaryValue
& response
)> InitCallback
;
44 typedef base::Callback
<void(Result result
)> ResultCallback
;
45 typedef base::Callback
<void(Result result
,
46 const base::DictionaryValue
& response
)>
49 explicit PrivetV3Session(scoped_ptr
<PrivetHTTPClient
> client
);
52 // Initializes session. Queries /privet/info and returns supported pairing
54 void Init(const InitCallback
& callback
);
56 // Starts pairing by calling /privet/v3/pairing/start.
57 void StartPairing(PairingType pairing_type
, const ResultCallback
& callback
);
59 // Confirms pairing code by calling /privet/v3/pairing/confirm.
60 // Calls /privet/v3/pairing/auth after pairing.
61 void ConfirmCode(const std::string
& code
, const ResultCallback
& callback
);
63 // TODO(vitalybuka): Make HTTPS request to device with certificate validation.
64 void SendMessage(const std::string
& api
,
65 const base::DictionaryValue
& input
,
66 const MessageCallback
& callback
);
69 friend class PrivetV3SessionTest
;
70 FRIEND_TEST_ALL_PREFIXES(PrivetV3SessionTest
, Pairing
);
72 void OnInfoDone(const InitCallback
& callback
,
74 const base::DictionaryValue
& response
);
75 void OnPairingStartDone(const ResultCallback
& callback
,
77 const base::DictionaryValue
& response
);
78 void OnPairingConfirmDone(const ResultCallback
& callback
,
80 const base::DictionaryValue
& response
);
81 void OnAuthenticateDone(const ResultCallback
& callback
,
83 const base::DictionaryValue
& response
);
85 void RunCallback(const base::Closure
& callback
);
86 void StartGetRequest(const std::string
& api
, const MessageCallback
& callback
);
87 void StartPostRequest(const std::string
& api
,
88 const base::DictionaryValue
& input
,
89 const MessageCallback
& callback
);
90 PrivetURLFetcher
* CreateFetcher(const std::string
& api
,
91 net::URLFetcher::RequestType request_type
,
92 const MessageCallback
& callback
);
93 void DeleteFetcher(const FetcherDelegate
* fetcher
);
96 // Creates instances of PrivetURLFetcher.
97 scoped_ptr
<PrivetHTTPClient
> client_
;
99 // Current authentication token.
100 std::string privet_auth_token_
;
102 // ID of the session received from pairing/start.
103 std::string session_id_
;
105 // Device commitment received from pairing/start.
106 std::string commitment_
;
108 // Key exchange algorithm for pairing.
109 scoped_ptr
<crypto::P224EncryptedKeyExchange
> spake_
;
111 // HTTPS certificate fingerprint received during pairing.
112 std::string fingerprint_
;
114 // List of fetches to cancel when session is destroyed.
115 ScopedVector
<FetcherDelegate
> fetchers_
;
117 // Intercepts POST requests. Used by tests only.
118 base::Callback
<void(const base::DictionaryValue
&)> on_post_data_
;
120 base::WeakPtrFactory
<PrivetV3Session
> weak_ptr_factory_
;
121 DISALLOW_COPY_AND_ASSIGN(PrivetV3Session
);
124 } // namespace local_discovery
126 #endif // CHROME_BROWSER_LOCAL_DISCOVERY_PRIVETV3_SESSION_H_