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

Side by Side Diff: chromeos/network/onc/onc_validator.cc

Issue 2151793002: Add base::Value::GetTypeName(). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: win build Created 4 years, 5 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
« no previous file with comments | « base/values.cc ('k') | components/policy/core/browser/configuration_policy_handler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "chromeos/network/onc/onc_validator.h" 5 #include "chromeos/network/onc/onc_validator.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 12 matching lines...) Expand all
23 namespace { 23 namespace {
24 24
25 // According to the IEEE 802.11 standard the SSID is a series of 0 to 32 octets. 25 // According to the IEEE 802.11 standard the SSID is a series of 0 to 32 octets.
26 const int kMaximumSSIDLengthInBytes = 32; 26 const int kMaximumSSIDLengthInBytes = 32;
27 27
28 template <typename T, size_t N> 28 template <typename T, size_t N>
29 std::vector<T> toVector(T const (&array)[N]) { 29 std::vector<T> toVector(T const (&array)[N]) {
30 return std::vector<T>(array, array + N); 30 return std::vector<T>(array, array + N);
31 } 31 }
32 32
33 // Copied from policy/configuration_policy_handler.cc.
34 // TODO(pneubeck): move to a common place like base/.
35 std::string ValueTypeToString(base::Value::Type type) {
36 const char* const strings[] = {"null", "boolean", "integer", "double",
37 "string", "binary", "dictionary", "list"};
38 CHECK(static_cast<size_t>(type) < arraysize(strings));
39 return strings[type];
40 }
41
42 } // namespace 33 } // namespace
43 34
44 Validator::Validator(bool error_on_unknown_field, 35 Validator::Validator(bool error_on_unknown_field,
45 bool error_on_wrong_recommended, 36 bool error_on_wrong_recommended,
46 bool error_on_missing_field, 37 bool error_on_missing_field,
47 bool managed_onc) 38 bool managed_onc)
48 : error_on_unknown_field_(error_on_unknown_field), 39 : error_on_unknown_field_(error_on_unknown_field),
49 error_on_wrong_recommended_(error_on_wrong_recommended), 40 error_on_wrong_recommended_(error_on_wrong_recommended),
50 error_on_missing_field_(error_on_missing_field), 41 error_on_missing_field_(error_on_missing_field),
51 managed_onc_(managed_onc), 42 managed_onc_(managed_onc),
(...skipping 11 matching lines...) Expand all
63 bool error = false; 54 bool error = false;
64 std::unique_ptr<base::Value> result_value = 55 std::unique_ptr<base::Value> result_value =
65 MapValue(*object_signature, onc_object, &error); 56 MapValue(*object_signature, onc_object, &error);
66 if (error) { 57 if (error) {
67 *result = INVALID; 58 *result = INVALID;
68 result_value.reset(); 59 result_value.reset();
69 } else if (error_or_warning_found_) { 60 } else if (error_or_warning_found_) {
70 *result = VALID_WITH_WARNINGS; 61 *result = VALID_WITH_WARNINGS;
71 } 62 }
72 // The return value should be NULL if, and only if, |result| equals INVALID. 63 // The return value should be NULL if, and only if, |result| equals INVALID.
73 DCHECK_EQ(result_value.get() == NULL, *result == INVALID); 64 DCHECK_EQ(!result_value, *result == INVALID);
74 65 return base::DictionaryValue::From(std::move(result_value));
75 base::DictionaryValue* result_dict = NULL;
76 if (result_value) {
77 result_value.release()->GetAsDictionary(&result_dict);
78 CHECK(result_dict);
79 }
80
81 return base::WrapUnique(result_dict);
82 } 66 }
83 67
84 std::unique_ptr<base::Value> Validator::MapValue( 68 std::unique_ptr<base::Value> Validator::MapValue(
85 const OncValueSignature& signature, 69 const OncValueSignature& signature,
86 const base::Value& onc_value, 70 const base::Value& onc_value,
87 bool* error) { 71 bool* error) {
88 if (onc_value.GetType() != signature.onc_type) { 72 if (onc_value.GetType() != signature.onc_type) {
89 LOG(ERROR) << MessageHeader() << "Found value '" << onc_value 73 LOG(ERROR) << MessageHeader() << "Found value '" << onc_value
90 << "' of type '" << ValueTypeToString(onc_value.GetType()) 74 << "' of type '" << base::Value::GetTypeName(onc_value.GetType())
91 << "', but type '" << ValueTypeToString(signature.onc_type) 75 << "', but type '"
76 << base::Value::GetTypeName(signature.onc_type)
92 << "' is required."; 77 << "' is required.";
93 error_or_warning_found_ = *error = true; 78 error_or_warning_found_ = *error = true;
94 return std::unique_ptr<base::Value>(); 79 return std::unique_ptr<base::Value>();
95 } 80 }
96 81
97 std::unique_ptr<base::Value> repaired = 82 std::unique_ptr<base::Value> repaired =
98 Mapper::MapValue(signature, onc_value, error); 83 Mapper::MapValue(signature, onc_value, error);
99 if (repaired) 84 if (repaired)
100 CHECK_EQ(repaired->GetType(), signature.onc_type); 85 CHECK_EQ(repaired->GetType(), signature.onc_type);
101 return repaired; 86 return repaired;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 valid = ValidateProxySettings(repaired.get()); 124 valid = ValidateProxySettings(repaired.get());
140 } else if (&signature == &kProxyLocationSignature) { 125 } else if (&signature == &kProxyLocationSignature) {
141 valid = ValidateProxyLocation(repaired.get()); 126 valid = ValidateProxyLocation(repaired.get());
142 } else if (&signature == &kEAPSignature) { 127 } else if (&signature == &kEAPSignature) {
143 valid = ValidateEAP(repaired.get()); 128 valid = ValidateEAP(repaired.get());
144 } else if (&signature == &kCertificateSignature) { 129 } else if (&signature == &kCertificateSignature) {
145 valid = ValidateCertificate(repaired.get()); 130 valid = ValidateCertificate(repaired.get());
146 } 131 }
147 } 132 }
148 133
149 if (valid) { 134 if (valid)
150 return repaired; 135 return repaired;
151 } else { 136
152 DCHECK(error_or_warning_found_); 137 DCHECK(error_or_warning_found_);
153 error_or_warning_found_ = *error = true; 138 error_or_warning_found_ = *error = true;
154 return std::unique_ptr<base::DictionaryValue>(); 139 return std::unique_ptr<base::DictionaryValue>();
155 }
156 } 140 }
157 141
158 std::unique_ptr<base::Value> Validator::MapField( 142 std::unique_ptr<base::Value> Validator::MapField(
159 const std::string& field_name, 143 const std::string& field_name,
160 const OncValueSignature& object_signature, 144 const OncValueSignature& object_signature,
161 const base::Value& onc_value, 145 const base::Value& onc_value,
162 bool* found_unknown_field, 146 bool* found_unknown_field,
163 bool* error) { 147 bool* error) {
164 path_.push_back(field_name); 148 path_.push_back(field_name);
165 bool current_field_unknown = false; 149 bool current_field_unknown = false;
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 265
282 if (found_error) { 266 if (found_error) {
283 error_or_warning_found_ = true; 267 error_or_warning_found_ = true;
284 path_.push_back(::onc::kRecommended); 268 path_.push_back(::onc::kRecommended);
285 std::string message = MessageHeader() + "The " + error_cause + 269 std::string message = MessageHeader() + "The " + error_cause +
286 " field '" + field_name + "' cannot be recommended."; 270 " field '" + field_name + "' cannot be recommended.";
287 path_.pop_back(); 271 path_.pop_back();
288 if (error_on_wrong_recommended_) { 272 if (error_on_wrong_recommended_) {
289 LOG(ERROR) << message; 273 LOG(ERROR) << message;
290 return false; 274 return false;
291 } else {
292 LOG(WARNING) << message;
293 continue;
294 } 275 }
276
277 LOG(WARNING) << message;
278 continue;
295 } 279 }
296 280
297 repaired_recommended->AppendString(field_name); 281 repaired_recommended->AppendString(field_name);
298 } 282 }
299 283
300 result->Set(::onc::kRecommended, repaired_recommended.release()); 284 result->Set(::onc::kRecommended, repaired_recommended.release());
301 return true; 285 return true;
302 } 286 }
303 287
304 bool Validator::ValidateClientCertFields(bool allow_cert_type_none, 288 bool Validator::ValidateClientCertFields(bool allow_cert_type_none,
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 std::string ssid_string; 423 std::string ssid_string;
440 if (object->GetStringWithoutPathExpansion(::onc::wifi::kSSID, &ssid_string) && 424 if (object->GetStringWithoutPathExpansion(::onc::wifi::kSSID, &ssid_string) &&
441 (ssid_string.size() <= 0 || 425 (ssid_string.size() <= 0 ||
442 ssid_string.size() > kMaximumSSIDLengthInBytes)) { 426 ssid_string.size() > kMaximumSSIDLengthInBytes)) {
443 error_or_warning_found_ = true; 427 error_or_warning_found_ = true;
444 const std::string msg = 428 const std::string msg =
445 MessageHeader() + ::onc::wifi::kSSID + " has an invalid length."; 429 MessageHeader() + ::onc::wifi::kSSID + " has an invalid length.";
446 // If the HexSSID field is present, ignore errors in SSID because these 430 // If the HexSSID field is present, ignore errors in SSID because these
447 // might be caused by the usage of a non-UTF-8 encoding when the SSID 431 // might be caused by the usage of a non-UTF-8 encoding when the SSID
448 // field was automatically added (see FillInHexSSIDField). 432 // field was automatically added (see FillInHexSSIDField).
449 if (object->HasKey(::onc::wifi::kHexSSID)) { 433 if (!object->HasKey(::onc::wifi::kHexSSID)) {
450 LOG(WARNING) << msg;
451 } else {
452 LOG(ERROR) << msg; 434 LOG(ERROR) << msg;
453 return false; 435 return false;
454 } 436 }
437 LOG(WARNING) << msg;
455 } 438 }
456 439
457 // Check HexSSID validity. 440 // Check HexSSID validity.
458 std::string hex_ssid_string; 441 std::string hex_ssid_string;
459 if (object->GetStringWithoutPathExpansion(::onc::wifi::kHexSSID, 442 if (object->GetStringWithoutPathExpansion(::onc::wifi::kHexSSID,
460 &hex_ssid_string)) { 443 &hex_ssid_string)) {
461 std::vector<uint8_t> decoded_ssid; 444 std::vector<uint8_t> decoded_ssid;
462 if (!base::HexStringToBytes(hex_ssid_string, &decoded_ssid)) { 445 if (!base::HexStringToBytes(hex_ssid_string, &decoded_ssid)) {
463 LOG(ERROR) << MessageHeader() << "Field " << ::onc::wifi::kHexSSID 446 LOG(ERROR) << MessageHeader() << "Field " << ::onc::wifi::kHexSSID
464 << " is not a valid hex representation: \"" << hex_ssid_string 447 << " is not a valid hex representation: \"" << hex_ssid_string
(...skipping 568 matching lines...) Expand 10 before | Expand all | Expand 10 after
1033 } 1016 }
1034 1017
1035 std::string Validator::MessageHeader() { 1018 std::string Validator::MessageHeader() {
1036 std::string path = path_.empty() ? "toplevel" : base::JoinString(path_, "."); 1019 std::string path = path_.empty() ? "toplevel" : base::JoinString(path_, ".");
1037 std::string message = "At " + path + ": "; 1020 std::string message = "At " + path + ": ";
1038 return message; 1021 return message;
1039 } 1022 }
1040 1023
1041 } // namespace onc 1024 } // namespace onc
1042 } // namespace chromeos 1025 } // namespace chromeos
OLDNEW
« no previous file with comments | « base/values.cc ('k') | components/policy/core/browser/configuration_policy_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698