| 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 "chromeos/network/network_ui_data.h" | 5 #include "chromeos/network/network_ui_data.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/values.h" | 8 #include "base/values.h" |
| 9 #include "chromeos/network/onc/onc_signature.h" | 9 #include "components/onc/onc_constants.h" |
| 10 | 10 |
| 11 namespace chromeos { | 11 namespace chromeos { |
| 12 | 12 |
| 13 // Top-level UI data dictionary keys. | 13 // Top-level UI data dictionary keys. |
| 14 const char NetworkUIData::kKeyONCSource[] = "onc_source"; | 14 const char NetworkUIData::kKeyONCSource[] = "onc_source"; |
| 15 const char NetworkUIData::kKeyCertificatePattern[] = "certificate_pattern"; | |
| 16 const char NetworkUIData::kKeyCertificateType[] = "certificate_type"; | |
| 17 const char NetworkUIData::kKeyUserSettings[] = "user_settings"; | 15 const char NetworkUIData::kKeyUserSettings[] = "user_settings"; |
| 18 const char NetworkUIData::kONCSourceUserImport[] = "user_import"; | 16 const char NetworkUIData::kONCSourceUserImport[] = "user_import"; |
| 19 const char NetworkUIData::kONCSourceDevicePolicy[] = "device_policy"; | 17 const char NetworkUIData::kONCSourceDevicePolicy[] = "device_policy"; |
| 20 const char NetworkUIData::kONCSourceUserPolicy[] = "user_policy"; | 18 const char NetworkUIData::kONCSourceUserPolicy[] = "user_policy"; |
| 21 | 19 |
| 22 namespace { | 20 namespace { |
| 23 | 21 |
| 24 template <typename Enum> | 22 template <typename Enum> |
| 25 struct StringEnumEntry { | 23 struct StringEnumEntry { |
| 26 const char* string; | 24 const char* string; |
| 27 Enum enum_value; | 25 Enum enum_value; |
| 28 }; | 26 }; |
| 29 | 27 |
| 30 const StringEnumEntry< ::onc::ONCSource> kONCSourceTable[] = { | 28 const StringEnumEntry< ::onc::ONCSource> kONCSourceTable[] = { |
| 31 { NetworkUIData::kONCSourceUserImport, ::onc::ONC_SOURCE_USER_IMPORT }, | 29 { NetworkUIData::kONCSourceUserImport, ::onc::ONC_SOURCE_USER_IMPORT }, |
| 32 { NetworkUIData::kONCSourceDevicePolicy, ::onc::ONC_SOURCE_DEVICE_POLICY }, | 30 { NetworkUIData::kONCSourceDevicePolicy, ::onc::ONC_SOURCE_DEVICE_POLICY }, |
| 33 { NetworkUIData::kONCSourceUserPolicy, ::onc::ONC_SOURCE_USER_POLICY } | 31 { NetworkUIData::kONCSourceUserPolicy, ::onc::ONC_SOURCE_USER_POLICY } |
| 34 }; | 32 }; |
| 35 | 33 |
| 36 const StringEnumEntry<ClientCertType> kClientCertTable[] = { | |
| 37 { "none", CLIENT_CERT_TYPE_NONE }, | |
| 38 { "pattern", CLIENT_CERT_TYPE_PATTERN }, | |
| 39 { "ref", CLIENT_CERT_TYPE_REF } | |
| 40 }; | |
| 41 | |
| 42 // Converts |enum_value| to the corresponding string according to |table|. If no | 34 // Converts |enum_value| to the corresponding string according to |table|. If no |
| 43 // enum value of the table matches (which can only occur if incorrect casting | 35 // enum value of the table matches (which can only occur if incorrect casting |
| 44 // was used to obtain |enum_value|), returns an empty string instead. | 36 // was used to obtain |enum_value|), returns an empty string instead. |
| 45 template <typename Enum, int N> | 37 template <typename Enum, int N> |
| 46 std::string EnumToString(const StringEnumEntry<Enum>(& table)[N], | 38 std::string EnumToString(const StringEnumEntry<Enum>(& table)[N], |
| 47 Enum enum_value) { | 39 Enum enum_value) { |
| 48 for (int i = 0; i < N; ++i) { | 40 for (int i = 0; i < N; ++i) { |
| 49 if (table[i].enum_value == enum_value) | 41 if (table[i].enum_value == enum_value) |
| 50 return table[i].string; | 42 return table[i].string; |
| 51 } | 43 } |
| 52 return std::string(); | 44 return std::string(); |
| 53 } | 45 } |
| 54 | 46 |
| 55 // Converts |str| to the corresponding enum value according to |table|. If no | 47 // Converts |str| to the corresponding enum value according to |table|. If no |
| 56 // string of the table matches, returns |fallback| instead. | 48 // string of the table matches, returns |fallback| instead. |
| 57 template<typename Enum, int N> | 49 template<typename Enum, int N> |
| 58 Enum StringToEnum(const StringEnumEntry<Enum>(& table)[N], | 50 Enum StringToEnum(const StringEnumEntry<Enum>(& table)[N], |
| 59 const std::string& str, | 51 const std::string& str, |
| 60 Enum fallback) { | 52 Enum fallback) { |
| 61 for (int i = 0; i < N; ++i) { | 53 for (int i = 0; i < N; ++i) { |
| 62 if (table[i].string == str) | 54 if (table[i].string == str) |
| 63 return table[i].enum_value; | 55 return table[i].enum_value; |
| 64 } | 56 } |
| 65 return fallback; | 57 return fallback; |
| 66 } | 58 } |
| 67 | 59 |
| 68 } // namespace | 60 } // namespace |
| 69 | 61 |
| 70 NetworkUIData::NetworkUIData() | 62 NetworkUIData::NetworkUIData() : onc_source_(::onc::ONC_SOURCE_NONE) { |
| 71 : onc_source_(::onc::ONC_SOURCE_NONE), | |
| 72 certificate_type_(CLIENT_CERT_TYPE_NONE) { | |
| 73 } | 63 } |
| 74 | 64 |
| 75 NetworkUIData::NetworkUIData(const NetworkUIData& other) { | 65 NetworkUIData::NetworkUIData(const NetworkUIData& other) { |
| 76 *this = other; | 66 *this = other; |
| 77 } | 67 } |
| 78 | 68 |
| 79 NetworkUIData& NetworkUIData::operator=(const NetworkUIData& other) { | 69 NetworkUIData& NetworkUIData::operator=(const NetworkUIData& other) { |
| 80 certificate_pattern_ = other.certificate_pattern_; | |
| 81 onc_source_ = other.onc_source_; | 70 onc_source_ = other.onc_source_; |
| 82 certificate_type_ = other.certificate_type_; | |
| 83 if (other.user_settings_) | 71 if (other.user_settings_) |
| 84 user_settings_.reset(other.user_settings_->DeepCopy()); | 72 user_settings_.reset(other.user_settings_->DeepCopy()); |
| 85 policy_guid_ = other.policy_guid_; | |
| 86 return *this; | 73 return *this; |
| 87 } | 74 } |
| 88 | 75 |
| 89 NetworkUIData::NetworkUIData(const base::DictionaryValue& dict) { | 76 NetworkUIData::NetworkUIData(const base::DictionaryValue& dict) { |
| 90 std::string source; | 77 std::string source; |
| 91 dict.GetString(kKeyONCSource, &source); | 78 dict.GetString(kKeyONCSource, &source); |
| 92 onc_source_ = StringToEnum(kONCSourceTable, source, ::onc::ONC_SOURCE_NONE); | 79 onc_source_ = StringToEnum(kONCSourceTable, source, ::onc::ONC_SOURCE_NONE); |
| 93 | 80 |
| 94 std::string type_string; | 81 std::string type_string; |
| 95 dict.GetString(kKeyCertificateType, &type_string); | |
| 96 certificate_type_ = | |
| 97 StringToEnum(kClientCertTable, type_string, CLIENT_CERT_TYPE_NONE); | |
| 98 | |
| 99 if (certificate_type_ == CLIENT_CERT_TYPE_PATTERN) { | |
| 100 const base::DictionaryValue* cert_dict = NULL; | |
| 101 dict.GetDictionary(kKeyCertificatePattern, &cert_dict); | |
| 102 if (cert_dict) | |
| 103 certificate_pattern_.ReadFromONCDictionary(*cert_dict); | |
| 104 if (certificate_pattern_.Empty()) { | |
| 105 // This case may occur if UIData from an older CrOS version is read. | |
| 106 LOG(WARNING) << "Couldn't parse a valid certificate pattern."; | |
| 107 certificate_type_ = CLIENT_CERT_TYPE_NONE; | |
| 108 } | |
| 109 } | |
| 110 | 82 |
| 111 const base::DictionaryValue* user_settings = NULL; | 83 const base::DictionaryValue* user_settings = NULL; |
| 112 if (dict.GetDictionary(kKeyUserSettings, &user_settings)) | 84 if (dict.GetDictionary(kKeyUserSettings, &user_settings)) |
| 113 user_settings_.reset(user_settings->DeepCopy()); | 85 user_settings_.reset(user_settings->DeepCopy()); |
| 114 } | 86 } |
| 115 | 87 |
| 116 NetworkUIData::~NetworkUIData() { | 88 NetworkUIData::~NetworkUIData() { |
| 117 } | 89 } |
| 118 | 90 |
| 119 void NetworkUIData::set_user_settings(scoped_ptr<base::DictionaryValue> dict) { | 91 void NetworkUIData::set_user_settings(scoped_ptr<base::DictionaryValue> dict) { |
| 120 user_settings_ = dict.Pass(); | 92 user_settings_ = dict.Pass(); |
| 121 } | 93 } |
| 122 | 94 |
| 123 std::string NetworkUIData::GetONCSourceAsString() const { | 95 std::string NetworkUIData::GetONCSourceAsString() const { |
| 124 return EnumToString(kONCSourceTable, onc_source_); | 96 return EnumToString(kONCSourceTable, onc_source_); |
| 125 } | 97 } |
| 126 | 98 |
| 127 void NetworkUIData::FillDictionary(base::DictionaryValue* dict) const { | 99 void NetworkUIData::FillDictionary(base::DictionaryValue* dict) const { |
| 128 dict->Clear(); | 100 dict->Clear(); |
| 129 | 101 |
| 130 std::string source_string = GetONCSourceAsString(); | 102 std::string source_string = GetONCSourceAsString(); |
| 131 if (!source_string.empty()) | 103 if (!source_string.empty()) |
| 132 dict->SetString(kKeyONCSource, source_string); | 104 dict->SetString(kKeyONCSource, source_string); |
| 133 | 105 |
| 134 if (certificate_type_ != CLIENT_CERT_TYPE_NONE) { | |
| 135 std::string type_string = EnumToString(kClientCertTable, certificate_type_); | |
| 136 dict->SetString(kKeyCertificateType, type_string); | |
| 137 | |
| 138 if (certificate_type_ == CLIENT_CERT_TYPE_PATTERN && | |
| 139 !certificate_pattern_.Empty()) { | |
| 140 dict->Set(kKeyCertificatePattern, | |
| 141 certificate_pattern_.CreateONCDictionary().release()); | |
| 142 } | |
| 143 } | |
| 144 if (user_settings_) | 106 if (user_settings_) |
| 145 dict->SetWithoutPathExpansion(kKeyUserSettings, | 107 dict->SetWithoutPathExpansion(kKeyUserSettings, |
| 146 user_settings_->DeepCopy()); | 108 user_settings_->DeepCopy()); |
| 147 } | 109 } |
| 148 | 110 |
| 149 namespace { | |
| 150 | |
| 151 void GetAndTranslateClientCertType(const base::DictionaryValue& onc_object, | |
| 152 NetworkUIData* ui_data) { | |
| 153 using namespace ::onc::client_cert; | |
| 154 | |
| 155 std::string client_cert_type; | |
| 156 if (!onc_object.GetStringWithoutPathExpansion(kClientCertType, | |
| 157 &client_cert_type)) { | |
| 158 return; | |
| 159 } | |
| 160 | |
| 161 ClientCertType type; | |
| 162 if (client_cert_type == kNone) { | |
| 163 type = CLIENT_CERT_TYPE_NONE; | |
| 164 } else if (client_cert_type == kRef) { | |
| 165 type = CLIENT_CERT_TYPE_REF; | |
| 166 } else if (client_cert_type == kPattern) { | |
| 167 type = CLIENT_CERT_TYPE_PATTERN; | |
| 168 } else { | |
| 169 type = CLIENT_CERT_TYPE_NONE; | |
| 170 NOTREACHED(); | |
| 171 } | |
| 172 | |
| 173 ui_data->set_certificate_type(type); | |
| 174 } | |
| 175 | |
| 176 void TranslateCertificatePattern(const base::DictionaryValue& onc_object, | |
| 177 NetworkUIData* ui_data) { | |
| 178 CertificatePattern pattern; | |
| 179 bool success = pattern.ReadFromONCDictionary(onc_object); | |
| 180 DCHECK(success); | |
| 181 ui_data->set_certificate_pattern(pattern); | |
| 182 } | |
| 183 | |
| 184 void TranslateONCHierarchy(const onc::OncValueSignature& signature, | |
| 185 const base::DictionaryValue& onc_object, | |
| 186 NetworkUIData* ui_data) { | |
| 187 if (&signature == &onc::kCertificatePatternSignature) { | |
| 188 TranslateCertificatePattern(onc_object, ui_data); | |
| 189 } else if (&signature == &onc::kEAPSignature || | |
| 190 &signature == &onc::kIPsecSignature || | |
| 191 &signature == &onc::kOpenVPNSignature) { | |
| 192 GetAndTranslateClientCertType(onc_object, ui_data); | |
| 193 } | |
| 194 | |
| 195 // Recurse into nested objects. | |
| 196 for (base::DictionaryValue::Iterator it(onc_object); !it.IsAtEnd(); | |
| 197 it.Advance()) { | |
| 198 const base::DictionaryValue* inner_object; | |
| 199 if (!it.value().GetAsDictionary(&inner_object)) | |
| 200 continue; | |
| 201 | |
| 202 const onc::OncFieldSignature* field_signature = | |
| 203 GetFieldSignature(signature, it.key()); | |
| 204 | |
| 205 TranslateONCHierarchy(*field_signature->value_signature, *inner_object, | |
| 206 ui_data); | |
| 207 } | |
| 208 } | |
| 209 | |
| 210 } // namespace | |
| 211 | |
| 212 // static | 111 // static |
| 213 scoped_ptr<NetworkUIData> NetworkUIData::CreateFromONC( | 112 scoped_ptr<NetworkUIData> NetworkUIData::CreateFromONC( |
| 214 ::onc::ONCSource onc_source, | 113 ::onc::ONCSource onc_source) { |
| 215 const base::DictionaryValue& onc_network) { | |
| 216 scoped_ptr<NetworkUIData> ui_data(new NetworkUIData()); | 114 scoped_ptr<NetworkUIData> ui_data(new NetworkUIData()); |
| 217 TranslateONCHierarchy(onc::kNetworkConfigurationSignature, onc_network, | |
| 218 ui_data.get()); | |
| 219 | 115 |
| 220 ui_data->set_onc_source(onc_source); | 116 ui_data->onc_source_ = onc_source; |
| 221 | 117 |
| 222 return ui_data.Pass(); | 118 return ui_data.Pass(); |
| 223 } | 119 } |
| 224 | 120 |
| 225 } // namespace chromeos | 121 } // namespace chromeos |
| OLD | NEW |