OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef CHROME_BROWSER_CHROMEOS_CROS_ONC_NETWORK_PARSER_H_ | |
6 #define CHROME_BROWSER_CHROMEOS_CROS_ONC_NETWORK_PARSER_H_ | |
7 | |
8 #include <string> | |
9 #include <vector> | |
10 | |
11 #include "base/compiler_specific.h" // for OVERRIDE | |
12 #include "base/gtest_prod_util.h" | |
13 #include "base/memory/scoped_ptr.h" | |
14 #include "base/values.h" | |
15 #include "chrome/browser/chromeos/cros/network_parser.h" | |
16 #include "chrome/browser/chromeos/cros/network_ui_data.h" | |
17 #include "chromeos/network/onc/onc_constants.h" | |
18 | |
19 namespace base { | |
20 class DictionaryValue; | |
21 class ListValue; | |
22 class Value; | |
23 } | |
24 | |
25 namespace net { | |
26 class ProxyServer; | |
27 } | |
28 | |
29 namespace chromeos { | |
30 | |
31 class IssuerSubjectPattern; | |
32 | |
33 // This is a simple representation of the signature of an ONC typed | |
34 // field, used in validation and translation. It could be extended | |
35 // to include more complex rules of when the field is required/optional, | |
36 // as well as to handle "enum" types, which are strings with a small | |
37 // static set of possible values. | |
38 struct OncValueSignature { | |
39 const char* field; | |
40 PropertyIndex index; | |
41 base::Value::Type type; | |
42 }; | |
43 | |
44 // This is the network parser that parses the data from an Open Network | |
45 // Configuration (ONC) file. ONC files are in JSON format that describes | |
46 // networks. We will use this parser to parse the ONC JSON blob. | |
47 // | |
48 // For ONC file format, see: http://dev.chromium.org/chromium-os/ | |
49 // chromiumos-design-docs/open-network-configuration | |
50 class OncNetworkParser : public NetworkParser { | |
51 public: | |
52 typedef bool (*ParserPointer)(OncNetworkParser*, | |
53 PropertyIndex, | |
54 const base::Value&, | |
55 Network*); | |
56 | |
57 OncNetworkParser(const base::ListValue& network_configs, | |
58 onc::ONCSource onc_source); | |
59 virtual ~OncNetworkParser(); | |
60 static const EnumMapper<PropertyIndex>* property_mapper(); | |
61 | |
62 // Returns the number of networks in the "NetworkConfigs" list. | |
63 int GetNetworkConfigsSize() const; | |
64 | |
65 // Returns the network configuration dictionary for the nth network. CHECKs if | |
66 // |n| is out of range and returns NULL on parse errors. | |
67 const base::DictionaryValue* GetNetworkConfig(int n); | |
68 | |
69 // Call to create the network by parsing network config in the nth position. | |
70 // (0-based). CHECKs if |n| is out of range and returns NULL on parse errors. | |
71 // |removed| is set to true if the network should be removed. |removed| may | |
72 // be NULL. | |
73 Network* ParseNetwork(int n, bool* marked_for_removal); | |
74 | |
75 virtual Network* CreateNetworkFromInfo(const std::string& service_path, | |
76 const base::DictionaryValue& info) OVERRIDE; | |
77 | |
78 // Parses a nested ONC object with the given mapper and parser function. | |
79 // If Value is not the proper type or there is an error in parsing | |
80 // any individual field, VLOGs diagnostics, and returns false. | |
81 bool ParseNestedObject(Network* network, | |
82 const std::string& onc_type, | |
83 const base::Value& value, | |
84 OncValueSignature* signature, | |
85 ParserPointer parser); | |
86 | |
87 // Expands |value| with user account specific paramaters. | |
88 static std::string GetUserExpandedValue(const base::Value& value, | |
89 onc::ONCSource source); | |
90 | |
91 const std::string& parse_error() const { return parse_error_; } | |
92 | |
93 onc::ONCSource onc_source() const { return onc_source_; } | |
94 | |
95 protected: | |
96 OncNetworkParser(); | |
97 | |
98 virtual Network* CreateNewNetwork(ConnectionType type, | |
99 const std::string& service_path) OVERRIDE; | |
100 virtual ConnectionType ParseType(const std::string& type) OVERRIDE; | |
101 virtual ConnectionType ParseTypeFromDictionary( | |
102 const base::DictionaryValue& info) OVERRIDE; | |
103 | |
104 // Returns the type string from the dictionary of network values. | |
105 std::string GetTypeFromDictionary(const base::DictionaryValue& info); | |
106 | |
107 // Returns the GUID string from the dictionary of network values. | |
108 std::string GetGuidFromDictionary(const base::DictionaryValue& info); | |
109 | |
110 // Parse a field's value in the NetworkConfiguration object. | |
111 static bool ParseNetworkConfigurationValue(OncNetworkParser* parser, | |
112 PropertyIndex index, | |
113 const base::Value& value, | |
114 Network* network); | |
115 | |
116 // Issue a diagnostic and return false if a type mismatch is found. | |
117 static bool CheckNetworkType(Network* network, | |
118 ConnectionType expected, | |
119 const std::string& onc_type); | |
120 | |
121 | |
122 // Find the PKCS#11 ID of the certificate with the given GUID. Returns | |
123 // an empty string on failure. | |
124 static std::string GetPkcs11IdFromCertGuid(const std::string& guid); | |
125 | |
126 // Process ProxySettings dictionary into a format which is then updated into | |
127 // ProxyConfig property in shill. | |
128 static bool ProcessProxySettings(OncNetworkParser* parser, | |
129 const base::Value& value, | |
130 Network* network); | |
131 | |
132 static ClientCertType ParseClientCertType(const std::string& type); | |
133 | |
134 // Parse ClientCertPattern dictionary that specifies certificate pattern for | |
135 // VPN and WiFi EAP certificates. | |
136 static bool ParseClientCertPattern(OncNetworkParser* parser, | |
137 PropertyIndex index, | |
138 const base::Value& value, | |
139 Network* network); | |
140 private: | |
141 // Parse the ProxySettings dictionary. | |
142 static bool ParseProxySettingsValue(OncNetworkParser* parser, | |
143 PropertyIndex index, | |
144 const base::Value& value, | |
145 Network* network); | |
146 | |
147 // Parse Type key of ProxySettings dictionary. | |
148 static ProxyOncType ParseProxyType(const std::string& type); | |
149 | |
150 // Parse Manual dictionary that is child of ProxySettings dictionary. | |
151 static bool ParseProxyManualValue(OncNetworkParser* parser, | |
152 PropertyIndex index, | |
153 const base::Value& value, | |
154 Network* network); | |
155 | |
156 // Parse proxy server for different schemes in Manual dictionary. | |
157 static bool ParseProxyServer(int property_index, | |
158 const base::Value& value, | |
159 const std::string& scheme, | |
160 Network* network); | |
161 | |
162 // Parse ProxyLocation dictionary that specifies the manual proxy server. | |
163 static net::ProxyServer ParseProxyLocationValue(int property_index, | |
164 const base::Value& value); | |
165 | |
166 // Parse IssuerSubjectPattern dictionary for certificate pattern fields. | |
167 static bool ParseIssuerPattern(OncNetworkParser* parser, | |
168 PropertyIndex index, | |
169 const base::Value& value, | |
170 Network* network); | |
171 static bool ParseSubjectPattern(OncNetworkParser* parser, | |
172 PropertyIndex index, | |
173 const base::Value& value, | |
174 Network* network); | |
175 static bool ParseIssuerSubjectPattern(IssuerSubjectPattern* pattern, | |
176 OncNetworkParser* parser, | |
177 PropertyIndex index, | |
178 const base::Value& value, | |
179 Network* network); | |
180 | |
181 // Error message from the JSON parser, if applicable. | |
182 std::string parse_error_; | |
183 | |
184 // Where the ONC blob comes from. | |
185 onc::ONCSource onc_source_; | |
186 | |
187 scoped_ptr<base::ListValue> network_configs_; | |
188 | |
189 DISALLOW_COPY_AND_ASSIGN(OncNetworkParser); | |
190 }; | |
191 | |
192 // Class for parsing Ethernet networks. | |
193 class OncEthernetNetworkParser : public OncNetworkParser { | |
194 public: | |
195 OncEthernetNetworkParser(); | |
196 virtual ~OncEthernetNetworkParser(); | |
197 static bool ParseEthernetValue(OncNetworkParser* parser, | |
198 PropertyIndex index, | |
199 const base::Value& value, | |
200 Network* ethernet_network); | |
201 | |
202 private: | |
203 DISALLOW_COPY_AND_ASSIGN(OncEthernetNetworkParser); | |
204 }; | |
205 | |
206 // Base for wireless networks. | |
207 class OncWirelessNetworkParser : public OncNetworkParser { | |
208 public: | |
209 OncWirelessNetworkParser(); | |
210 virtual ~OncWirelessNetworkParser(); | |
211 | |
212 private: | |
213 DISALLOW_COPY_AND_ASSIGN(OncWirelessNetworkParser); | |
214 }; | |
215 | |
216 // Class for parsing Wi-Fi networks. | |
217 class OncWifiNetworkParser : public OncWirelessNetworkParser { | |
218 public: | |
219 OncWifiNetworkParser(); | |
220 virtual ~OncWifiNetworkParser(); | |
221 static bool ParseWifiValue(OncNetworkParser* parser, | |
222 PropertyIndex index, | |
223 const base::Value& value, | |
224 Network* wifi_network); | |
225 | |
226 protected: | |
227 static bool ParseEAPValue(OncNetworkParser* parser, | |
228 PropertyIndex index, | |
229 const base::Value& value, | |
230 Network* wifi_network); | |
231 static ConnectionSecurity ParseSecurity(const std::string& security); | |
232 static EAPMethod ParseEAPMethod(const std::string& method); | |
233 static EAPPhase2Auth ParseEAPPhase2Auth(const std::string& auth); | |
234 | |
235 private: | |
236 DISALLOW_COPY_AND_ASSIGN(OncWifiNetworkParser); | |
237 }; | |
238 | |
239 // Class for parsing virtual private networks. | |
240 class OncVirtualNetworkParser : public OncNetworkParser { | |
241 public: | |
242 OncVirtualNetworkParser(); | |
243 virtual ~OncVirtualNetworkParser(); | |
244 virtual bool UpdateNetworkFromInfo( | |
245 const base::DictionaryValue& info, Network* network) OVERRIDE; | |
246 static bool ParseVPNValue(OncNetworkParser* parser, | |
247 PropertyIndex index, | |
248 const base::Value& value, | |
249 Network* network); | |
250 | |
251 // network_library combines provider type and authentication type | |
252 // (L2TP-IPsec with PSK vs with Certificates). This function | |
253 // takes a provider type and adds an authentication type to return | |
254 // the updated provider type. | |
255 static ProviderType UpdateProviderTypeWithAuthType( | |
256 ProviderType provider, | |
257 const std::string& auth_type); | |
258 | |
259 // This function takes a provider type (which includes authentication | |
260 // type) and returns the canonical provider type from it. For instance | |
261 // for L2TP-IPsec, the PSK provider type is the canonical one. | |
262 static ProviderType GetCanonicalProviderType(ProviderType provider_type); | |
263 | |
264 static ProviderType ParseProviderType(const std::string& type); | |
265 | |
266 protected: | |
267 static bool ParseIPsecValue(OncNetworkParser* parser, | |
268 PropertyIndex index, | |
269 const base::Value& value, | |
270 Network* network); | |
271 static bool ParseL2TPValue(OncNetworkParser* parser, | |
272 PropertyIndex index, | |
273 const base::Value& value, | |
274 Network* network); | |
275 static bool ParseOpenVPNValue(OncNetworkParser* parser, | |
276 PropertyIndex index, | |
277 const base::Value& value, | |
278 Network* network); | |
279 | |
280 private: | |
281 DISALLOW_COPY_AND_ASSIGN(OncVirtualNetworkParser); | |
282 }; | |
283 | |
284 } // namespace chromeos | |
285 | |
286 #endif // CHROME_BROWSER_CHROMEOS_CROS_ONC_NETWORK_PARSER_H_ | |
OLD | NEW |