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 == kClientCertTypeNone) { | |
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 |