Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: ppapi/shared_impl/private/tcp_socket_private_impl.cc

Issue 9699100: Add functionality to pppapi TCPSocket to support secure sockets in flash (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ppapi/shared_impl/private/tcp_socket_private_impl.h" 5 #include "ppapi/shared_impl/private/tcp_socket_private_impl.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 10
11 #include "base/basictypes.h" 11 #include "base/basictypes.h"
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/message_loop.h" 14 #include "base/message_loop.h"
15 #include "ppapi/c/pp_completion_callback.h" 15 #include "ppapi/c/pp_completion_callback.h"
16 #include "ppapi/c/pp_errors.h" 16 #include "ppapi/c/pp_errors.h"
17 #include "ppapi/shared_impl/ppapi_globals.h"
18 #include "ppapi/shared_impl/private/ppb_x509_certificate_private_shared.h"
19 #include "ppapi/shared_impl/var_tracker.h"
20 #include "ppapi/shared_impl/var.h"
21 #include "ppapi/thunk/enter.h"
22 #include "ppapi/thunk/ppb_x509_certificate_private_api.h"
17 23
18 namespace ppapi { 24 namespace ppapi {
19 25
20 const int32_t TCPSocketPrivateImpl::kMaxReadSize = 1024 * 1024; 26 const int32_t TCPSocketPrivateImpl::kMaxReadSize = 1024 * 1024;
21 const int32_t TCPSocketPrivateImpl::kMaxWriteSize = 1024 * 1024; 27 const int32_t TCPSocketPrivateImpl::kMaxWriteSize = 1024 * 1024;
22 28
23 TCPSocketPrivateImpl::TCPSocketPrivateImpl(PP_Instance instance, 29 TCPSocketPrivateImpl::TCPSocketPrivateImpl(PP_Instance instance,
24 uint32 socket_id) 30 uint32 socket_id)
25 : Resource(OBJECT_IS_IMPL, instance) { 31 : Resource(OBJECT_IS_IMPL, instance),
32 resource_type_(OBJECT_IS_IMPL) {
26 Init(socket_id); 33 Init(socket_id);
27 } 34 }
28 35
29 TCPSocketPrivateImpl::TCPSocketPrivateImpl(const HostResource& resource, 36 TCPSocketPrivateImpl::TCPSocketPrivateImpl(const HostResource& resource,
30 uint32 socket_id) 37 uint32 socket_id)
31 : Resource(OBJECT_IS_PROXY, resource) { 38 : Resource(OBJECT_IS_PROXY, resource),
39 resource_type_(OBJECT_IS_PROXY) {
32 Init(socket_id); 40 Init(socket_id);
33 } 41 }
34 42
35 TCPSocketPrivateImpl::~TCPSocketPrivateImpl() { 43 TCPSocketPrivateImpl::~TCPSocketPrivateImpl() {
36 } 44 }
37 45
38 thunk::PPB_TCPSocket_Private_API* 46 thunk::PPB_TCPSocket_Private_API*
39 TCPSocketPrivateImpl::AsPPB_TCPSocket_Private_API() { 47 TCPSocketPrivateImpl::AsPPB_TCPSocket_Private_API() {
40 return this; 48 return this;
41 } 49 }
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 if (connection_state_ != CONNECTED) 113 if (connection_state_ != CONNECTED)
106 return PP_ERROR_FAILED; 114 return PP_ERROR_FAILED;
107 if (TrackedCallback::IsPending(ssl_handshake_callback_) || 115 if (TrackedCallback::IsPending(ssl_handshake_callback_) ||
108 TrackedCallback::IsPending(read_callback_) || 116 TrackedCallback::IsPending(read_callback_) ||
109 TrackedCallback::IsPending(write_callback_)) 117 TrackedCallback::IsPending(write_callback_))
110 return PP_ERROR_INPROGRESS; 118 return PP_ERROR_INPROGRESS;
111 119
112 ssl_handshake_callback_ = new TrackedCallback(this, callback); 120 ssl_handshake_callback_ = new TrackedCallback(this, callback);
113 121
114 // Send the request, the browser will call us back via SSLHandshakeACK. 122 // Send the request, the browser will call us back via SSLHandshakeACK.
115 SendSSLHandshake(server_name, server_port); 123 SendSSLHandshake(server_name, server_port, trusted_certificates_,
124 untrusted_certificates_);
116 return PP_OK_COMPLETIONPENDING; 125 return PP_OK_COMPLETIONPENDING;
117 } 126 }
118 127
128 PP_Resource TCPSocketPrivateImpl::GetServerCertificate() {
129 if (!server_certificate_.get())
130 return 0;
131 return server_certificate_->GetReference();
132 }
133
134 PP_Bool TCPSocketPrivateImpl::AddChainBuildingCertificate(
135 PP_Resource certificate,
136 PP_Bool trusted) {
137 // TODO(raymes): The plumbing for this functionality is implemented but the
138 // certificates aren't yet used for the connection, so just return false for
139 // now.
140 return PP_FALSE;
141
142 thunk::EnterResourceNoLock<thunk::PPB_X509Certificate_Private_API>
143 enter_config(certificate, true);
yzshen1 2012/04/09 17:55:42 This is not 'config'. Maybe you could call it ente
raymes 2012/04/09 19:35:50 Done.
144 if (enter_config.failed())
145 return PP_FALSE;
146
147 PP_Var der_var = enter_config.object()->GetField(
148 PP_X509CERTIFICATE_PRIVATE_RAW);
149 ArrayBufferVar* der_array_buffer = ArrayBufferVar::FromPPVar(der_var);
150 PP_Bool success = PP_FALSE;
151 if (der_array_buffer) {
152 const char* der_bytes = static_cast<const char*>(der_array_buffer->Map());
153 uint32_t der_length = der_array_buffer->ByteLength();
154 std::vector<char> der(der_bytes, der_bytes + der_length);
155 if (PP_ToBool(trusted))
156 trusted_certificates_.push_back(der);
157 else
158 untrusted_certificates_.push_back(der);
159 success = PP_TRUE;
160 }
161 PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(der_var);
162 return success;
163 }
164
119 int32_t TCPSocketPrivateImpl::Read(char* buffer, 165 int32_t TCPSocketPrivateImpl::Read(char* buffer,
120 int32_t bytes_to_read, 166 int32_t bytes_to_read,
121 PP_CompletionCallback callback) { 167 PP_CompletionCallback callback) {
122 if (!buffer || bytes_to_read <= 0) 168 if (!buffer || bytes_to_read <= 0)
123 return PP_ERROR_BADARGUMENT; 169 return PP_ERROR_BADARGUMENT;
124 if (!callback.func) 170 if (!callback.func)
125 return PP_ERROR_BLOCKS_MAIN_THREAD; 171 return PP_ERROR_BLOCKS_MAIN_THREAD;
126 172
127 if (!IsConnected()) 173 if (!IsConnected())
128 return PP_ERROR_FAILED; 174 return PP_ERROR_FAILED;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 218
173 SendDisconnect(); 219 SendDisconnect();
174 socket_id_ = 0; 220 socket_id_ = 0;
175 221
176 PostAbortIfNecessary(&connect_callback_); 222 PostAbortIfNecessary(&connect_callback_);
177 PostAbortIfNecessary(&ssl_handshake_callback_); 223 PostAbortIfNecessary(&ssl_handshake_callback_);
178 PostAbortIfNecessary(&read_callback_); 224 PostAbortIfNecessary(&read_callback_);
179 PostAbortIfNecessary(&write_callback_); 225 PostAbortIfNecessary(&write_callback_);
180 read_buffer_ = NULL; 226 read_buffer_ = NULL;
181 bytes_to_read_ = -1; 227 bytes_to_read_ = -1;
228 server_certificate_ = NULL;
182 } 229 }
183 230
184 void TCPSocketPrivateImpl::OnConnectCompleted( 231 void TCPSocketPrivateImpl::OnConnectCompleted(
185 bool succeeded, 232 bool succeeded,
186 const PP_NetAddress_Private& local_addr, 233 const PP_NetAddress_Private& local_addr,
187 const PP_NetAddress_Private& remote_addr) { 234 const PP_NetAddress_Private& remote_addr) {
188 if (connection_state_ != BEFORE_CONNECT || 235 if (connection_state_ != BEFORE_CONNECT ||
189 !TrackedCallback::IsPending(connect_callback_)) { 236 !TrackedCallback::IsPending(connect_callback_)) {
190 NOTREACHED(); 237 NOTREACHED();
191 return; 238 return;
192 } 239 }
193 240
194 if (succeeded) { 241 if (succeeded) {
195 local_addr_ = local_addr; 242 local_addr_ = local_addr;
196 remote_addr_ = remote_addr; 243 remote_addr_ = remote_addr;
197 connection_state_ = CONNECTED; 244 connection_state_ = CONNECTED;
198 } 245 }
199 TrackedCallback::ClearAndRun(&connect_callback_, 246 TrackedCallback::ClearAndRun(&connect_callback_,
200 succeeded ? PP_OK : PP_ERROR_FAILED); 247 succeeded ? PP_OK : PP_ERROR_FAILED);
201 } 248 }
202 249
203 void TCPSocketPrivateImpl::OnSSLHandshakeCompleted(bool succeeded) { 250 void TCPSocketPrivateImpl::OnSSLHandshakeCompleted(
251 bool succeeded,
252 const PPB_X509Certificate_Fields& certificate_fields) {
204 if (connection_state_ != CONNECTED || 253 if (connection_state_ != CONNECTED ||
205 !TrackedCallback::IsPending(ssl_handshake_callback_)) { 254 !TrackedCallback::IsPending(ssl_handshake_callback_)) {
206 NOTREACHED(); 255 NOTREACHED();
207 return; 256 return;
208 } 257 }
209 258
210 if (succeeded) { 259 if (succeeded) {
211 connection_state_ = SSL_CONNECTED; 260 connection_state_ = SSL_CONNECTED;
261 server_certificate_ = new PPB_X509Certificate_Private_Shared(
262 resource_type_,
263 pp_instance(),
264 certificate_fields);
212 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_OK); 265 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_OK);
213 } else { 266 } else {
214 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_ERROR_FAILED); 267 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_ERROR_FAILED);
215 Disconnect(); 268 Disconnect();
216 } 269 }
217 } 270 }
218 271
219 void TCPSocketPrivateImpl::OnReadCompleted(bool succeeded, 272 void TCPSocketPrivateImpl::OnReadCompleted(bool succeeded,
220 const std::string& data) { 273 const std::string& data) {
221 if (!TrackedCallback::IsPending(read_callback_) || !read_buffer_) { 274 if (!TrackedCallback::IsPending(read_callback_) || !read_buffer_) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED; 322 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED;
270 } 323 }
271 324
272 void TCPSocketPrivateImpl::PostAbortIfNecessary( 325 void TCPSocketPrivateImpl::PostAbortIfNecessary(
273 scoped_refptr<TrackedCallback>* callback) { 326 scoped_refptr<TrackedCallback>* callback) {
274 if (callback->get()) 327 if (callback->get())
275 (*callback)->PostAbort(); 328 (*callback)->PostAbort();
276 } 329 }
277 330
278 } // namespace ppapi 331 } // namespace ppapi
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698