OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
michaelpg
2017/05/18 21:14:23
2017
stevenjb
2017/05/19 23:35:34
Done.
| |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 /** | |
6 * @fileoverview | |
7 * 'settings-internet-config' provides configuration of authentication | |
8 * properties for new and existing networks. | |
9 */ | |
10 Polymer({ | |
11 is: 'settings-internet-config', | |
12 | |
13 behaviors: [settings.RouteObserverBehavior, I18nBehavior], | |
14 | |
15 properties: { | |
16 /** | |
17 * Interface for networkingPrivate calls, passed from internet_page. | |
18 * @type {NetworkingPrivate} | |
19 */ | |
20 networkingPrivate: Object, | |
21 | |
22 /** | |
23 * The GUID when an existing network is being configured. This will be | |
24 * empty when configuring a new network. | |
25 * @private | |
26 */ | |
27 guid_: String, | |
28 | |
29 /** | |
30 * The current properties if an existing network being configured. | |
31 * This will be undefined when configuring a new network. | |
32 * @type {!chrome.networkingPrivate.NetworkProperties|undefined} | |
33 * @private | |
34 */ | |
35 networkProperties_: Object, | |
36 | |
37 /** | |
38 * The configuraiton properties for the network. |configProperties_.Type| | |
39 * will always be defined as the network type being configured. | |
michaelpg
2017/05/18 21:14:23
"always": including when configuring a new network
stevenjb
2017/05/19 23:35:34
Yes. Done. (It gets set in currentRouteChanged, so
| |
40 * @type {!chrome.networkingPrivate.NetworkConfigProperties|undefined} | |
41 * @private | |
42 */ | |
43 configProperties_: Object, | |
44 | |
45 /** | |
46 * The title to display (network name or type). | |
47 * @private | |
48 */ | |
49 title_: String, | |
50 | |
51 /** | |
52 * Whether this network should be shared with other users of the device. | |
53 * @private | |
54 */ | |
55 shareNetwork_: Boolean, | |
56 | |
57 /** | |
58 * Saved security value, used to detect when Security changes. | |
59 * @private | |
60 */ | |
61 savedSecurity_: String, | |
62 | |
63 /** | |
64 * Object providing network type values for data binding. | |
65 * @const | |
66 * @private | |
67 */ | |
68 NetworkType_: { | |
michaelpg
2017/05/18 21:14:23
This isn't really used, apart from passing WI_FI t
stevenjb
2017/05/19 23:35:34
We will definitely have other values in the very s
| |
69 type: Object, | |
70 value: { | |
71 CELLULAR: CrOnc.Type.CELLULAR, | |
72 ETHERNET: CrOnc.Type.ETHERNET, | |
73 VPN: CrOnc.Type.VPN, | |
74 WI_FI: CrOnc.Type.WI_FI, | |
75 WI_MAX: CrOnc.Type.WI_MAX, | |
76 }, | |
77 readOnly: true | |
78 }, | |
79 | |
80 /** | |
81 * Array of values for the WiFi Security dropdown. | |
82 * @type {!Array<string>} | |
83 * @const | |
84 * @private | |
85 */ | |
86 securityItems_: { | |
87 type: Array, | |
88 readOnly: true, | |
89 value: function() { | |
michaelpg
2017/05/18 21:14:23
if @const, doesn't really need to be returned via
stevenjb
2017/05/19 23:35:34
Done.
| |
90 return [ | |
91 CrOnc.Security.NONE, CrOnc.Security.WEP_PSK, CrOnc.Security.WPA_PSK, | |
92 CrOnc.Security.WPA_EAP | |
93 ]; | |
94 } | |
95 }, | |
96 | |
97 /** | |
98 * Array of values for the EAP Method (Outer) dropdown. | |
99 * @type {!Array<string>} | |
100 * @const | |
101 * @private | |
102 */ | |
103 eapOuterItems_: { | |
104 type: Array, | |
105 readOnly: true, | |
106 value: function() { | |
107 return ['LEAP', 'PEAP', 'EAP-TLS', 'EAP-TTLS']; | |
108 } | |
109 }, | |
110 | |
111 /** | |
112 * Array of values for the EAP EAP Phase 2 authentication (Inner) dropdown | |
113 * when the Outer type is PEAP. | |
114 * @type {!Array<string>} | |
115 * @const | |
116 * @private | |
117 */ | |
118 eapInnerItemsPeap_: { | |
119 type: Array, | |
120 readOnly: true, | |
121 value: function() { | |
122 return ['Automatic', 'MD5', 'MSCHAPv2']; | |
123 } | |
124 }, | |
125 | |
126 /** | |
127 * Array of values for the EAP EAP Phase 2 authentication (Inner) dropdown | |
128 * when the Outer type is EAP-TTLS. | |
129 * @type {!Array<string>} | |
130 * @const | |
131 * @private | |
132 */ | |
133 eapInnerItemsTtls_: { | |
134 type: Array, | |
135 readOnly: true, | |
136 value: function() { | |
137 return ['Automatic', 'MD5', 'MSCHAP', 'MSCHAPv2', 'PAP', 'CHAP', 'GTC']; | |
michaelpg
2017/05/18 21:14:23
Suggestion: these constants may be more readable a
stevenjb
2017/05/19 23:35:34
Hmm, the others are used directly in the html so n
| |
138 } | |
139 }, | |
140 }, | |
141 | |
142 observers: ['updateConfigProperties_(configProperties_.*)'], | |
143 | |
144 /** @const */ | |
145 MIN_PASSPHRASE_LENGTH: 5, | |
146 | |
147 /** | |
148 * settings.RouteObserverBehavior | |
149 * @param {!settings.Route} route | |
150 * @protected | |
151 */ | |
152 currentRouteChanged: function(route) { | |
153 if (route != settings.Route.NETWORK_CONFIG) | |
154 return; | |
155 | |
156 var queryParams = settings.getQueryParameters(); | |
157 this.guid_ = queryParams.get('guid') || ''; | |
158 | |
159 // Set networkProperties for new configurations and for existing | |
160 // configuraitons until the current properties are loaded. | |
161 var name = queryParams.get('name') || ''; | |
162 var type = /** @type {!chrome.networkingPrivate.NetworkType} */ ( | |
163 queryParams.get('type')) || | |
164 CrOnc.Type.WI_FI; | |
165 this.networkProperties_ = { | |
166 GUID: this.guid_, | |
167 Name: name, | |
168 Type: type, | |
169 }; | |
170 var configProperties = {Type: type}; | |
171 if (type == CrOnc.Type.WI_FI) { | |
172 configProperties.WiFi = { | |
173 SSID: '', | |
174 Security: CrOnc.Security.NONE, | |
175 }; | |
176 } | |
177 this.configProperties_ = configProperties; | |
178 if (this.guid_) { | |
179 this.networkingPrivate.getProperties( | |
180 this.guid_, this.getPropertiesCallback_.bind(this)); | |
181 } else { | |
182 this.title_ = this.i18n('OncType' + type); | |
183 this.shareNetwork_ = true; | |
184 } | |
185 }, | |
186 | |
187 /** @private */ | |
188 close_: function() { | |
189 // Delay navigating to allow other subpages to load first (e.g. when called | |
michaelpg
2017/05/18 21:14:23
I don't understand why this is necessary -- what h
stevenjb
2017/05/19 23:35:34
It's kind of an edge case, but if a page is left o
| |
190 // from a getPropertiesCallback_ error). | |
191 requestAnimationFrame(function() { | |
192 settings.navigateToPreviousRoute(); | |
michaelpg
2017/05/18 21:14:23
verify that we are still on NETWORK_CONFIG so we d
stevenjb
2017/05/19 23:35:34
Done.
| |
193 }); | |
194 }, | |
195 | |
196 /** | |
197 * networkingPrivate.getProperties callback. | |
198 * @param {!chrome.networkingPrivate.NetworkProperties} properties | |
199 * @private | |
200 */ | |
201 getPropertiesCallback_: function(properties) { | |
202 if (!properties) { | |
203 // If |properties| is null, the network no longer exists; close the page. | |
204 console.error('Network no longer exists: ' + this.guid_); | |
205 this.close_(); | |
206 return; | |
207 } | |
208 this.networkProperties_ = properties; | |
209 this.title_ = properties.Name || this.i18n('OncType' + properties.Type); | |
210 this.shareNetwork_ = properties.Source == CrOnc.Source.DEVICE || | |
211 properties.Source == CrOnc.Source.DEVICE_POLICY; | |
212 this.savedSecurity_ = /** @type {string} */ ( | |
213 this.get('WiFi.Security', this.networkProperties_)); | |
214 | |
215 var configProperties = | |
216 /** @type {chrome.networkingPrivate.NetworkConfigProperties} */ ({ | |
217 Name: properties.Name, | |
218 Type: properties.Type, | |
219 }); | |
220 if (properties.WiFi) { | |
221 configProperties.WiFi = { | |
222 AutoConnect: properties.WiFi.AutoConnect, | |
223 EAP: properties.WiFi.EAP, | |
224 Passphrase: properties.WiFi.Passphrase, | |
225 SSID: properties.WiFi.SSID, | |
226 Security: properties.WiFi.Security | |
227 }; | |
228 } | |
229 this.configProperties_ = configProperties; | |
230 }, | |
231 | |
232 /** @private */ | |
233 updateConfigProperties_: function() { | |
234 if (this.configProperties_.WiFi) { | |
235 var security = /** @type {string} */ ( | |
236 this.get('WiFi.Security', this.configProperties_)); | |
237 var eapOuter; | |
238 if (security == CrOnc.Security.WPA_EAP) { | |
239 this.configProperties_.WiFi.EAP = this.configProperties_.WiFi.EAP || {}; | |
240 eapOuter = this.configProperties_.WiFi.EAP.Outer; | |
241 if (!eapOuter) { | |
242 eapOuter = 'LEAP'; | |
243 this.configProperties_.WiFi.EAP.Outer = eapOuter; | |
244 } | |
245 if (eapOuter == 'PEAP' || eapOuter == 'EAP-TTLS') { | |
michaelpg
2017/05/18 21:14:23
I think these strings are used frequently enough t
stevenjb
2017/05/19 23:35:34
Added to OncTypes.
| |
246 if (!this.configProperties_.WiFi.EAP.Inner) | |
247 this.configProperties_.WiFi.EAP.Inner = 'Automatic'; | |
michaelpg
2017/05/18 21:14:23
please consider splitting this function up -- it h
stevenjb
2017/05/19 23:35:34
Done.
| |
248 } else { | |
249 delete this.configProperties_.WiFi.EAP.Inner; | |
250 } | |
251 } else { | |
252 delete this.configProperties_.WiFi.EAP; | |
253 } | |
254 | |
255 if (security != this.savedSecurity_) { | |
256 if (!security || security == CrOnc.Security.NONE) { | |
257 this.shareNetwork_ = true; | |
258 } else { | |
259 // TODO: also check login state. | |
michaelpg
2017/05/18 21:14:23
(stevenjb)
stevenjb
2017/05/19 23:35:34
Done.
| |
260 this.shareNetwork_ = false; | |
261 } | |
262 this.savedSecurity_ = security; | |
263 } | |
264 } | |
265 this.setShowEap_(); | |
266 }, | |
267 | |
268 /** | |
269 * @param {CrOnc.Type} type The type to compare against. | |
270 * @param {CrOnc.Type} networkType The current network type. | |
271 * @return {boolean} True if the network type matches 'type'. | |
272 * @private | |
273 */ | |
274 isType_: function(type, networkType) { | |
275 return type == networkType; | |
276 }, | |
277 | |
278 /** | |
279 * @return {boolean} | |
280 * @private | |
281 */ | |
282 connectIsEnabled_: function() { | |
283 if (this.configProperties_.Type == CrOnc.Type.WI_FI) { | |
284 if (!this.get('WiFi.SSID', this.configProperties_)) | |
285 return false; | |
286 if (this.showWiFiPassphrase_()) { | |
287 var passphrase = this.get('WiFi.Passphrase', this.configProperties_); | |
288 if (!passphrase || passphrase.length < this.MIN_PASSPHRASE_LENGTH) | |
289 return false; | |
290 } | |
291 } | |
292 // TODO(stevenjb): Check certificates. | |
293 return true; | |
294 }, | |
295 | |
296 /** | |
297 * @return {boolean} | |
298 * @private | |
299 */ | |
300 shareIsEnabled_: function() { | |
301 if (this.configProperties_.Type == CrOnc.Type.WI_FI) { | |
302 var security = this.get('WiFi.Security', this.configProperties_); | |
303 if (!security || security == CrOnc.Security.NONE) { | |
304 return false; | |
305 } else if (security == CrOnc.Security.WPA_EAP) { | |
306 var outer = this.get('WiFi.EAP.Outer', this.configProperties_); | |
307 if (outer === 'EAP-TLS') | |
308 return false; | |
309 } | |
310 // TODO(stevenjb): Check certificates. | |
311 } | |
312 // TODO(stevenjb): Check login state. | |
313 return true; | |
314 }, | |
315 | |
316 /** @private */ | |
317 onSaveTap_: function() { | |
318 var newConfig = /** @type {boolean} */ (!this.guid_); | |
319 var propertiesToSet = Object.assign({}, this.configProperties_); | |
320 if (newConfig) { | |
321 this.networkingPrivate.createNetwork( | |
322 this.shareNetwork_, propertiesToSet, | |
323 this.createNetworkCallback_.bind(this)); | |
324 } else { | |
325 propertiesToSet.GUID = this.guid_; | |
326 this.networkingPrivate.setProperties( | |
327 this.guid_, propertiesToSet, this.setPropertiesCallback_.bind(this)); | |
328 } | |
329 }, | |
330 | |
331 /** | |
332 * @param {string} guid | |
333 * @private | |
334 */ | |
335 createNetworkCallback_: function(guid) { | |
336 var error = chrome.runtime.lastError && chrome.runtime.lastError.message; | |
337 if (error) { | |
338 // TODO(stevenjb): Display error message. | |
339 console.error( | |
340 'Error creating network type: ' + this.networkProperties_.Type + | |
341 ': ' + error); | |
342 return; | |
343 } | |
344 this.networkProperties_.GUID = guid; | |
345 this.fire('network-connect', {networkProperties: this.networkProperties_}); | |
346 this.close_(); | |
347 }, | |
348 | |
349 /** @private */ | |
350 setPropertiesCallback_: function() { | |
351 var error = chrome.runtime.lastError && chrome.runtime.lastError.message; | |
352 if (error) { | |
353 console.error( | |
354 'Error setting network properties: ' + this.guid_ + ': ' + error); | |
355 } | |
356 this.close_(); | |
357 }, | |
358 | |
359 /** | |
360 * @return boolean | |
361 * @private | |
362 */ | |
363 showWiFiPassphrase_: function() { | |
364 if (this.configProperties_.Type != CrOnc.Type.WI_FI) | |
365 return false; | |
366 var security = this.get('WiFi.Security', this.configProperties_); | |
367 return security == CrOnc.Security.WEP_PSK || | |
368 security == CrOnc.Security.WPA_PSK; | |
369 }, | |
370 | |
371 /** @private */ | |
372 setShowEap_: function() { | |
373 var showEap = null; | |
374 if (this.configProperties_.Type == CrOnc.Type.WI_FI) { | |
375 var security = this.get('WiFi.Security', this.configProperties_); | |
376 if (security && security == CrOnc.Security.WPA_EAP) { | |
michaelpg
2017/05/18 21:14:23
maybe consider early returns instead of nested ifs
stevenjb
2017/05/19 23:35:34
Done.
| |
377 var outer = this.get('WiFi.EAP.Outer', this.configProperties_); | |
378 showEap = { | |
379 Inner: outer == 'PEAP' || outer == 'EAP-TTLS', | |
380 ServerCA: outer != 'LEAP', | |
381 SubjectMatch: outer == 'EAP-TLS', | |
382 UserCert: outer == 'EAP-TLS', | |
383 Password: outer != 'EAP-TLS', | |
384 AnonymousIdentity: outer == 'PEAP' || outer == 'EAP-TTLS', | |
385 }; | |
386 } | |
387 } | |
388 this.showEap_ = showEap; | |
michaelpg
2017/05/18 21:14:23
er, is this property not declared/documented?
stevenjb
2017/05/19 23:35:34
Done.
| |
389 }, | |
390 | |
391 /** | |
392 * @param {string} key | |
393 * @param {string} prefix | |
394 * @return {string} The text to display for the onc value. | |
395 * @private | |
396 */ | |
397 getOncLabel_: function(key, prefix) { | |
398 var oncKey = 'Onc' + prefix.replace(/\./g, '-') + '_' + key; | |
399 if (this.i18nExists(oncKey)) | |
400 return this.i18n(oncKey); | |
401 return key; | |
michaelpg
2017/05/18 21:14:23
Huh? Do we intentionally translate some strings bu
stevenjb
2017/05/19 23:35:34
Added an assert.
| |
402 }, | |
403 | |
404 /** | |
405 * @param {string} outer | |
406 * @return {!Array<string>} | |
407 * @private | |
408 */ | |
409 getEapInnerItems_: function(outer) { | |
410 if (outer == 'PEAP') | |
411 return this.eapInnerItemsPeap_; | |
412 else if (outer == 'EAP-TTLS') | |
michaelpg
2017/05/18 21:14:23
nit: no else after return
stevenjb
2017/05/19 23:35:34
Done.
| |
413 return this.eapInnerItemsTtls_; | |
414 return ['Automatic']; | |
415 }, | |
416 }); | |
OLD | NEW |