OLD | NEW |
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 "chrome/browser/ui/webui/certificate_viewer_webui.h" | 5 #include "chrome/browser/ui/webui/certificate_viewer_webui.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 } | 284 } |
285 | 285 |
286 void CertificateViewerDialogHandler::RequestCertificateFields( | 286 void CertificateViewerDialogHandler::RequestCertificateFields( |
287 const base::ListValue* args) { | 287 const base::ListValue* args) { |
288 int cert_index = GetCertificateIndex(args); | 288 int cert_index = GetCertificateIndex(args); |
289 if (cert_index < 0) | 289 if (cert_index < 0) |
290 return; | 290 return; |
291 | 291 |
292 net::X509Certificate::OSCertHandle cert = cert_chain_[cert_index]; | 292 net::X509Certificate::OSCertHandle cert = cert_chain_[cert_index]; |
293 | 293 |
| 294 base::ListValue root_list; |
| 295 base::DictionaryValue* node_details; |
| 296 base::DictionaryValue* alt_node_details; |
| 297 base::ListValue* cert_sub_fields; |
| 298 root_list.Append( |
| 299 base::WrapUnique(node_details = new base::DictionaryValue())); |
| 300 node_details->SetString("label", x509_certificate_model::GetTitle(cert)); |
| 301 |
| 302 base::ListValue* cert_fields; |
| 303 node_details->Set("children", cert_fields = new base::ListValue()); |
| 304 cert_fields->Append( |
| 305 base::WrapUnique(node_details = new base::DictionaryValue())); |
| 306 |
| 307 node_details->SetString("label", |
| 308 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_CERTIFICATE)); |
| 309 node_details->Set("children", cert_fields = new base::ListValue()); |
| 310 |
294 // Main certificate fields. | 311 // Main certificate fields. |
295 auto cert_fields = base::MakeUnique<base::ListValue>(); | 312 cert_fields->Append( |
296 auto node_details = base::MakeUnique<base::DictionaryValue>(); | 313 base::WrapUnique(node_details = new base::DictionaryValue())); |
297 node_details->SetString("label", | 314 node_details->SetString("label", |
298 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_VERSION)); | 315 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_VERSION)); |
299 std::string version = x509_certificate_model::GetVersion(cert); | 316 std::string version = x509_certificate_model::GetVersion(cert); |
300 if (!version.empty()) { | 317 if (!version.empty()) |
301 node_details->SetString("payload.val", | 318 node_details->SetString("payload.val", |
302 l10n_util::GetStringFUTF8(IDS_CERT_DETAILS_VERSION_FORMAT, | 319 l10n_util::GetStringFUTF8(IDS_CERT_DETAILS_VERSION_FORMAT, |
303 base::UTF8ToUTF16(version))); | 320 base::UTF8ToUTF16(version))); |
304 } | |
305 cert_fields->Append(std::move(node_details)); | |
306 | 321 |
307 node_details = base::MakeUnique<base::DictionaryValue>(); | 322 cert_fields->Append( |
| 323 base::WrapUnique(node_details = new base::DictionaryValue())); |
308 node_details->SetString("label", | 324 node_details->SetString("label", |
309 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_SERIAL_NUMBER)); | 325 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_SERIAL_NUMBER)); |
310 node_details->SetString("payload.val", | 326 node_details->SetString("payload.val", |
311 x509_certificate_model::GetSerialNumberHexified(cert, | 327 x509_certificate_model::GetSerialNumberHexified(cert, |
312 l10n_util::GetStringUTF8(IDS_CERT_INFO_FIELD_NOT_PRESENT))); | 328 l10n_util::GetStringUTF8(IDS_CERT_INFO_FIELD_NOT_PRESENT))); |
313 cert_fields->Append(std::move(node_details)); | |
314 | 329 |
315 node_details = base::MakeUnique<base::DictionaryValue>(); | 330 cert_fields->Append( |
| 331 base::WrapUnique(node_details = new base::DictionaryValue())); |
316 node_details->SetString("label", | 332 node_details->SetString("label", |
317 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_CERTIFICATE_SIG_ALG)); | 333 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_CERTIFICATE_SIG_ALG)); |
318 node_details->SetString("payload.val", | 334 node_details->SetString("payload.val", |
319 x509_certificate_model::ProcessSecAlgorithmSignature(cert)); | 335 x509_certificate_model::ProcessSecAlgorithmSignature(cert)); |
320 cert_fields->Append(std::move(node_details)); | |
321 | 336 |
322 node_details = base::MakeUnique<base::DictionaryValue>(); | 337 cert_fields->Append( |
| 338 base::WrapUnique(node_details = new base::DictionaryValue())); |
323 node_details->SetString("label", | 339 node_details->SetString("label", |
324 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_ISSUER)); | 340 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_ISSUER)); |
325 node_details->SetString("payload.val", | 341 node_details->SetString("payload.val", |
326 x509_certificate_model::GetIssuerName(cert)); | 342 x509_certificate_model::GetIssuerName(cert)); |
327 cert_fields->Append(std::move(node_details)); | |
328 | 343 |
329 // Validity period. | 344 // Validity period. |
330 auto cert_sub_fields = base::MakeUnique<base::ListValue>(); | 345 cert_fields->Append( |
| 346 base::WrapUnique(node_details = new base::DictionaryValue())); |
| 347 node_details->SetString("label", |
| 348 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_VALIDITY)); |
331 | 349 |
332 auto sub_node_details = base::MakeUnique<base::DictionaryValue>(); | 350 node_details->Set("children", cert_sub_fields = new base::ListValue()); |
333 sub_node_details->SetString( | 351 cert_sub_fields->Append( |
334 "label", l10n_util::GetStringUTF8(IDS_CERT_DETAILS_NOT_BEFORE)); | 352 base::WrapUnique(node_details = new base::DictionaryValue())); |
335 | 353 node_details->SetString("label", |
336 auto alt_node_details = base::MakeUnique<base::DictionaryValue>(); | 354 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_NOT_BEFORE)); |
| 355 cert_sub_fields->Append( |
| 356 base::WrapUnique(alt_node_details = new base::DictionaryValue())); |
337 alt_node_details->SetString("label", | 357 alt_node_details->SetString("label", |
338 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_NOT_AFTER)); | 358 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_NOT_AFTER)); |
339 | |
340 base::Time issued, expires; | 359 base::Time issued, expires; |
341 if (x509_certificate_model::GetTimes(cert, &issued, &expires)) { | 360 if (x509_certificate_model::GetTimes(cert, &issued, &expires)) { |
342 sub_node_details->SetString( | 361 node_details->SetString( |
343 "payload.val", | 362 "payload.val", |
344 base::UTF16ToUTF8( | 363 base::UTF16ToUTF8( |
345 base::TimeFormatShortDateAndTimeWithTimeZone(issued))); | 364 base::TimeFormatShortDateAndTimeWithTimeZone(issued))); |
346 alt_node_details->SetString( | 365 alt_node_details->SetString( |
347 "payload.val", | 366 "payload.val", |
348 base::UTF16ToUTF8( | 367 base::UTF16ToUTF8( |
349 base::TimeFormatShortDateAndTimeWithTimeZone(expires))); | 368 base::TimeFormatShortDateAndTimeWithTimeZone(expires))); |
350 } | 369 } |
351 cert_sub_fields->Append(std::move(sub_node_details)); | |
352 cert_sub_fields->Append(std::move(alt_node_details)); | |
353 | 370 |
354 node_details = base::MakeUnique<base::DictionaryValue>(); | 371 cert_fields->Append( |
355 node_details->SetString("label", | 372 base::WrapUnique(node_details = new base::DictionaryValue())); |
356 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_VALIDITY)); | |
357 node_details->Set("children", std::move(cert_sub_fields)); | |
358 cert_fields->Append(std::move(node_details)); | |
359 | |
360 node_details = base::MakeUnique<base::DictionaryValue>(); | |
361 node_details->SetString("label", | 373 node_details->SetString("label", |
362 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_SUBJECT)); | 374 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_SUBJECT)); |
363 node_details->SetString("payload.val", | 375 node_details->SetString("payload.val", |
364 x509_certificate_model::GetSubjectName(cert)); | 376 x509_certificate_model::GetSubjectName(cert)); |
365 cert_fields->Append(std::move(node_details)); | |
366 | 377 |
367 // Subject key information. | 378 // Subject key information. |
368 cert_sub_fields = base::MakeUnique<base::ListValue>(); | 379 cert_fields->Append( |
| 380 base::WrapUnique(node_details = new base::DictionaryValue())); |
| 381 node_details->SetString("label", |
| 382 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_SUBJECT_KEY_INFO)); |
369 | 383 |
370 sub_node_details = base::MakeUnique<base::DictionaryValue>(); | 384 node_details->Set("children", cert_sub_fields = new base::ListValue()); |
371 sub_node_details->SetString( | 385 cert_sub_fields->Append( |
372 "label", l10n_util::GetStringUTF8(IDS_CERT_DETAILS_SUBJECT_KEY_ALG)); | 386 base::WrapUnique(node_details = new base::DictionaryValue())); |
373 sub_node_details->SetString( | 387 node_details->SetString("label", |
374 "payload.val", | 388 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_SUBJECT_KEY_ALG)); |
| 389 node_details->SetString("payload.val", |
375 x509_certificate_model::ProcessSecAlgorithmSubjectPublicKey(cert)); | 390 x509_certificate_model::ProcessSecAlgorithmSubjectPublicKey(cert)); |
376 cert_sub_fields->Append(std::move(sub_node_details)); | 391 cert_sub_fields->Append( |
377 | 392 base::WrapUnique(node_details = new base::DictionaryValue())); |
378 sub_node_details = base::MakeUnique<base::DictionaryValue>(); | 393 node_details->SetString("label", |
379 sub_node_details->SetString( | 394 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_SUBJECT_KEY)); |
380 "label", l10n_util::GetStringUTF8(IDS_CERT_DETAILS_SUBJECT_KEY)); | 395 node_details->SetString("payload.val", |
381 sub_node_details->SetString( | 396 x509_certificate_model::ProcessSubjectPublicKeyInfo(cert)); |
382 "payload.val", x509_certificate_model::ProcessSubjectPublicKeyInfo(cert)); | |
383 cert_sub_fields->Append(std::move(sub_node_details)); | |
384 | |
385 node_details = base::MakeUnique<base::DictionaryValue>(); | |
386 node_details->SetString( | |
387 "label", l10n_util::GetStringUTF8(IDS_CERT_DETAILS_SUBJECT_KEY_INFO)); | |
388 node_details->Set("children", std::move(cert_sub_fields)); | |
389 cert_fields->Append(std::move(node_details)); | |
390 | 397 |
391 // Extensions. | 398 // Extensions. |
392 x509_certificate_model::Extensions extensions; | 399 x509_certificate_model::Extensions extensions; |
393 x509_certificate_model::GetExtensions( | 400 x509_certificate_model::GetExtensions( |
394 l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_CRITICAL), | 401 l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_CRITICAL), |
395 l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_NON_CRITICAL), | 402 l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_NON_CRITICAL), |
396 cert, &extensions); | 403 cert, &extensions); |
397 | 404 |
398 if (!extensions.empty()) { | 405 if (!extensions.empty()) { |
399 cert_sub_fields = base::MakeUnique<base::ListValue>(); | 406 cert_fields->Append( |
| 407 base::WrapUnique(node_details = new base::DictionaryValue())); |
| 408 node_details->SetString("label", |
| 409 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_EXTENSIONS)); |
400 | 410 |
| 411 node_details->Set("children", cert_sub_fields = new base::ListValue()); |
401 for (x509_certificate_model::Extensions::const_iterator i = | 412 for (x509_certificate_model::Extensions::const_iterator i = |
402 extensions.begin(); i != extensions.end(); ++i) { | 413 extensions.begin(); i != extensions.end(); ++i) { |
403 sub_node_details = base::MakeUnique<base::DictionaryValue>(); | 414 cert_sub_fields->Append( |
404 sub_node_details->SetString("label", i->name); | 415 base::WrapUnique(node_details = new base::DictionaryValue())); |
405 sub_node_details->SetString("payload.val", i->value); | 416 node_details->SetString("label", i->name); |
406 cert_sub_fields->Append(std::move(sub_node_details)); | 417 node_details->SetString("payload.val", i->value); |
407 } | 418 } |
408 | |
409 node_details = base::MakeUnique<base::DictionaryValue>(); | |
410 node_details->SetString( | |
411 "label", l10n_util::GetStringUTF8(IDS_CERT_DETAILS_EXTENSIONS)); | |
412 node_details->Set("children", std::move(cert_sub_fields)); | |
413 cert_fields->Append(std::move(node_details)); | |
414 } | 419 } |
415 | 420 |
416 // Details certificate information. | 421 cert_fields->Append( |
417 node_details = base::MakeUnique<base::DictionaryValue>(); | 422 base::WrapUnique(node_details = new base::DictionaryValue())); |
418 node_details->SetString("label", | 423 node_details->SetString("label", |
419 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_CERTIFICATE_SIG_ALG)); | 424 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_CERTIFICATE_SIG_ALG)); |
420 node_details->SetString("payload.val", | 425 node_details->SetString("payload.val", |
421 x509_certificate_model::ProcessSecAlgorithmSignatureWrap(cert)); | 426 x509_certificate_model::ProcessSecAlgorithmSignatureWrap(cert)); |
422 cert_fields->Append(std::move(node_details)); | |
423 | 427 |
424 node_details = base::MakeUnique<base::DictionaryValue>(); | 428 cert_fields->Append( |
| 429 base::WrapUnique(node_details = new base::DictionaryValue())); |
425 node_details->SetString("label", | 430 node_details->SetString("label", |
426 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_CERTIFICATE_SIG_VALUE)); | 431 l10n_util::GetStringUTF8(IDS_CERT_DETAILS_CERTIFICATE_SIG_VALUE)); |
427 node_details->SetString("payload.val", | 432 node_details->SetString("payload.val", |
428 x509_certificate_model::ProcessRawBitsSignatureWrap(cert)); | 433 x509_certificate_model::ProcessRawBitsSignatureWrap(cert)); |
429 cert_fields->Append(std::move(node_details)); | |
430 | 434 |
431 // Fingerprint information. | 435 cert_fields->Append( |
432 cert_sub_fields = base::MakeUnique<base::ListValue>(); | 436 base::WrapUnique(node_details = new base::DictionaryValue())); |
| 437 node_details->SetString("label", |
| 438 l10n_util::GetStringUTF8(IDS_CERT_INFO_FINGERPRINTS_GROUP)); |
| 439 node_details->Set("children", cert_sub_fields = new base::ListValue()); |
433 | 440 |
434 sub_node_details = base::MakeUnique<base::DictionaryValue>(); | 441 cert_sub_fields->Append( |
435 sub_node_details->SetString( | 442 base::WrapUnique(node_details = new base::DictionaryValue())); |
436 "label", | 443 node_details->SetString("label", |
437 l10n_util::GetStringUTF8(IDS_CERT_INFO_SHA256_FINGERPRINT_LABEL)); | 444 l10n_util::GetStringUTF8(IDS_CERT_INFO_SHA256_FINGERPRINT_LABEL)); |
438 sub_node_details->SetString("payload.val", | 445 node_details->SetString("payload.val", |
439 x509_certificate_model::HashCertSHA256(cert)); | 446 x509_certificate_model::HashCertSHA256(cert)); |
440 cert_sub_fields->Append(std::move(sub_node_details)); | 447 cert_sub_fields->Append( |
441 | 448 base::WrapUnique(node_details = new base::DictionaryValue())); |
442 sub_node_details = base::MakeUnique<base::DictionaryValue>(); | 449 node_details->SetString("label", |
443 sub_node_details->SetString( | 450 l10n_util::GetStringUTF8(IDS_CERT_INFO_SHA1_FINGERPRINT_LABEL)); |
444 "label", l10n_util::GetStringUTF8(IDS_CERT_INFO_SHA1_FINGERPRINT_LABEL)); | 451 node_details->SetString("payload.val", |
445 sub_node_details->SetString("payload.val", | 452 x509_certificate_model::HashCertSHA1(cert)); |
446 x509_certificate_model::HashCertSHA1(cert)); | |
447 cert_sub_fields->Append(std::move(sub_node_details)); | |
448 | |
449 node_details = base::MakeUnique<base::DictionaryValue>(); | |
450 node_details->SetString( | |
451 "label", l10n_util::GetStringUTF8(IDS_CERT_INFO_FINGERPRINTS_GROUP)); | |
452 node_details->Set("children", std::move(cert_sub_fields)); | |
453 cert_fields->Append(std::move(node_details)); | |
454 | |
455 // Certificate information. | |
456 node_details = base::MakeUnique<base::DictionaryValue>(); | |
457 node_details->SetString( | |
458 "label", l10n_util::GetStringUTF8(IDS_CERT_DETAILS_CERTIFICATE)); | |
459 node_details->Set("children", std::move(cert_fields)); | |
460 cert_fields = base::MakeUnique<base::ListValue>(); | |
461 cert_fields->Append(std::move(node_details)); | |
462 | |
463 // Top level information. | |
464 base::ListValue root_list; | |
465 node_details = base::MakeUnique<base::DictionaryValue>(); | |
466 node_details->SetString("label", x509_certificate_model::GetTitle(cert)); | |
467 node_details->Set("children", std::move(cert_fields)); | |
468 root_list.Append(std::move(node_details)); | |
469 | 453 |
470 // Send certificate information to javascript. | 454 // Send certificate information to javascript. |
471 web_ui()->CallJavascriptFunctionUnsafe("cert_viewer.getCertificateFields", | 455 web_ui()->CallJavascriptFunctionUnsafe("cert_viewer.getCertificateFields", |
472 root_list); | 456 root_list); |
473 } | 457 } |
474 | 458 |
475 int CertificateViewerDialogHandler::GetCertificateIndex( | 459 int CertificateViewerDialogHandler::GetCertificateIndex( |
476 const base::ListValue* args) const { | 460 const base::ListValue* args) const { |
477 int cert_index; | 461 int cert_index; |
478 double val; | 462 double val; |
479 if (!(args->GetDouble(0, &val))) | 463 if (!(args->GetDouble(0, &val))) |
480 return -1; | 464 return -1; |
481 cert_index = static_cast<int>(val); | 465 cert_index = static_cast<int>(val); |
482 if (cert_index < 0 || cert_index >= static_cast<int>(cert_chain_.size())) | 466 if (cert_index < 0 || cert_index >= static_cast<int>(cert_chain_.size())) |
483 return -1; | 467 return -1; |
484 return cert_index; | 468 return cert_index; |
485 } | 469 } |
OLD | NEW |