// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/safe_browsing/preference_validation_delegate.h" #include #include #include "base/callback.h" #include "base/json/json_writer.h" #include "chrome/browser/prefs/pref_hash_store_transaction.h" #include "chrome/browser/prefs/tracked/tracked_preference_helper.h" #include "chrome/common/safe_browsing/csd.pb.h" namespace safe_browsing { namespace { typedef ClientIncidentReport_IncidentData_TrackedPreferenceIncident TPIncident; typedef ClientIncidentReport_IncidentData_TrackedPreferenceIncident_ValueState TPIncident_ValueState; // Maps a PrefHashStoreTransaction::ValueState to a // TrackedPreferenceIncident::ValueState. TPIncident_ValueState MapValueState( PrefHashStoreTransaction::ValueState value_state) { switch (value_state) { case PrefHashStoreTransaction::CLEARED: return TPIncident::CLEARED; case PrefHashStoreTransaction::WEAK_LEGACY: return TPIncident::WEAK_LEGACY; case PrefHashStoreTransaction::CHANGED: return TPIncident::CHANGED; case PrefHashStoreTransaction::UNTRUSTED_UNKNOWN_VALUE: return TPIncident::UNTRUSTED_UNKNOWN_VALUE; default: return TPIncident::UNKNOWN; } } } // namespace PreferenceValidationDelegate::PreferenceValidationDelegate( const AddIncidentCallback& add_incident) : add_incident_(add_incident) { } PreferenceValidationDelegate::~PreferenceValidationDelegate() { } void PreferenceValidationDelegate::OnAtomicPreferenceValidation( const std::string& pref_path, const base::Value* value, PrefHashStoreTransaction::ValueState value_state, TrackedPreferenceHelper::ResetAction /* reset_action */) { TPIncident_ValueState proto_value_state = MapValueState(value_state); if (proto_value_state != TPIncident::UNKNOWN) { scoped_ptr incident_data( new ClientIncidentReport_IncidentData()); TPIncident* incident = incident_data->mutable_tracked_preference(); incident->set_path(pref_path); if (!value || (!value->GetAsString(incident->mutable_atomic_value()) && !base::JSONWriter::Write(value, incident->mutable_atomic_value()))) { incident->clear_atomic_value(); } incident->set_value_state(proto_value_state); add_incident_.Run(incident_data.Pass()); } } void PreferenceValidationDelegate::OnSplitPreferenceValidation( const std::string& pref_path, const base::DictionaryValue* /* dict_value */, const std::vector& invalid_keys, PrefHashStoreTransaction::ValueState value_state, TrackedPreferenceHelper::ResetAction /* reset_action */) { TPIncident_ValueState proto_value_state = MapValueState(value_state); if (proto_value_state != TPIncident::UNKNOWN) { scoped_ptr incident_data( new ClientIncidentReport_IncidentData()); TPIncident* incident = incident_data->mutable_tracked_preference(); incident->set_path(pref_path); for (std::vector::const_iterator scan(invalid_keys.begin()); scan != invalid_keys.end(); ++scan) { incident->add_split_key(*scan); } incident->set_value_state(proto_value_state); add_incident_.Run(incident_data.Pass()); } } } // namespace safe_browsing