OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 "components/safe_browsing/password_protection/password_protection_servi
ce.h" | 5 #include "components/safe_browsing/password_protection/password_protection_servi
ce.h" |
6 | 6 |
| 7 #include "base/base64.h" |
7 #include "base/bind.h" | 8 #include "base/bind.h" |
8 #include "base/callback.h" | 9 #include "base/callback.h" |
9 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
10 #include "base/metrics/field_trial.h" | 11 #include "base/metrics/field_trial.h" |
11 #include "base/metrics/histogram_macros.h" | 12 #include "base/metrics/histogram_macros.h" |
12 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
13 #include "base/strings/string_split.h" | 14 #include "base/strings/string_split.h" |
14 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
15 #include "components/content_settings/core/browser/host_content_settings_map.h" | 16 #include "components/content_settings/core/browser/host_content_settings_map.h" |
16 #include "components/history/core/browser/history_service.h" | 17 #include "components/history/core/browser/history_service.h" |
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 CONTENT_SETTINGS_TYPE_PASSWORD_PROTECTION, base::Time(), | 463 CONTENT_SETTINGS_TYPE_PASSWORD_PROTECTION, base::Time(), |
463 base::Bind(&OriginMatchPrimaryPattern, url_key)); | 464 base::Bind(&OriginMatchPrimaryPattern, url_key)); |
464 } | 465 } |
465 } | 466 } |
466 | 467 |
467 // static | 468 // static |
468 bool PasswordProtectionService::ParseVerdictEntry( | 469 bool PasswordProtectionService::ParseVerdictEntry( |
469 base::DictionaryValue* verdict_entry, | 470 base::DictionaryValue* verdict_entry, |
470 int* out_verdict_received_time, | 471 int* out_verdict_received_time, |
471 LoginReputationClientResponse* out_verdict) { | 472 LoginReputationClientResponse* out_verdict) { |
472 base::Value* binary_value = nullptr; | 473 std::string serialized_verdict_proto; |
473 bool result = verdict_entry && out_verdict && | 474 return verdict_entry && out_verdict && |
474 verdict_entry->GetInteger(kCacheCreationTime, | 475 verdict_entry->GetInteger(kCacheCreationTime, |
475 out_verdict_received_time) && | 476 out_verdict_received_time) && |
476 verdict_entry->Get(kVerdictProto, &binary_value); | 477 verdict_entry->GetString(kVerdictProto, &serialized_verdict_proto) && |
477 if (!result) | 478 base::Base64Decode(serialized_verdict_proto, |
478 return false; | 479 &serialized_verdict_proto) && |
479 DCHECK(result); | 480 out_verdict->ParseFromString(serialized_verdict_proto); |
480 DCHECK_EQ(base::Value::Type::BINARY, binary_value->type()); | |
481 const auto blob = binary_value->GetBlob(); | |
482 const std::string serialized_verdict_proto(blob.begin(), blob.end()); | |
483 return out_verdict->ParseFromString(serialized_verdict_proto); | |
484 } | 481 } |
485 | 482 |
486 bool PasswordProtectionService::PathVariantsMatchCacheExpression( | 483 bool PasswordProtectionService::PathVariantsMatchCacheExpression( |
487 const std::vector<std::string>& generated_paths, | 484 const std::vector<std::string>& generated_paths, |
488 const std::string& cache_expression_path) { | 485 const std::string& cache_expression_path) { |
489 for (const auto& path : generated_paths) { | 486 for (const auto& path : generated_paths) { |
490 if (cache_expression_path == path) | 487 if (cache_expression_path == path) |
491 return true; | 488 return true; |
492 } | 489 } |
493 return false; | 490 return false; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 | 532 |
536 // Convert a LoginReputationClientResponse proto into a DictionaryValue. | 533 // Convert a LoginReputationClientResponse proto into a DictionaryValue. |
537 std::unique_ptr<base::DictionaryValue> | 534 std::unique_ptr<base::DictionaryValue> |
538 PasswordProtectionService::CreateDictionaryFromVerdict( | 535 PasswordProtectionService::CreateDictionaryFromVerdict( |
539 const LoginReputationClientResponse* verdict, | 536 const LoginReputationClientResponse* verdict, |
540 const base::Time& receive_time) { | 537 const base::Time& receive_time) { |
541 std::unique_ptr<base::DictionaryValue> result = | 538 std::unique_ptr<base::DictionaryValue> result = |
542 base::MakeUnique<base::DictionaryValue>(); | 539 base::MakeUnique<base::DictionaryValue>(); |
543 result->SetInteger(kCacheCreationTime, | 540 result->SetInteger(kCacheCreationTime, |
544 static_cast<int>(receive_time.ToDoubleT())); | 541 static_cast<int>(receive_time.ToDoubleT())); |
545 // Because DictionaryValue cannot take non-UTF8 string, we need to store | 542 std::string serialized_proto(verdict->SerializeAsString()); |
546 // serialized proto in its allowed binary format instead. | 543 // Performs a base64 encoding on the serialized proto. |
547 const std::string serialized_proto(verdict->SerializeAsString()); | 544 base::Base64Encode(serialized_proto, &serialized_proto); |
548 const std::vector<char> verdict_blob(serialized_proto.begin(), | 545 result->SetString(kVerdictProto, serialized_proto); |
549 serialized_proto.end()); | |
550 std::unique_ptr<base::Value> binary_value = | |
551 base::MakeUnique<base::Value>(verdict_blob); | |
552 DCHECK_EQ(base::Value::Type::BINARY, binary_value->type()); | |
553 result->Set(kVerdictProto, std::move(binary_value)); | |
554 return result; | 546 return result; |
555 } | 547 } |
556 | 548 |
557 void PasswordProtectionService::RecordPingingDisabledReason( | 549 void PasswordProtectionService::RecordPingingDisabledReason( |
558 const base::Feature& feature, | 550 const base::Feature& feature, |
559 RequestOutcome reason) { | 551 RequestOutcome reason) { |
560 DCHECK(feature.name == kProtectedPasswordEntryPinging.name || | 552 DCHECK(feature.name == kProtectedPasswordEntryPinging.name || |
561 feature.name == kPasswordFieldOnFocusPinging.name); | 553 feature.name == kPasswordFieldOnFocusPinging.name); |
562 | 554 |
563 bool is_password_entry_ping = | 555 bool is_password_entry_ping = |
564 feature.name == kProtectedPasswordEntryPinging.name; | 556 feature.name == kProtectedPasswordEntryPinging.name; |
565 | 557 |
566 if (is_password_entry_ping) { | 558 if (is_password_entry_ping) { |
567 UMA_HISTOGRAM_ENUMERATION(kPasswordEntryRequestOutcomeHistogramName, reason, | 559 UMA_HISTOGRAM_ENUMERATION(kPasswordEntryRequestOutcomeHistogramName, reason, |
568 MAX_OUTCOME); | 560 MAX_OUTCOME); |
569 } else { | 561 } else { |
570 UMA_HISTOGRAM_ENUMERATION(kPasswordOnFocusRequestOutcomeHistogramName, | 562 UMA_HISTOGRAM_ENUMERATION(kPasswordOnFocusRequestOutcomeHistogramName, |
571 reason, MAX_OUTCOME); | 563 reason, MAX_OUTCOME); |
572 } | 564 } |
573 } | 565 } |
574 | 566 |
575 } // namespace safe_browsing | 567 } // namespace safe_browsing |
OLD | NEW |