blob: 8a29a5f27c081b6b4d0bb3f36f75a9d14f390cae [file] [log] [blame]
// Copyright 2014 The Chromium 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 CHROME_BROWSER_EXTENSIONS_API_GCD_PRIVATE_PRIVET_V3_SESSION_H_
#define CHROME_BROWSER_EXTENSIONS_API_GCD_PRIVATE_PRIVET_V3_SESSION_H_
#include <stdint.h>
#include <memory>
#include <string>
#include "base/callback.h"
#include "base/gtest_prod_util.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "chrome/common/extensions/api/gcd_private.h"
#include "net/url_request/url_fetcher.h"
namespace base {
class DictionaryValue;
}
namespace crypto {
class P224EncryptedKeyExchange;
}
namespace extensions {
class PrivetV3ContextGetter;
// Manages secure communication between browser and local Privet device.
class PrivetV3Session {
private:
class FetcherDelegate;
public:
typedef extensions::api::gcd_private::PairingType PairingType;
typedef extensions::api::gcd_private::Status Result;
typedef base::Callback<
void(Result result, const base::DictionaryValue& response)> InitCallback;
typedef base::Callback<void(Result result)> ResultCallback;
typedef base::Callback<void(Result result,
const base::DictionaryValue& response)>
MessageCallback;
PrivetV3Session(const scoped_refptr<PrivetV3ContextGetter>& context_getter,
const net::HostPortPair& host_port);
~PrivetV3Session();
// Initializes session. Queries /privet/info and returns supported pairing
// types in callback.
void Init(const InitCallback& callback);
// Starts pairing by calling /privet/v3/pairing/start.
void StartPairing(PairingType pairing_type, const ResultCallback& callback);
// Confirms pairing code by calling /privet/v3/pairing/confirm.
// Calls /privet/v3/pairing/auth after pairing.
void ConfirmCode(const std::string& code, const ResultCallback& callback);
// TODO(vitalybuka): Make HTTPS request to device with certificate validation.
void SendMessage(const std::string& api,
const base::DictionaryValue& input,
const MessageCallback& callback);
private:
friend class PrivetV3SessionTest;
FRIEND_TEST_ALL_PREFIXES(PrivetV3SessionTest, Pairing);
FRIEND_TEST_ALL_PREFIXES(PrivetV3SessionTest, SendMessage);
void OnInfoDone(const InitCallback& callback,
Result result,
const base::DictionaryValue& response);
void OnPairingStartDone(const ResultCallback& callback,
Result result,
const base::DictionaryValue& response);
void OnPairingConfirmDone(const ResultCallback& callback,
Result result,
const base::DictionaryValue& response);
void OnPairedHostAddedToContext(const std::string& auth_code,
const ResultCallback& callback);
void OnAuthenticateDone(const ResultCallback& callback,
Result result,
const base::DictionaryValue& response);
void RunCallback(const base::Closure& callback);
void StartGetRequest(const std::string& api, const MessageCallback& callback);
void StartPostRequest(const std::string& api,
const base::DictionaryValue& input,
const MessageCallback& callback);
void SwitchToHttps();
GURL CreatePrivetURL(const std::string& path) const;
net::URLFetcher* CreateFetcher(const std::string& api,
net::URLFetcher::RequestType request_type,
const MessageCallback& callback);
void DeleteFetcher(const FetcherDelegate* fetcher);
void Cancel();
// Endpoint for the current session.
net::HostPortPair host_port_;
// Provides context for client_.
scoped_refptr<PrivetV3ContextGetter> context_getter_;
// Current authentication token.
std::string privet_auth_token_;
// ID of the session received from pairing/start.
std::string session_id_;
// Device commitment received from pairing/start.
std::string commitment_;
// Key exchange algorithm for pairing.
std::unique_ptr<crypto::P224EncryptedKeyExchange> spake_;
// HTTPS port of the device.
uint16_t https_port_ = 0;
// If true, HTTPS will be used.
bool use_https_ = false;
// List of fetches to cancel when session is destroyed.
std::vector<std::unique_ptr<FetcherDelegate>> fetchers_;
// Intercepts POST requests. Used by tests only.
base::Callback<void(const base::DictionaryValue&)> on_post_data_;
base::WeakPtrFactory<PrivetV3Session> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(PrivetV3Session);
};
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_API_GCD_PRIVATE_PRIVET_V3_SESSION_H_