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

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: Moved CreateUIData from ONC. 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 template <typename Enum, int N>
39 std::string EnumToString(const StringEnumEntry<Enum>(& table)[N],
40 Enum enum_value) {
41 for (int i = 0; i < N; ++i) {
42 if (table[i].enum_value == enum_value)
43 return table[i].string;
44 }
45 return std::string();
37 } 46 }
38 47
39 void AppendProxyServerForScheme( 48 template<typename Enum, int N>
40 const base::DictionaryValue& onc_manual, 49 Enum StringToEnum(const StringEnumEntry<Enum>(& table)[N],
41 const std::string& onc_scheme, 50 const std::string& str,
42 std::string* spec) { 51 Enum fallback) {
43 const base::DictionaryValue* onc_proxy_location = NULL; 52 for (int i = 0; i < N; ++i) {
44 if (!onc_manual.GetDictionaryWithoutPathExpansion(onc_scheme, 53 if (table[i].string == str)
45 &onc_proxy_location)) { 54 return table[i].enum_value;
46 return;
47 } 55 }
48 56 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 } 57 }
70 58
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 } 59 }
82 60
83 } // namespace 61 NetworkUIData::NetworkUIData()
62 : onc_source_(onc::ONC_SOURCE_NONE),
63 certificate_type_(CLIENT_CERT_TYPE_NONE) {
64 }
84 65
85 scoped_ptr<base::DictionaryValue> ConvertOncProxySettingsToProxyConfig( 66 NetworkUIData::NetworkUIData(const DictionaryValue& dict) {
86 const base::DictionaryValue& onc_proxy_settings) { 67 std::string source;
87 std::string type; 68 if (dict.GetString(kKeyONCSource, &source)) {
88 onc_proxy_settings.GetStringWithoutPathExpansion(proxy::kType, &type); 69 onc_source_ =
89 scoped_ptr<DictionaryValue> proxy_dict; 70 StringToEnum(kONCSourceTable, source, onc::ONC_SOURCE_NONE);
71 } else {
72 onc_source_ = onc::ONC_SOURCE_NONE;
73 }
74 const DictionaryValue* cert_dict = NULL;
75 if (dict.GetDictionary(kKeyCertificatePattern, &cert_dict) && cert_dict)
76 certificate_pattern_.CopyFromDictionary(*cert_dict);
77 std::string type_string;
78 if (dict.GetString(kKeyCertificateType, &type_string)) {
79 certificate_type_ =
80 StringToEnum(kClientCertTable, type_string, CLIENT_CERT_TYPE_NONE);
81 } else {
82 certificate_type_ = CLIENT_CERT_TYPE_NONE;
83 }
84 DCHECK(certificate_type_ != CLIENT_CERT_TYPE_PATTERN ||
85 (certificate_type_ == CLIENT_CERT_TYPE_PATTERN &&
86 !certificate_pattern_.Empty()));
stevenjb 2013/04/08 19:22:33 Is this logically not possible, or just unexpected
pneubeck (no reviews) 2013/04/10 08:59:23 Cleaned up. We better assume here that the input i
87 }
90 88
91 if (type == proxy::kDirect) { 89 NetworkUIData::~NetworkUIData() {
92 proxy_dict.reset(ProxyConfigDictionary::CreateDirect()); 90 }
93 } else if (type == proxy::kWPAD) {
94 proxy_dict.reset(ProxyConfigDictionary::CreateAutoDetect());
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 91
113 const base::ListValue* exclude_domains = NULL; 92 void NetworkUIData::FillDictionary(base::DictionaryValue* dict) const {
114 net::ProxyBypassRules bypass_rules; 93 dict->Clear();
115 if (onc_proxy_settings.GetListWithoutPathExpansion(proxy::kExcludeDomains, 94
116 &exclude_domains)) { 95 std::string source_string = EnumToString(kONCSourceTable, onc_source_);
117 bypass_rules.AssignFrom( 96 if (!source_string.empty())
118 ConvertOncExcludeDomainsToBypassRules(*exclude_domains)); 97 dict->SetString(kKeyONCSource, source_string);
98
99 if (certificate_type_ != CLIENT_CERT_TYPE_NONE) {
100 std::string type_string = EnumToString(kClientCertTable, certificate_type_);
101 dict->SetString(kKeyCertificateType, type_string);
102
103 if (certificate_type_ == CLIENT_CERT_TYPE_PATTERN &&
104 !certificate_pattern_.Empty()) {
105 dict->Set(kKeyCertificatePattern,
106 certificate_pattern_.CreateAsDictionary());
119 } 107 }
120 proxy_dict.reset(ProxyConfigDictionary::CreateFixedServers(
121 manual_spec, bypass_rules.ToString()));
122 } else {
123 NOTREACHED();
124 } 108 }
125 return proxy_dict.Pass();
126 } 109 }
127 110
128 namespace { 111 namespace {
129 112
130 void TranslateClientCertType(const std::string& client_cert_type, 113 void TranslateClientCertType(const std::string& client_cert_type,
131 NetworkUIData* ui_data) { 114 NetworkUIData* ui_data) {
115 using namespace onc::certificate;
132 ClientCertType type; 116 ClientCertType type;
133 if (client_cert_type == certificate::kNone) { 117 if (client_cert_type == kNone) {
134 type = CLIENT_CERT_TYPE_NONE; 118 type = CLIENT_CERT_TYPE_NONE;
135 } else if (client_cert_type == certificate::kRef) { 119 } else if (client_cert_type == kRef) {
136 type = CLIENT_CERT_TYPE_REF; 120 type = CLIENT_CERT_TYPE_REF;
137 } else if (client_cert_type == certificate::kPattern) { 121 } else if (client_cert_type == kPattern) {
138 type = CLIENT_CERT_TYPE_PATTERN; 122 type = CLIENT_CERT_TYPE_PATTERN;
139 } else { 123 } else {
140 type = CLIENT_CERT_TYPE_NONE; 124 type = CLIENT_CERT_TYPE_NONE;
141 NOTREACHED(); 125 NOTREACHED();
142 } 126 }
143 127
144 ui_data->set_certificate_type(type); 128 ui_data->set_certificate_type(type);
145 } 129 }
146 130
147 void TranslateCertificatePattern(const base::DictionaryValue& onc_object, 131 void TranslateCertificatePattern(const base::DictionaryValue& onc_object,
148 NetworkUIData* ui_data) { 132 NetworkUIData* ui_data) {
149 CertificatePattern pattern; 133 CertificatePattern pattern;
150 bool success = pattern.CopyFromDictionary(onc_object); 134 bool success = pattern.CopyFromDictionary(onc_object);
151 DCHECK(success); 135 DCHECK(success);
152 ui_data->set_certificate_pattern(pattern); 136 ui_data->set_certificate_pattern(pattern);
153 } 137 }
154 138
155 void TranslateEAP(const base::DictionaryValue& eap, 139 void TranslateEAP(const base::DictionaryValue& eap,
156 NetworkUIData* ui_data) { 140 NetworkUIData* ui_data) {
157 std::string client_cert_type; 141 std::string client_cert_type;
158 if (eap.GetStringWithoutPathExpansion(eap::kClientCertType, 142 if (eap.GetStringWithoutPathExpansion(onc::eap::kClientCertType,
159 &client_cert_type)) { 143 &client_cert_type)) {
160 TranslateClientCertType(client_cert_type, ui_data); 144 TranslateClientCertType(client_cert_type, ui_data);
161 } 145 }
162 } 146 }
163 147
164 void TranslateIPsec(const base::DictionaryValue& ipsec, 148 void TranslateIPsec(const base::DictionaryValue& ipsec,
165 NetworkUIData* ui_data) { 149 NetworkUIData* ui_data) {
166 std::string client_cert_type; 150 std::string client_cert_type;
167 if (ipsec.GetStringWithoutPathExpansion(vpn::kClientCertType, 151 if (ipsec.GetStringWithoutPathExpansion(onc::vpn::kClientCertType,
168 &client_cert_type)) { 152 &client_cert_type)) {
169 TranslateClientCertType(client_cert_type, ui_data); 153 TranslateClientCertType(client_cert_type, ui_data);
170 } 154 }
171 } 155 }
172 156
173 void TranslateOpenVPN(const base::DictionaryValue& openvpn, 157 void TranslateOpenVPN(const base::DictionaryValue& openvpn,
174 NetworkUIData* ui_data) { 158 NetworkUIData* ui_data) {
175 std::string client_cert_type; 159 std::string client_cert_type;
176 if (openvpn.GetStringWithoutPathExpansion(vpn::kClientCertType, 160 if (openvpn.GetStringWithoutPathExpansion(onc::vpn::kClientCertType,
177 &client_cert_type)) { 161 &client_cert_type)) {
178 TranslateClientCertType(client_cert_type, ui_data); 162 TranslateClientCertType(client_cert_type, ui_data);
179 } 163 }
180 } 164 }
181 165
182 void TranslateONCHierarchy(const OncValueSignature& signature, 166 void TranslateONCHierarchy(const onc::OncValueSignature& signature,
183 const base::DictionaryValue& onc_object, 167 const base::DictionaryValue& onc_object,
184 NetworkUIData* ui_data) { 168 NetworkUIData* ui_data) {
185 if (&signature == &kCertificatePatternSignature) 169 if (&signature == &onc::kCertificatePatternSignature)
186 TranslateCertificatePattern(onc_object, ui_data); 170 TranslateCertificatePattern(onc_object, ui_data);
187 else if (&signature == &kEAPSignature) 171 else if (&signature == &onc::kEAPSignature)
188 TranslateEAP(onc_object, ui_data); 172 TranslateEAP(onc_object, ui_data);
189 else if (&signature == &kIPsecSignature) 173 else if (&signature == &onc::kIPsecSignature)
190 TranslateIPsec(onc_object, ui_data); 174 TranslateIPsec(onc_object, ui_data);
191 else if (&signature == &kOpenVPNSignature) 175 else if (&signature == &onc::kOpenVPNSignature)
192 TranslateOpenVPN(onc_object, ui_data); 176 TranslateOpenVPN(onc_object, ui_data);
193 177
194 // Recurse into nested objects. 178 // Recurse into nested objects.
195 for (base::DictionaryValue::Iterator it(onc_object); !it.IsAtEnd(); 179 for (base::DictionaryValue::Iterator it(onc_object); !it.IsAtEnd();
196 it.Advance()) { 180 it.Advance()) {
197 const base::DictionaryValue* inner_object; 181 const base::DictionaryValue* inner_object;
198 if (!it.value().GetAsDictionary(&inner_object)) 182 if (!it.value().GetAsDictionary(&inner_object))
199 continue; 183 continue;
200 184
201 const OncFieldSignature* field_signature = 185 const onc::OncFieldSignature* field_signature =
202 GetFieldSignature(signature, it.key()); 186 GetFieldSignature(signature, it.key());
203 187
204 TranslateONCHierarchy(*field_signature->value_signature, *inner_object, 188 TranslateONCHierarchy(*field_signature->value_signature, *inner_object,
205 ui_data); 189 ui_data);
206 } 190 }
207 } 191 }
208 192
209 } // namespace 193 } // namespace
210 194
211 scoped_ptr<NetworkUIData> CreateUIData( 195 scoped_ptr<NetworkUIData> CreateUIDataFromONC(
212 ONCSource onc_source, 196 onc::ONCSource onc_source,
213 const base::DictionaryValue& onc_network) { 197 const base::DictionaryValue& onc_network) {
214 scoped_ptr<NetworkUIData> ui_data(new NetworkUIData()); 198 scoped_ptr<NetworkUIData> ui_data(new NetworkUIData());
215 TranslateONCHierarchy(kNetworkConfigurationSignature, onc_network, 199 TranslateONCHierarchy(onc::kNetworkConfigurationSignature, onc_network,
216 ui_data.get()); 200 ui_data.get());
217 201
218 ui_data->set_onc_source(onc_source); 202 ui_data->set_onc_source(onc_source);
219 203
220 return ui_data.Pass(); 204 return ui_data.Pass();
221 } 205 }
222 206
223 } // namespace onc
224 } // namespace chromeos 207 } // 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