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

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, 9 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/private/ppb_flash_x509_certificate_shared.h"
18 #include "ppapi/shared_impl/ppapi_globals.h"
19 #include "ppapi/shared_impl/resource_tracker.h"
20 #include "ppapi/shared_impl/var.h"
21 #include "ppapi/thunk/ppb_flash_x509_certificate_api.h"
17 22
18 namespace ppapi { 23 namespace ppapi {
19 24
20 const int32_t TCPSocketPrivateImpl::kMaxReadSize = 1024 * 1024; 25 const int32_t TCPSocketPrivateImpl::kMaxReadSize = 1024 * 1024;
21 const int32_t TCPSocketPrivateImpl::kMaxWriteSize = 1024 * 1024; 26 const int32_t TCPSocketPrivateImpl::kMaxWriteSize = 1024 * 1024;
22 27
23 TCPSocketPrivateImpl::TCPSocketPrivateImpl(PP_Instance instance, 28 TCPSocketPrivateImpl::TCPSocketPrivateImpl(PP_Instance instance,
24 uint32 socket_id) 29 uint32 socket_id)
25 : Resource(OBJECT_IS_IMPL, instance) { 30 : Resource(OBJECT_IS_IMPL, instance),
31 resource_type(OBJECT_IS_IMPL) {
26 Init(socket_id); 32 Init(socket_id);
27 } 33 }
28 34
29 TCPSocketPrivateImpl::TCPSocketPrivateImpl(const HostResource& resource, 35 TCPSocketPrivateImpl::TCPSocketPrivateImpl(const HostResource& resource,
30 uint32 socket_id) 36 uint32 socket_id)
31 : Resource(OBJECT_IS_PROXY, resource) { 37 : Resource(OBJECT_IS_PROXY, resource),
38 resource_type(OBJECT_IS_PROXY) {
32 Init(socket_id); 39 Init(socket_id);
33 } 40 }
34 41
35 TCPSocketPrivateImpl::~TCPSocketPrivateImpl() { 42 TCPSocketPrivateImpl::~TCPSocketPrivateImpl() {
36 } 43 }
37 44
38 thunk::PPB_TCPSocket_Private_API* 45 thunk::PPB_TCPSocket_Private_API*
39 TCPSocketPrivateImpl::AsPPB_TCPSocket_Private_API() { 46 TCPSocketPrivateImpl::AsPPB_TCPSocket_Private_API() {
40 return this; 47 return this;
41 } 48 }
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 if (connection_state_ != CONNECTED) 112 if (connection_state_ != CONNECTED)
106 return PP_ERROR_FAILED; 113 return PP_ERROR_FAILED;
107 if (TrackedCallback::IsPending(ssl_handshake_callback_) || 114 if (TrackedCallback::IsPending(ssl_handshake_callback_) ||
108 TrackedCallback::IsPending(read_callback_) || 115 TrackedCallback::IsPending(read_callback_) ||
109 TrackedCallback::IsPending(write_callback_)) 116 TrackedCallback::IsPending(write_callback_))
110 return PP_ERROR_INPROGRESS; 117 return PP_ERROR_INPROGRESS;
111 118
112 ssl_handshake_callback_ = new TrackedCallback(this, callback); 119 ssl_handshake_callback_ = new TrackedCallback(this, callback);
113 120
114 // Send the request, the browser will call us back via SSLHandshakeACK. 121 // Send the request, the browser will call us back via SSLHandshakeACK.
115 SendSSLHandshake(server_name, server_port); 122 SendSSLHandshake(server_name, server_port,
123 trusted_certificates_, untrusted_certificates_);
116 return PP_OK_COMPLETIONPENDING; 124 return PP_OK_COMPLETIONPENDING;
117 } 125 }
118 126
127 PP_Resource TCPSocketPrivateImpl::GetServerCertificate() {
128 if (!server_certificate_.get())
129 return 0;
130 return server_certificate_->GetReference();
131 }
132
133 PP_Bool TCPSocketPrivateImpl::AddChainBuildingCertificate(
134 PP_Resource certificate,
135 PP_Bool trusted) {
136 // TODO(raymes): The plumbing for this functionality is implemented but the
137 // certificates aren't yet used for the connection, so just return false for
138 // now.
139 return PP_FALSE;
140
141 ppapi::thunk::PPB_Flash_X509Certificate_API* resource =
142 PpapiGlobals::Get()->GetResourceTracker()->
143 GetResource(certificate)->AsPPB_Flash_X509Certificate_API();
144 if (!resource)
145 return PP_FALSE;
146
147 PP_Var der_var = resource->GetField(PP_FLASH_X509CERTIFICATE_RAW);
148 ArrayBufferVar* der_array_buffer = ArrayBufferVar::FromPPVar(der_var);
149 if (!der_array_buffer)
150 return PP_FALSE;
151
152 char* der_bytes = static_cast<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
160 return PP_TRUE;
161 }
162
119 int32_t TCPSocketPrivateImpl::Read(char* buffer, 163 int32_t TCPSocketPrivateImpl::Read(char* buffer,
120 int32_t bytes_to_read, 164 int32_t bytes_to_read,
121 PP_CompletionCallback callback) { 165 PP_CompletionCallback callback) {
122 if (!buffer || bytes_to_read <= 0) 166 if (!buffer || bytes_to_read <= 0)
123 return PP_ERROR_BADARGUMENT; 167 return PP_ERROR_BADARGUMENT;
124 if (!callback.func) 168 if (!callback.func)
125 return PP_ERROR_BLOCKS_MAIN_THREAD; 169 return PP_ERROR_BLOCKS_MAIN_THREAD;
126 170
127 if (!IsConnected()) 171 if (!IsConnected())
128 return PP_ERROR_FAILED; 172 return PP_ERROR_FAILED;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 216
173 SendDisconnect(); 217 SendDisconnect();
174 socket_id_ = 0; 218 socket_id_ = 0;
175 219
176 PostAbortIfNecessary(&connect_callback_); 220 PostAbortIfNecessary(&connect_callback_);
177 PostAbortIfNecessary(&ssl_handshake_callback_); 221 PostAbortIfNecessary(&ssl_handshake_callback_);
178 PostAbortIfNecessary(&read_callback_); 222 PostAbortIfNecessary(&read_callback_);
179 PostAbortIfNecessary(&write_callback_); 223 PostAbortIfNecessary(&write_callback_);
180 read_buffer_ = NULL; 224 read_buffer_ = NULL;
181 bytes_to_read_ = -1; 225 bytes_to_read_ = -1;
226 server_certificate_ = NULL;
182 } 227 }
183 228
184 void TCPSocketPrivateImpl::OnConnectCompleted( 229 void TCPSocketPrivateImpl::OnConnectCompleted(
185 bool succeeded, 230 bool succeeded,
186 const PP_NetAddress_Private& local_addr, 231 const PP_NetAddress_Private& local_addr,
187 const PP_NetAddress_Private& remote_addr) { 232 const PP_NetAddress_Private& remote_addr) {
188 if (connection_state_ != BEFORE_CONNECT || 233 if (connection_state_ != BEFORE_CONNECT ||
189 !TrackedCallback::IsPending(connect_callback_)) { 234 !TrackedCallback::IsPending(connect_callback_)) {
190 NOTREACHED(); 235 NOTREACHED();
191 return; 236 return;
192 } 237 }
193 238
194 if (succeeded) { 239 if (succeeded) {
195 local_addr_ = local_addr; 240 local_addr_ = local_addr;
196 remote_addr_ = remote_addr; 241 remote_addr_ = remote_addr;
197 connection_state_ = CONNECTED; 242 connection_state_ = CONNECTED;
198 } 243 }
199 TrackedCallback::ClearAndRun(&connect_callback_, 244 TrackedCallback::ClearAndRun(&connect_callback_,
200 succeeded ? PP_OK : PP_ERROR_FAILED); 245 succeeded ? PP_OK : PP_ERROR_FAILED);
201 } 246 }
202 247
203 void TCPSocketPrivateImpl::OnSSLHandshakeCompleted(bool succeeded) { 248 void TCPSocketPrivateImpl::OnSSLHandshakeCompleted(
249 bool succeeded,
250 const PPB_X509Certificate_Fields& certificate_fields) {
204 if (connection_state_ != CONNECTED || 251 if (connection_state_ != CONNECTED ||
205 !TrackedCallback::IsPending(ssl_handshake_callback_)) { 252 !TrackedCallback::IsPending(ssl_handshake_callback_)) {
206 NOTREACHED(); 253 NOTREACHED();
207 return; 254 return;
208 } 255 }
209 256
210 if (succeeded) { 257 if (succeeded) {
211 connection_state_ = SSL_CONNECTED; 258 connection_state_ = SSL_CONNECTED;
259 server_certificate_ = new PPB_Flash_X509Certificate_Shared(
260 resource_type,
261 pp_instance(),
262 certificate_fields);
212 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_OK); 263 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_OK);
213 } else { 264 } else {
214 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_ERROR_FAILED); 265 TrackedCallback::ClearAndRun(&ssl_handshake_callback_, PP_ERROR_FAILED);
215 Disconnect(); 266 Disconnect();
216 } 267 }
217 } 268 }
218 269
219 void TCPSocketPrivateImpl::OnReadCompleted(bool succeeded, 270 void TCPSocketPrivateImpl::OnReadCompleted(bool succeeded,
220 const std::string& data) { 271 const std::string& data) {
221 if (!TrackedCallback::IsPending(read_callback_) || !read_buffer_) { 272 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; 320 return connection_state_ == CONNECTED || connection_state_ == SSL_CONNECTED;
270 } 321 }
271 322
272 void TCPSocketPrivateImpl::PostAbortIfNecessary( 323 void TCPSocketPrivateImpl::PostAbortIfNecessary(
273 scoped_refptr<TrackedCallback>* callback) { 324 scoped_refptr<TrackedCallback>* callback) {
274 if (callback->get()) 325 if (callback->get())
275 (*callback)->PostAbort(); 326 (*callback)->PostAbort();
276 } 327 }
277 328
278 } // namespace ppapi 329 } // namespace ppapi
OLDNEW
« no previous file with comments | « ppapi/shared_impl/private/tcp_socket_private_impl.h ('k') | ppapi/thunk/interfaces_ppb_private.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698