Add testing/scripts/OWNERS
[chromium-blink-merge.git] / extensions / browser / api / cast_channel / cast_socket.h
blobd53f624a0effde5b9334770c1e3b2c5d89ec0660
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 EXTENSIONS_BROWSER_API_CAST_CHANNEL_CAST_SOCKET_H_
6 #define EXTENSIONS_BROWSER_API_CAST_CHANNEL_CAST_SOCKET_H_
8 #include <queue>
9 #include <string>
11 #include "base/basictypes.h"
12 #include "base/cancelable_callback.h"
13 #include "base/gtest_prod_util.h"
14 #include "base/memory/ref_counted.h"
15 #include "base/threading/thread_checker.h"
16 #include "base/timer/timer.h"
17 #include "extensions/browser/api/api_resource.h"
18 #include "extensions/browser/api/api_resource_manager.h"
19 #include "extensions/common/api/cast_channel.h"
20 #include "extensions/common/api/cast_channel/logging.pb.h"
21 #include "net/base/completion_callback.h"
22 #include "net/base/io_buffer.h"
23 #include "net/base/ip_endpoint.h"
24 #include "net/base/net_log.h"
26 namespace net {
27 class AddressList;
28 class CertVerifier;
29 class SSLClientSocket;
30 class StreamSocket;
31 class TCPClientSocket;
32 class TransportSecurityState;
35 namespace extensions {
36 namespace core_api {
37 namespace cast_channel {
39 class CastMessage;
40 class Logger;
41 struct LastErrors;
42 class MessageFramer;
44 // This class implements a channel between Chrome and a Cast device using a TCP
45 // socket with SSL. The channel may authenticate that the receiver is a genuine
46 // Cast device. All CastSocket objects must be used only on the IO thread.
48 // NOTE: Not called "CastChannel" to reduce confusion with the generated API
49 // code.
50 // TODO(kmarshall): Inherit from CastSocket and rename to CastSocketImpl.
51 class CastSocket : public ApiResource {
52 public:
53 // Object to be informed of incoming messages and errors. The CastSocket
54 // that owns the delegate must not be deleted by it, only by the
55 // ApiResourceManager or in the callback to Close().
56 class Delegate {
57 public:
58 // An error occurred on the channel. |last_errors| contains the last errors
59 // logged for the channel from the implementation.
60 virtual void OnError(const CastSocket* socket,
61 ChannelError error_state,
62 const LastErrors& last_errors) = 0;
63 // A message was received on the channel.
64 virtual void OnMessage(const CastSocket* socket,
65 const MessageInfo& message) = 0;
67 protected:
68 virtual ~Delegate() {}
71 // Creates a new CastSocket that connects to |ip_endpoint| with
72 // |channel_auth|. |owner_extension_id| is the id of the extension that opened
73 // the socket. |channel_auth| must not be CHANNEL_AUTH_NONE.
74 CastSocket(const std::string& owner_extension_id,
75 const net::IPEndPoint& ip_endpoint,
76 ChannelAuthType channel_auth,
77 CastSocket::Delegate* delegate,
78 net::NetLog* net_log,
79 const base::TimeDelta& connect_timeout,
80 const scoped_refptr<Logger>& logger);
82 // Ensures that the socket is closed.
83 ~CastSocket() override;
85 // The IP endpoint for the destination of the channel.
86 const net::IPEndPoint& ip_endpoint() const { return ip_endpoint_; }
88 // The authentication level requested for the channel.
89 ChannelAuthType channel_auth() const { return channel_auth_; }
91 // Returns a cast:// or casts:// URL for the channel endpoint.
92 // For backwards compatibility.
93 std::string CastUrl() const;
95 // Channel id for the ApiResourceManager.
96 int id() const { return channel_id_; }
98 // Sets the channel id.
99 void set_id(int channel_id) { channel_id_ = channel_id; }
101 // Returns the state of the channel. Virtual for testing.
102 virtual ReadyState ready_state() const;
104 // Returns the last error that occurred on this channel, or
105 // CHANNEL_ERROR_NONE if no error has occurred. Virtual for testing.
106 virtual ChannelError error_state() const;
108 // Connects the channel to the peer. If successful, the channel will be in
109 // READY_STATE_OPEN. DO NOT delete the CastSocket object in |callback|.
110 // Instead use Close().
111 virtual void Connect(const net::CompletionCallback& callback);
113 // Sends a message over a connected channel. The channel must be in
114 // READY_STATE_OPEN.
116 // Note that if an error occurs the following happens:
117 // 1. Completion callbacks for all pending writes are invoked with error.
118 // 2. Delegate::OnError is called once.
119 // 3. CastSocket is closed.
121 // DO NOT delete the CastSocket object in |callback|. Instead use Close().
122 virtual void SendMessage(const MessageInfo& message,
123 const net::CompletionCallback& callback);
125 // Closes the channel if not already closed. On completion, the channel will
126 // be in READY_STATE_CLOSED.
128 // It is fine to delete the CastSocket object in |callback|.
129 virtual void Close(const net::CompletionCallback& callback);
131 private:
132 friend class ApiResourceManager<CastSocket>;
133 friend class CastSocketTest;
134 friend class TestCastSocket;
136 static const char* service_name() { return "CastSocketManager"; }
138 // Creates an instance of TCPClientSocket.
139 virtual scoped_ptr<net::TCPClientSocket> CreateTcpSocket();
140 // Creates an instance of SSLClientSocket with the given underlying |socket|.
141 virtual scoped_ptr<net::SSLClientSocket> CreateSslSocket(
142 scoped_ptr<net::StreamSocket> socket);
143 // Extracts peer certificate from SSLClientSocket instance when the socket
144 // is in cert error state.
145 // Returns whether certificate is successfully extracted.
146 virtual bool ExtractPeerCert(std::string* cert);
147 // Verifies whether the challenge reply received from the peer is valid:
148 // 1. Signature in the reply is valid.
149 // 2. Certificate is rooted to a trusted CA.
150 virtual bool VerifyChallengeReply();
152 // Invoked by a cancelable closure when connection setup time
153 // exceeds the interval specified at |connect_timeout|.
154 void OnConnectTimeout();
156 /////////////////////////////////////////////////////////////////////////////
157 // Following methods work together to implement the following flow:
158 // 1. Create a new TCP socket and connect to it
159 // 2. Create a new SSL socket and try connecting to it
160 // 3. If connection fails due to invalid cert authority, then extract the
161 // peer certificate from the error.
162 // 4. Whitelist the peer certificate and try #1 and #2 again.
163 // 5. If SSL socket is connected successfully, and if protocol is casts://
164 // then issue an auth challenge request.
165 // 6. Validate the auth challenge response.
167 // Main method that performs connection state transitions.
168 void DoConnectLoop(int result);
169 // Each of the below Do* method is executed in the corresponding
170 // connection state. For example when connection state is TCP_CONNECT
171 // DoTcpConnect is called, and so on.
172 int DoTcpConnect();
173 int DoTcpConnectComplete(int result);
174 int DoSslConnect();
175 int DoSslConnectComplete(int result);
176 int DoAuthChallengeSend();
177 int DoAuthChallengeSendComplete(int result);
178 void DoAuthChallengeSendWriteComplete(int result);
179 int DoAuthChallengeReplyComplete(int result);
180 /////////////////////////////////////////////////////////////////////////////
182 /////////////////////////////////////////////////////////////////////////////
183 // Following methods work together to implement write flow.
185 // Main method that performs write flow state transitions.
186 void DoWriteLoop(int result);
187 // Each of the below Do* method is executed in the corresponding
188 // write state. For example when write state is WRITE_STATE_WRITE_COMPLETE
189 // DowriteComplete is called, and so on.
190 int DoWrite();
191 int DoWriteComplete(int result);
192 int DoWriteCallback();
193 int DoWriteError(int result);
194 /////////////////////////////////////////////////////////////////////////////
196 /////////////////////////////////////////////////////////////////////////////
197 // Following methods work together to implement read flow.
199 // Main method that performs write flow state transitions.
200 void DoReadLoop(int result);
201 // Each of the below Do* method is executed in the corresponding
202 // write state. For example when write state is READ_STATE_READ_COMPLETE
203 // DoReadComplete is called, and so on.
204 int DoRead();
205 int DoReadComplete(int result);
206 int DoReadCallback();
207 int DoReadError(int result);
208 /////////////////////////////////////////////////////////////////////////////
210 // Runs the external connection callback and resets it.
211 void DoConnectCallback(int result);
212 // Adds |message| to the write queue and starts the write loop if needed.
213 void SendCastMessageInternal(const CastMessage& message,
214 const net::CompletionCallback& callback);
215 void PostTaskToStartConnectLoop(int result);
216 void PostTaskToStartReadLoop();
217 void StartReadLoop();
218 // Closes socket, signaling the delegate that |error| has occurred.
219 void CloseWithError();
220 // Frees resources and cancels pending callbacks. |ready_state_| will be set
221 // READY_STATE_CLOSED on completion. A no-op if |ready_state_| is already
222 // READY_STATE_CLOSED.
223 void CloseInternal();
224 // Runs pending callbacks that are passed into us to notify API clients that
225 // pending operations will fail because the socket has been closed.
226 void RunPendingCallbacksOnClose();
227 // Serializes the content of message_proto (with a header) to |message_data|.
228 static bool Serialize(const CastMessage& message_proto,
229 std::string* message_data);
231 virtual bool CalledOnValidThread() const;
233 virtual base::Timer* GetTimer();
235 void SetConnectState(proto::ConnectionState connect_state);
236 void SetReadyState(ReadyState ready_state);
237 void SetErrorState(ChannelError error_state);
238 void SetReadState(proto::ReadState read_state);
239 void SetWriteState(proto::WriteState write_state);
241 base::ThreadChecker thread_checker_;
243 // The id of the channel.
244 int channel_id_;
246 // The IP endpoint that the the channel is connected to.
247 net::IPEndPoint ip_endpoint_;
248 // Receiver authentication requested for the channel.
249 ChannelAuthType channel_auth_;
250 // Delegate to inform of incoming messages and errors.
251 Delegate* delegate_;
253 // IOBuffer for reading the message header.
254 scoped_refptr<net::GrowableIOBuffer> read_buffer_;
255 scoped_ptr<MessageFramer> framer_;
257 // The NetLog for this service.
258 net::NetLog* net_log_;
259 // The NetLog source for this service.
260 net::NetLog::Source net_log_source_;
262 // Logger used to track multiple CastSockets. Does NOT own this object.
263 scoped_refptr<Logger> logger_;
265 // CertVerifier is owned by us but should be deleted AFTER SSLClientSocket
266 // since in some cases the destructor of SSLClientSocket may call a method
267 // to cancel a cert verification request.
268 scoped_ptr<net::CertVerifier> cert_verifier_;
269 scoped_ptr<net::TransportSecurityState> transport_security_state_;
271 // Owned ptr to the underlying TCP socket.
272 scoped_ptr<net::TCPClientSocket> tcp_socket_;
273 // Owned ptr to the underlying SSL socket.
274 scoped_ptr<net::SSLClientSocket> socket_;
275 // Certificate of the peer. This field may be empty if the peer
276 // certificate is not yet fetched.
277 std::string peer_cert_;
278 // Reply received from the receiver to a challenge request.
279 scoped_ptr<CastMessage> challenge_reply_;
281 // Callback invoked when the socket is connected or fails to connect.
282 net::CompletionCallback connect_callback_;
284 // Callback invoked by |connect_timeout_timer_| to cancel the connection.
285 base::CancelableClosure connect_timeout_callback_;
286 // Duration to wait before timing out.
287 base::TimeDelta connect_timeout_;
288 // Timer invoked when the connection has timed out.
289 scoped_ptr<base::Timer> connect_timeout_timer_;
290 // Set when a timeout is triggered and the connection process has
291 // canceled.
292 bool is_canceled_;
294 scoped_ptr<CastMessage> current_message_;
296 // Connection flow state machine state.
297 proto::ConnectionState connect_state_;
298 // Write flow state machine state.
299 proto::WriteState write_state_;
300 // Read flow state machine state.
301 proto::ReadState read_state_;
302 // The last error encountered by the channel.
303 ChannelError error_state_;
304 // The current status of the channel.
305 ReadyState ready_state_;
307 // Task invoked to (re)start the connect loop. Canceled on entry to the
308 // connect loop.
309 base::CancelableClosure connect_loop_callback_;
310 // Task invoked to send the auth challenge. Canceled when the auth challenge
311 // has been sent.
312 base::CancelableClosure send_auth_challenge_callback_;
313 // Callback invoked to (re)start the read loop. Canceled on entry to the read
314 // loop.
315 base::CancelableClosure read_loop_callback_;
317 // Holds a message to be written to the socket. |callback| is invoked when the
318 // message is fully written or an error occurrs.
319 struct WriteRequest {
320 explicit WriteRequest(const net::CompletionCallback& callback);
321 ~WriteRequest();
322 // Sets the content of the request by serializing |message| into |io_buffer|
323 // and prepending the header. Must only be called once.
324 bool SetContent(const CastMessage& message_proto);
326 net::CompletionCallback callback;
327 std::string message_namespace;
328 scoped_refptr<net::DrainableIOBuffer> io_buffer;
330 // Queue of pending writes. The message at the front of the queue is the one
331 // being written.
332 std::queue<WriteRequest> write_queue_;
334 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestFullSecureConnectionFlowAsync);
335 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestRead);
336 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestReadHeaderParseError);
337 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestReadMany);
338 FRIEND_TEST_ALL_PREFIXES(CastSocketTest, TestWriteErrorLargeMessage);
339 DISALLOW_COPY_AND_ASSIGN(CastSocket);
341 } // namespace cast_channel
342 } // namespace core_api
343 } // namespace extensions
345 #endif // EXTENSIONS_BROWSER_API_CAST_CHANNEL_CAST_SOCKET_H_