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

Side by Side Diff: chromeos/network/network_ui_data.cc

Issue 13454006: Moving ManagedNetworkConfigurationHandler to chromeos/. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Cleaned up parsing of NetworkUIData. Created 7 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « chromeos/network/network_ui_data.h ('k') | chromeos/network/network_ui_data_unittest.cc » ('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 "chrome/browser/chromeos/net/onc_utils.h" 5 #include "chromeos/network/network_ui_data.h"
6 6
7 #include "base/logging.h"
7 #include "base/values.h" 8 #include "base/values.h"
8 #include "chrome/browser/chromeos/cros/network_ui_data.h"
9 #include "chrome/browser/chromeos/proxy_config_service_impl.h"
10 #include "chrome/browser/prefs/proxy_config_dictionary.h"
11 #include "chromeos/network/onc/onc_signature.h" 9 #include "chromeos/network/onc/onc_signature.h"
12 #include "chromeos/network/onc/onc_utils.h"
13 #include "googleurl/src/gurl.h"
14 #include "net/proxy/proxy_server.h"
15 10
16 namespace chromeos { 11 namespace chromeos {
17 namespace onc { 12
13 // Top-level UI data dictionary keys.
14 const char NetworkUIData::kKeyONCSource[] = "onc_source";
15 const char NetworkUIData::kKeyCertificatePattern[] = "certificate_pattern";
16 const char NetworkUIData::kKeyCertificateType[] = "certificate_type";
18 17
19 namespace { 18 namespace {
20 19
21 net::ProxyServer ConvertOncProxyLocationToHostPort( 20 template <typename Enum>
22 net::ProxyServer::Scheme default_proxy_scheme, 21 struct StringEnumEntry {
23 const base::DictionaryValue& onc_proxy_location) { 22 const char* string;
24 std::string host; 23 Enum enum_value;
25 onc_proxy_location.GetStringWithoutPathExpansion(onc::proxy::kHost, &host); 24 };
26 // Parse |host| according to the format [<scheme>"://"]<server>[":"<port>].
27 net::ProxyServer proxy_server =
28 net::ProxyServer::FromURI(host, default_proxy_scheme);
29 int port = 0;
30 onc_proxy_location.GetIntegerWithoutPathExpansion(onc::proxy::kPort, &port);
31 25
32 // Replace the port parsed from |host| by the provided |port|. 26 const StringEnumEntry<onc::ONCSource> kONCSourceTable[] = {
33 return net::ProxyServer( 27 { "user_import", onc::ONC_SOURCE_USER_IMPORT },
34 proxy_server.scheme(), 28 { "device_policy", onc::ONC_SOURCE_DEVICE_POLICY },
35 net::HostPortPair(proxy_server.host_port_pair().host(), 29 { "user_policy", onc::ONC_SOURCE_USER_POLICY }
36 static_cast<uint16>(port))); 30 };
31
32 const StringEnumEntry<ClientCertType> kClientCertTable[] = {
33 { "none", CLIENT_CERT_TYPE_NONE },
34 { "pattern", CLIENT_CERT_TYPE_PATTERN },
35 { "ref", CLIENT_CERT_TYPE_REF }
36 };
37
38 // Converts |enum_value| to the corresponding string according to |table|. If no
39 // enum value of the table matches (which can only occur if incorrect casting
40 // was used to obtain |enum_value|), returns an empty string instead.
41 template <typename Enum, int N>
42 std::string EnumToString(const StringEnumEntry<Enum>(& table)[N],
43 Enum enum_value) {
44 for (int i = 0; i < N; ++i) {
45 if (table[i].enum_value == enum_value)
46 return table[i].string;
47 }
48 return std::string();
37 } 49 }
38 50
39 void AppendProxyServerForScheme( 51 // Converts |str| to the corresponding enum value according to |table|. If no
40 const base::DictionaryValue& onc_manual, 52 // string of the table matches, returns |fallback| instead.
41 const std::string& onc_scheme, 53 template<typename Enum, int N>
42 std::string* spec) { 54 Enum StringToEnum(const StringEnumEntry<Enum>(& table)[N],
43 const base::DictionaryValue* onc_proxy_location = NULL; 55 const std::string& str,
44 if (!onc_manual.GetDictionaryWithoutPathExpansion(onc_scheme, 56 Enum fallback) {
45 &onc_proxy_location)) { 57 for (int i = 0; i < N; ++i) {
46 return; 58 if (table[i].string == str)
59 return table[i].enum_value;
47 } 60 }
48 61 return fallback;
49 net::ProxyServer::Scheme default_proxy_scheme = net::ProxyServer::SCHEME_HTTP;
50 std::string url_scheme;
51 if (onc_scheme == proxy::kFtp) {
52 url_scheme = "ftp";
53 } else if (onc_scheme == proxy::kHttp) {
54 url_scheme = "http";
55 } else if (onc_scheme == proxy::kHttps) {
56 url_scheme = "https";
57 } else if (onc_scheme == proxy::kSocks) {
58 default_proxy_scheme = net::ProxyServer::SCHEME_SOCKS4;
59 url_scheme = "socks";
60 } else {
61 NOTREACHED();
62 }
63
64 net::ProxyServer proxy_server = ConvertOncProxyLocationToHostPort(
65 default_proxy_scheme, *onc_proxy_location);
66
67 ProxyConfigServiceImpl::ProxyConfig::EncodeAndAppendProxyServer(
68 url_scheme, proxy_server, spec);
69 } 62 }
70 63
71 net::ProxyBypassRules ConvertOncExcludeDomainsToBypassRules(
72 const base::ListValue& onc_exclude_domains) {
73 net::ProxyBypassRules rules;
74 for (base::ListValue::const_iterator it = onc_exclude_domains.begin();
75 it != onc_exclude_domains.end(); ++it) {
76 std::string rule;
77 (*it)->GetAsString(&rule);
78 rules.AddRuleFromString(rule);
79 }
80 return rules;
81 } 64 }
82 65
83 } // namespace 66 NetworkUIData::NetworkUIData()
67 : onc_source_(onc::ONC_SOURCE_NONE),
68 certificate_type_(CLIENT_CERT_TYPE_NONE) {
69 }
84 70
85 scoped_ptr<base::DictionaryValue> ConvertOncProxySettingsToProxyConfig( 71 NetworkUIData::NetworkUIData(const DictionaryValue& dict) {
86 const base::DictionaryValue& onc_proxy_settings) { 72 std::string source;
87 std::string type; 73 dict.GetString(kKeyONCSource, &source);
88 onc_proxy_settings.GetStringWithoutPathExpansion(proxy::kType, &type); 74 onc_source_ = StringToEnum(kONCSourceTable, source, onc::ONC_SOURCE_NONE);
89 scoped_ptr<DictionaryValue> proxy_dict;
90 75
91 if (type == proxy::kDirect) { 76 std::string type_string;
92 proxy_dict.reset(ProxyConfigDictionary::CreateDirect()); 77 dict.GetString(kKeyCertificateType, &type_string);
93 } else if (type == proxy::kWPAD) { 78 certificate_type_ =
94 proxy_dict.reset(ProxyConfigDictionary::CreateAutoDetect()); 79 StringToEnum(kClientCertTable, type_string, CLIENT_CERT_TYPE_NONE);
95 } else if (type == proxy::kPAC) {
96 std::string pac_url;
97 onc_proxy_settings.GetStringWithoutPathExpansion(proxy::kPAC, &pac_url);
98 GURL url(pac_url);
99 DCHECK(url.is_valid())
100 << "PAC field is invalid for this ProxySettings.Type";
101 proxy_dict.reset(ProxyConfigDictionary::CreatePacScript(url.spec(),
102 false));
103 } else if (type == proxy::kManual) {
104 const base::DictionaryValue* manual_dict = NULL;
105 onc_proxy_settings.GetDictionaryWithoutPathExpansion(proxy::kManual,
106 &manual_dict);
107 std::string manual_spec;
108 AppendProxyServerForScheme(*manual_dict, proxy::kFtp, &manual_spec);
109 AppendProxyServerForScheme(*manual_dict, proxy::kHttp, &manual_spec);
110 AppendProxyServerForScheme(*manual_dict, proxy::kSocks, &manual_spec);
111 AppendProxyServerForScheme(*manual_dict, proxy::kHttps, &manual_spec);
112 80
113 const base::ListValue* exclude_domains = NULL; 81 if (certificate_type_ == CLIENT_CERT_TYPE_PATTERN) {
114 net::ProxyBypassRules bypass_rules; 82 const DictionaryValue* cert_dict = NULL;
115 if (onc_proxy_settings.GetListWithoutPathExpansion(proxy::kExcludeDomains, 83 dict.GetDictionary(kKeyCertificatePattern, &cert_dict);
116 &exclude_domains)) { 84 if (cert_dict)
117 bypass_rules.AssignFrom( 85 certificate_pattern_.CopyFromDictionary(*cert_dict);
118 ConvertOncExcludeDomainsToBypassRules(*exclude_domains)); 86 if (certificate_pattern_.Empty()) {
87 LOG(ERROR) << "Couldn't parse a valid certificate pattern.";
88 certificate_type_ = CLIENT_CERT_TYPE_NONE;
119 } 89 }
120 proxy_dict.reset(ProxyConfigDictionary::CreateFixedServers(
121 manual_spec, bypass_rules.ToString()));
122 } else {
123 NOTREACHED();
124 } 90 }
125 return proxy_dict.Pass(); 91 }
92
93 NetworkUIData::~NetworkUIData() {
94 }
95
96 void NetworkUIData::FillDictionary(base::DictionaryValue* dict) const {
97 dict->Clear();
98
99 std::string source_string = EnumToString(kONCSourceTable, onc_source_);
100 if (!source_string.empty())
101 dict->SetString(kKeyONCSource, source_string);
102
103 if (certificate_type_ != CLIENT_CERT_TYPE_NONE) {
104 std::string type_string = EnumToString(kClientCertTable, certificate_type_);
105 dict->SetString(kKeyCertificateType, type_string);
106
107 if (certificate_type_ == CLIENT_CERT_TYPE_PATTERN &&
108 !certificate_pattern_.Empty()) {
109 dict->Set(kKeyCertificatePattern,
110 certificate_pattern_.CreateAsDictionary());
111 }
112 }
126 } 113 }
127 114
128 namespace { 115 namespace {
129 116
130 void TranslateClientCertType(const std::string& client_cert_type, 117 void TranslateClientCertType(const std::string& client_cert_type,
131 NetworkUIData* ui_data) { 118 NetworkUIData* ui_data) {
119 using namespace onc::certificate;
132 ClientCertType type; 120 ClientCertType type;
133 if (client_cert_type == certificate::kNone) { 121 if (client_cert_type == kNone) {
134 type = CLIENT_CERT_TYPE_NONE; 122 type = CLIENT_CERT_TYPE_NONE;
135 } else if (client_cert_type == certificate::kRef) { 123 } else if (client_cert_type == kRef) {
136 type = CLIENT_CERT_TYPE_REF; 124 type = CLIENT_CERT_TYPE_REF;
137 } else if (client_cert_type == certificate::kPattern) { 125 } else if (client_cert_type == kPattern) {
138 type = CLIENT_CERT_TYPE_PATTERN; 126 type = CLIENT_CERT_TYPE_PATTERN;
139 } else { 127 } else {
140 type = CLIENT_CERT_TYPE_NONE; 128 type = CLIENT_CERT_TYPE_NONE;
141 NOTREACHED(); 129 NOTREACHED();
142 } 130 }
143 131
144 ui_data->set_certificate_type(type); 132 ui_data->set_certificate_type(type);
145 } 133 }
146 134
147 void TranslateCertificatePattern(const base::DictionaryValue& onc_object, 135 void TranslateCertificatePattern(const base::DictionaryValue& onc_object,
148 NetworkUIData* ui_data) { 136 NetworkUIData* ui_data) {
149 CertificatePattern pattern; 137 CertificatePattern pattern;
150 bool success = pattern.CopyFromDictionary(onc_object); 138 bool success = pattern.CopyFromDictionary(onc_object);
151 DCHECK(success); 139 DCHECK(success);
152 ui_data->set_certificate_pattern(pattern); 140 ui_data->set_certificate_pattern(pattern);
153 } 141 }
154 142
155 void TranslateEAP(const base::DictionaryValue& eap, 143 void TranslateEAP(const base::DictionaryValue& eap,
156 NetworkUIData* ui_data) { 144 NetworkUIData* ui_data) {
157 std::string client_cert_type; 145 std::string client_cert_type;
158 if (eap.GetStringWithoutPathExpansion(eap::kClientCertType, 146 if (eap.GetStringWithoutPathExpansion(onc::eap::kClientCertType,
159 &client_cert_type)) { 147 &client_cert_type)) {
160 TranslateClientCertType(client_cert_type, ui_data); 148 TranslateClientCertType(client_cert_type, ui_data);
161 } 149 }
162 } 150 }
163 151
164 void TranslateIPsec(const base::DictionaryValue& ipsec, 152 void TranslateIPsec(const base::DictionaryValue& ipsec,
165 NetworkUIData* ui_data) { 153 NetworkUIData* ui_data) {
166 std::string client_cert_type; 154 std::string client_cert_type;
167 if (ipsec.GetStringWithoutPathExpansion(vpn::kClientCertType, 155 if (ipsec.GetStringWithoutPathExpansion(onc::vpn::kClientCertType,
168 &client_cert_type)) { 156 &client_cert_type)) {
169 TranslateClientCertType(client_cert_type, ui_data); 157 TranslateClientCertType(client_cert_type, ui_data);
170 } 158 }
171 } 159 }
172 160
173 void TranslateOpenVPN(const base::DictionaryValue& openvpn, 161 void TranslateOpenVPN(const base::DictionaryValue& openvpn,
174 NetworkUIData* ui_data) { 162 NetworkUIData* ui_data) {
175 std::string client_cert_type; 163 std::string client_cert_type;
176 if (openvpn.GetStringWithoutPathExpansion(vpn::kClientCertType, 164 if (openvpn.GetStringWithoutPathExpansion(onc::vpn::kClientCertType,
177 &client_cert_type)) { 165 &client_cert_type)) {
178 TranslateClientCertType(client_cert_type, ui_data); 166 TranslateClientCertType(client_cert_type, ui_data);
179 } 167 }
180 } 168 }
181 169
182 void TranslateONCHierarchy(const OncValueSignature& signature, 170 void TranslateONCHierarchy(const onc::OncValueSignature& signature,
183 const base::DictionaryValue& onc_object, 171 const base::DictionaryValue& onc_object,
184 NetworkUIData* ui_data) { 172 NetworkUIData* ui_data) {
185 if (&signature == &kCertificatePatternSignature) 173 if (&signature == &onc::kCertificatePatternSignature)
186 TranslateCertificatePattern(onc_object, ui_data); 174 TranslateCertificatePattern(onc_object, ui_data);
187 else if (&signature == &kEAPSignature) 175 else if (&signature == &onc::kEAPSignature)
188 TranslateEAP(onc_object, ui_data); 176 TranslateEAP(onc_object, ui_data);
189 else if (&signature == &kIPsecSignature) 177 else if (&signature == &onc::kIPsecSignature)
190 TranslateIPsec(onc_object, ui_data); 178 TranslateIPsec(onc_object, ui_data);
191 else if (&signature == &kOpenVPNSignature) 179 else if (&signature == &onc::kOpenVPNSignature)
192 TranslateOpenVPN(onc_object, ui_data); 180 TranslateOpenVPN(onc_object, ui_data);
193 181
194 // Recurse into nested objects. 182 // Recurse into nested objects.
195 for (base::DictionaryValue::Iterator it(onc_object); !it.IsAtEnd(); 183 for (base::DictionaryValue::Iterator it(onc_object); !it.IsAtEnd();
196 it.Advance()) { 184 it.Advance()) {
197 const base::DictionaryValue* inner_object; 185 const base::DictionaryValue* inner_object;
198 if (!it.value().GetAsDictionary(&inner_object)) 186 if (!it.value().GetAsDictionary(&inner_object))
199 continue; 187 continue;
200 188
201 const OncFieldSignature* field_signature = 189 const onc::OncFieldSignature* field_signature =
202 GetFieldSignature(signature, it.key()); 190 GetFieldSignature(signature, it.key());
203 191
204 TranslateONCHierarchy(*field_signature->value_signature, *inner_object, 192 TranslateONCHierarchy(*field_signature->value_signature, *inner_object,
205 ui_data); 193 ui_data);
206 } 194 }
207 } 195 }
208 196
209 } // namespace 197 } // namespace
210 198
211 scoped_ptr<NetworkUIData> CreateUIData( 199 scoped_ptr<NetworkUIData> CreateUIDataFromONC(
212 ONCSource onc_source, 200 onc::ONCSource onc_source,
213 const base::DictionaryValue& onc_network) { 201 const base::DictionaryValue& onc_network) {
214 scoped_ptr<NetworkUIData> ui_data(new NetworkUIData()); 202 scoped_ptr<NetworkUIData> ui_data(new NetworkUIData());
215 TranslateONCHierarchy(kNetworkConfigurationSignature, onc_network, 203 TranslateONCHierarchy(onc::kNetworkConfigurationSignature, onc_network,
216 ui_data.get()); 204 ui_data.get());
217 205
218 ui_data->set_onc_source(onc_source); 206 ui_data->set_onc_source(onc_source);
219 207
220 return ui_data.Pass(); 208 return ui_data.Pass();
221 } 209 }
222 210
223 } // namespace onc
224 } // namespace chromeos 211 } // namespace chromeos
OLDNEW
« no previous file with comments | « chromeos/network/network_ui_data.h ('k') | chromeos/network/network_ui_data_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698