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

Side by Side Diff: runtime/bin/secure_socket.cc

Issue 22303002: Auto create ApiLocalScope before calling native functions, this ensures that (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 4 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 Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "bin/secure_socket.h" 5 #include "bin/secure_socket.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #include <sys/stat.h> 9 #include <sys/stat.h>
10 #include <stdio.h> 10 #include <stdio.h>
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0)); 99 Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0));
100 ASSERT(Dart_IsInstance(dart_this)); 100 ASSERT(Dart_IsInstance(dart_this));
101 ThrowIfError(Dart_SetNativeInstanceField( 101 ThrowIfError(Dart_SetNativeInstanceField(
102 dart_this, 102 dart_this,
103 kSSLFilterNativeFieldIndex, 103 kSSLFilterNativeFieldIndex,
104 reinterpret_cast<intptr_t>(filter))); 104 reinterpret_cast<intptr_t>(filter)));
105 } 105 }
106 106
107 107
108 void FUNCTION_NAME(SecureSocket_Init)(Dart_NativeArguments args) { 108 void FUNCTION_NAME(SecureSocket_Init)(Dart_NativeArguments args) {
109 Dart_EnterScope();
110 Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0)); 109 Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0));
111 SSLFilter* filter = new SSLFilter; 110 SSLFilter* filter = new SSLFilter;
112 SetFilter(args, filter); 111 SetFilter(args, filter);
113 filter->Init(dart_this); 112 filter->Init(dart_this);
114 Dart_ExitScope();
115 } 113 }
116 114
117 115
118 void FUNCTION_NAME(SecureSocket_Connect)(Dart_NativeArguments args) { 116 void FUNCTION_NAME(SecureSocket_Connect)(Dart_NativeArguments args) {
119 Dart_EnterScope();
120 Dart_Handle host_name_object = ThrowIfError(Dart_GetNativeArgument(args, 1)); 117 Dart_Handle host_name_object = ThrowIfError(Dart_GetNativeArgument(args, 1));
121 Dart_Handle host_sockaddr_storage_object = 118 Dart_Handle host_sockaddr_storage_object =
122 ThrowIfError(Dart_GetNativeArgument(args, 2)); 119 ThrowIfError(Dart_GetNativeArgument(args, 2));
123 Dart_Handle port_object = ThrowIfError(Dart_GetNativeArgument(args, 3)); 120 Dart_Handle port_object = ThrowIfError(Dart_GetNativeArgument(args, 3));
124 bool is_server = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4)); 121 bool is_server = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4));
125 Dart_Handle certificate_name_object = 122 Dart_Handle certificate_name_object =
126 ThrowIfError(Dart_GetNativeArgument(args, 5)); 123 ThrowIfError(Dart_GetNativeArgument(args, 5));
127 bool request_client_certificate = 124 bool request_client_certificate =
128 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 6)); 125 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 6));
129 bool require_client_certificate = 126 bool require_client_certificate =
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 ASSERT(!is_server || certificate_name != NULL); 158 ASSERT(!is_server || certificate_name != NULL);
162 159
163 GetFilter(args)->Connect(host_name, 160 GetFilter(args)->Connect(host_name,
164 &raw_addr, 161 &raw_addr,
165 static_cast<int>(port), 162 static_cast<int>(port),
166 is_server, 163 is_server,
167 certificate_name, 164 certificate_name,
168 request_client_certificate, 165 request_client_certificate,
169 require_client_certificate, 166 require_client_certificate,
170 send_client_certificate); 167 send_client_certificate);
171 Dart_ExitScope();
172 } 168 }
173 169
174 170
175 void FUNCTION_NAME(SecureSocket_Destroy)(Dart_NativeArguments args) { 171 void FUNCTION_NAME(SecureSocket_Destroy)(Dart_NativeArguments args) {
176 Dart_EnterScope();
177 SSLFilter* filter = GetFilter(args); 172 SSLFilter* filter = GetFilter(args);
178 SetFilter(args, NULL); 173 SetFilter(args, NULL);
179 filter->Destroy(); 174 filter->Destroy();
180 delete filter; 175 delete filter;
181 Dart_ExitScope();
182 } 176 }
183 177
184 178
185 void FUNCTION_NAME(SecureSocket_Handshake)(Dart_NativeArguments args) { 179 void FUNCTION_NAME(SecureSocket_Handshake)(Dart_NativeArguments args) {
186 Dart_EnterScope();
187 GetFilter(args)->Handshake(); 180 GetFilter(args)->Handshake();
188 Dart_ExitScope();
189 } 181 }
190 182
191 183
192 void FUNCTION_NAME(SecureSocket_Renegotiate)(Dart_NativeArguments args) { 184 void FUNCTION_NAME(SecureSocket_Renegotiate)(Dart_NativeArguments args) {
193 Dart_EnterScope();
194 bool use_session_cache = 185 bool use_session_cache =
195 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 1)); 186 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 1));
196 bool request_client_certificate = 187 bool request_client_certificate =
197 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 2)); 188 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 2));
198 bool require_client_certificate = 189 bool require_client_certificate =
199 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)); 190 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3));
200 GetFilter(args)->Renegotiate(use_session_cache, 191 GetFilter(args)->Renegotiate(use_session_cache,
201 request_client_certificate, 192 request_client_certificate,
202 require_client_certificate); 193 require_client_certificate);
203 Dart_ExitScope();
204 } 194 }
205 195
206 196
207 void FUNCTION_NAME(SecureSocket_RegisterHandshakeCompleteCallback)( 197 void FUNCTION_NAME(SecureSocket_RegisterHandshakeCompleteCallback)(
208 Dart_NativeArguments args) { 198 Dart_NativeArguments args) {
209 Dart_EnterScope();
210 Dart_Handle handshake_complete = 199 Dart_Handle handshake_complete =
211 ThrowIfError(Dart_GetNativeArgument(args, 1)); 200 ThrowIfError(Dart_GetNativeArgument(args, 1));
212 if (!Dart_IsClosure(handshake_complete)) { 201 if (!Dart_IsClosure(handshake_complete)) {
213 Dart_ThrowException(DartUtils::NewDartArgumentError( 202 Dart_ThrowException(DartUtils::NewDartArgumentError(
214 "Illegal argument to RegisterHandshakeCompleteCallback")); 203 "Illegal argument to RegisterHandshakeCompleteCallback"));
215 } 204 }
216 GetFilter(args)->RegisterHandshakeCompleteCallback(handshake_complete); 205 GetFilter(args)->RegisterHandshakeCompleteCallback(handshake_complete);
217 Dart_ExitScope();
218 } 206 }
219 207
220 208
221 void FUNCTION_NAME(SecureSocket_RegisterBadCertificateCallback)( 209 void FUNCTION_NAME(SecureSocket_RegisterBadCertificateCallback)(
222 Dart_NativeArguments args) { 210 Dart_NativeArguments args) {
223 Dart_EnterScope();
224 Dart_Handle callback = 211 Dart_Handle callback =
225 ThrowIfError(Dart_GetNativeArgument(args, 1)); 212 ThrowIfError(Dart_GetNativeArgument(args, 1));
226 if (!Dart_IsClosure(callback) && !Dart_IsNull(callback)) { 213 if (!Dart_IsClosure(callback) && !Dart_IsNull(callback)) {
227 Dart_ThrowException(DartUtils::NewDartArgumentError( 214 Dart_ThrowException(DartUtils::NewDartArgumentError(
228 "Illegal argument to RegisterBadCertificateCallback")); 215 "Illegal argument to RegisterBadCertificateCallback"));
229 } 216 }
230 GetFilter(args)->RegisterBadCertificateCallback(callback); 217 GetFilter(args)->RegisterBadCertificateCallback(callback);
231 Dart_ExitScope();
232 } 218 }
233 219
234 220
235 void FUNCTION_NAME(SecureSocket_InitializeLibrary) 221 void FUNCTION_NAME(SecureSocket_InitializeLibrary)
236 (Dart_NativeArguments args) { 222 (Dart_NativeArguments args) {
237 Dart_EnterScope();
238 Dart_Handle certificate_database_object = 223 Dart_Handle certificate_database_object =
239 ThrowIfError(Dart_GetNativeArgument(args, 0)); 224 ThrowIfError(Dart_GetNativeArgument(args, 0));
240 // Check that the type is string, and get the UTF-8 C string value from it. 225 // Check that the type is string, and get the UTF-8 C string value from it.
241 const char* certificate_database = NULL; 226 const char* certificate_database = NULL;
242 if (Dart_IsString(certificate_database_object)) { 227 if (Dart_IsString(certificate_database_object)) {
243 ThrowIfError(Dart_StringToCString(certificate_database_object, 228 ThrowIfError(Dart_StringToCString(certificate_database_object,
244 &certificate_database)); 229 &certificate_database));
245 } else if (!Dart_IsNull(certificate_database_object)) { 230 } else if (!Dart_IsNull(certificate_database_object)) {
246 Dart_ThrowException(DartUtils::NewDartArgumentError( 231 Dart_ThrowException(DartUtils::NewDartArgumentError(
247 "Non-String certificate directory argument to SetCertificateDatabase")); 232 "Non-String certificate directory argument to SetCertificateDatabase"));
(...skipping 19 matching lines...) Expand all
267 // Check that the type is boolean, and get the boolean value from it. 252 // Check that the type is boolean, and get the boolean value from it.
268 bool builtin_roots = true; 253 bool builtin_roots = true;
269 if (Dart_IsBoolean(builtin_roots_object)) { 254 if (Dart_IsBoolean(builtin_roots_object)) {
270 ThrowIfError(Dart_BooleanValue(builtin_roots_object, &builtin_roots)); 255 ThrowIfError(Dart_BooleanValue(builtin_roots_object, &builtin_roots));
271 } else { 256 } else {
272 Dart_ThrowException(DartUtils::NewDartArgumentError( 257 Dart_ThrowException(DartUtils::NewDartArgumentError(
273 "UseBuiltinRoots argument to SetCertificateDatabase is not a bool")); 258 "UseBuiltinRoots argument to SetCertificateDatabase is not a bool"));
274 } 259 }
275 260
276 SSLFilter::InitializeLibrary(certificate_database, password, builtin_roots); 261 SSLFilter::InitializeLibrary(certificate_database, password, builtin_roots);
277 Dart_ExitScope();
278 } 262 }
279 263
280 264
281 static Dart_Handle X509FromCertificate(CERTCertificate* certificate) { 265 static Dart_Handle X509FromCertificate(CERTCertificate* certificate) {
282 PRTime start_validity; 266 PRTime start_validity;
283 PRTime end_validity; 267 PRTime end_validity;
284 SECStatus status = 268 SECStatus status =
285 CERT_GetCertTimes(certificate, &start_validity, &end_validity); 269 CERT_GetCertTimes(certificate, &start_validity, &end_validity);
286 if (status != SECSuccess) { 270 if (status != SECSuccess) {
287 ThrowPRException("CertificateException", 271 ThrowPRException("CertificateException",
(...skipping 23 matching lines...) Expand all
311 Dart_Handle arguments[] = { subject_name_object, 295 Dart_Handle arguments[] = { subject_name_object,
312 issuer_name_object, 296 issuer_name_object,
313 start_validity_date, 297 start_validity_date,
314 end_validity_date }; 298 end_validity_date };
315 return Dart_New(x509_type, Dart_Null(), 4, arguments); 299 return Dart_New(x509_type, Dart_Null(), 4, arguments);
316 } 300 }
317 301
318 302
319 void FUNCTION_NAME(SecureSocket_AddCertificate) 303 void FUNCTION_NAME(SecureSocket_AddCertificate)
320 (Dart_NativeArguments args) { 304 (Dart_NativeArguments args) {
321 Dart_EnterScope();
322 Dart_Handle certificate_object = 305 Dart_Handle certificate_object =
323 ThrowIfError(Dart_GetNativeArgument(args, 0)); 306 ThrowIfError(Dart_GetNativeArgument(args, 0));
324 Dart_Handle trust_object = ThrowIfError(Dart_GetNativeArgument(args, 1)); 307 Dart_Handle trust_object = ThrowIfError(Dart_GetNativeArgument(args, 1));
325 308
326 if (!Dart_IsList(certificate_object) || !Dart_IsString(trust_object)) { 309 if (!Dart_IsList(certificate_object) || !Dart_IsString(trust_object)) {
327 Dart_ThrowException(DartUtils::NewDartArgumentError( 310 Dart_ThrowException(DartUtils::NewDartArgumentError(
328 "Bad argument to SecureSocket.addCertificate")); 311 "Bad argument to SecureSocket.addCertificate"));
329 } 312 }
330 313
331 intptr_t length; 314 intptr_t length;
(...skipping 19 matching lines...) Expand all
351 if (status != SECSuccess) { 334 if (status != SECSuccess) {
352 ThrowPRException("CertificateException", "Trust string cannot be decoded"); 335 ThrowPRException("CertificateException", "Trust string cannot be decoded");
353 } 336 }
354 337
355 status = CERT_ChangeCertTrust(CERT_GetDefaultCertDB(), cert, &trust); 338 status = CERT_ChangeCertTrust(CERT_GetDefaultCertDB(), cert, &trust);
356 if (status != SECSuccess) { 339 if (status != SECSuccess) {
357 ThrowPRException("CertificateException", "Cannot set trust attributes"); 340 ThrowPRException("CertificateException", "Cannot set trust attributes");
358 } 341 }
359 342
360 Dart_SetReturnValue(args, X509FromCertificate(cert)); 343 Dart_SetReturnValue(args, X509FromCertificate(cert));
361 Dart_ExitScope();
362 return; 344 return;
363 } 345 }
364 346
365 347
366 348
367 void FUNCTION_NAME(SecureSocket_PeerCertificate) 349 void FUNCTION_NAME(SecureSocket_PeerCertificate)
368 (Dart_NativeArguments args) { 350 (Dart_NativeArguments args) {
369 Dart_EnterScope();
370 Dart_SetReturnValue(args, GetFilter(args)->PeerCertificate()); 351 Dart_SetReturnValue(args, GetFilter(args)->PeerCertificate());
371 Dart_ExitScope();
372 } 352 }
373 353
374 354
375 void FUNCTION_NAME(SecureSocket_FilterPointer)(Dart_NativeArguments args) { 355 void FUNCTION_NAME(SecureSocket_FilterPointer)(Dart_NativeArguments args) {
376 Dart_EnterScope();
377 intptr_t filter_pointer = reinterpret_cast<intptr_t>(GetFilter(args)); 356 intptr_t filter_pointer = reinterpret_cast<intptr_t>(GetFilter(args));
378 Dart_SetReturnValue(args, Dart_NewInteger(filter_pointer)); 357 Dart_SetReturnValue(args, Dart_NewInteger(filter_pointer));
379 Dart_ExitScope();
380 } 358 }
381 359
382 360
383 /** 361 /**
384 * Pushes data through the SSL filter, reading and writing from circular 362 * Pushes data through the SSL filter, reading and writing from circular
385 * buffers shared with Dart. 363 * buffers shared with Dart.
386 * 364 *
387 * The Dart _SecureFilterImpl class contains 4 ExternalByteArrays used to 365 * The Dart _SecureFilterImpl class contains 4 ExternalByteArrays used to
388 * pass encrypted and plaintext data to and from the C++ SSLFilter object. 366 * pass encrypted and plaintext data to and from the C++ SSLFilter object.
389 * 367 *
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after
1032 return bytes_processed; 1010 return bytes_processed;
1033 } 1011 }
1034 1012
1035 1013
1036 Dart_Port SSLFilter::GetServicePort() { 1014 Dart_Port SSLFilter::GetServicePort() {
1037 return filter_service_.GetServicePort(); 1015 return filter_service_.GetServicePort();
1038 } 1016 }
1039 1017
1040 1018
1041 void FUNCTION_NAME(SecureSocket_NewServicePort)(Dart_NativeArguments args) { 1019 void FUNCTION_NAME(SecureSocket_NewServicePort)(Dart_NativeArguments args) {
1042 Dart_EnterScope();
1043 Dart_SetReturnValue(args, Dart_Null()); 1020 Dart_SetReturnValue(args, Dart_Null());
1044 Dart_Port service_port = SSLFilter::GetServicePort(); 1021 Dart_Port service_port = SSLFilter::GetServicePort();
1045 if (service_port != ILLEGAL_PORT) { 1022 if (service_port != ILLEGAL_PORT) {
1046 // Return a send port for the service port. 1023 // Return a send port for the service port.
1047 Dart_Handle send_port = Dart_NewSendPort(service_port); 1024 Dart_Handle send_port = Dart_NewSendPort(service_port);
1048 Dart_SetReturnValue(args, send_port); 1025 Dart_SetReturnValue(args, send_port);
1049 } 1026 }
1050 Dart_ExitScope();
1051 } 1027 }
1052 1028
1053 1029
1054 } // namespace bin 1030 } // namespace bin
1055 } // namespace dart 1031 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698