]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - contrib/wpa_supplicant/wpa_gui/networkconfig.ui.h
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.git] / contrib / wpa_supplicant / wpa_gui / networkconfig.ui.h
1 /****************************************************************************
2 ** ui.h extension file, included from the uic-generated form implementation.
3 **
4 ** If you want to add, delete, or rename functions or slots, use
5 ** Qt Designer to update this file, preserving your code.
6 **
7 ** You should not define a constructor or destructor in this file.
8 ** Instead, write your code in functions called init() and destroy().
9 ** These will automatically be called by the form's constructor and
10 ** destructor.
11 *****************************************************************************/
12
13
14 enum {
15     AUTH_NONE = 0,
16     AUTH_IEEE8021X = 1,
17     AUTH_WPA_PSK = 2,
18     AUTH_WPA_EAP = 3,
19     AUTH_WPA2_PSK = 4,
20     AUTH_WPA2_EAP = 5
21 };
22
23 #define WPA_GUI_KEY_DATA "[key is configured]"
24
25 void NetworkConfig::init()
26 {
27     wpagui = NULL;
28     new_network = false;
29 }
30
31 void NetworkConfig::paramsFromScanResults(Q3ListViewItem *sel)
32 {
33     new_network = true;
34
35     /* SSID BSSID frequency signal flags */
36     setCaption(sel->text(0));
37     ssidEdit->setText(sel->text(0));
38     
39     QString flags = sel->text(4);
40     int auth, encr = 0;
41     if (flags.find("[WPA2-EAP") >= 0)
42         auth = AUTH_WPA2_EAP;
43     else if (flags.find("[WPA-EAP") >= 0)
44         auth = AUTH_WPA_EAP;
45     else if (flags.find("[WPA2-PSK") >= 0)
46         auth = AUTH_WPA2_PSK;
47     else if (flags.find("[WPA-PSK") >= 0)
48         auth = AUTH_WPA_PSK;
49     else
50         auth = AUTH_NONE;
51     
52     if (flags.find("-CCMP") >= 0)
53         encr = 1;
54     else if (flags.find("-TKIP") >= 0)
55         encr = 0;
56     else if (flags.find("WEP") >= 0)
57         encr = 1;
58     else
59         encr = 0;
60  
61     authSelect->setCurrentItem(auth);
62     authChanged(auth);
63     encrSelect->setCurrentItem(encr);
64
65     getEapCapa();
66 }
67
68
69 void NetworkConfig::authChanged(int sel)
70 {
71     pskEdit->setEnabled(sel == AUTH_WPA_PSK || sel == AUTH_WPA2_PSK);
72     bool eap = sel == AUTH_IEEE8021X || sel == AUTH_WPA_EAP ||
73                sel == AUTH_WPA2_EAP;
74     eapSelect->setEnabled(eap);
75     identityEdit->setEnabled(eap);
76     passwordEdit->setEnabled(eap);
77     cacertEdit->setEnabled(eap);
78    
79     while (encrSelect->count())
80         encrSelect->removeItem(0);
81     
82     if (sel == AUTH_NONE || sel == AUTH_IEEE8021X) {
83         encrSelect->insertItem("None");
84         encrSelect->insertItem("WEP");
85         encrSelect->setCurrentItem(sel == AUTH_NONE ? 0 : 1);
86     } else {
87         encrSelect->insertItem("TKIP");
88         encrSelect->insertItem("CCMP");
89         encrSelect->setCurrentItem((sel == AUTH_WPA2_PSK ||
90                                     sel == AUTH_WPA2_EAP) ? 1 : 0);
91     }
92     
93     wepEnabled(sel == AUTH_IEEE8021X);
94 }
95
96
97 void NetworkConfig::addNetwork()
98 {
99     char reply[10], cmd[256];
100     size_t reply_len;
101     int id;
102     int psklen = pskEdit->text().length();
103     int auth = authSelect->currentItem();
104
105     if (auth == AUTH_WPA_PSK || auth == AUTH_WPA2_PSK) {
106         if (psklen < 8 || psklen > 64) {
107             QMessageBox::warning(this, "wpa_gui", "WPA-PSK requires a passphrase "
108                                  "of 8 to 63 characters\n"
109                                  "or 64 hex digit PSK");
110             return;
111         }
112     }
113         
114     if (wpagui == NULL)
115         return;
116     
117     memset(reply, 0, sizeof(reply));
118     reply_len = sizeof(reply) - 1;
119     
120     if (new_network) {
121         wpagui->ctrlRequest("ADD_NETWORK", reply, &reply_len);
122         if (reply[0] == 'F') {
123             QMessageBox::warning(this, "wpa_gui", "Failed to add network to wpa_supplicant\n"
124                                  "configuration.");
125             return;
126         }
127         id = atoi(reply);
128     } else {
129         id = edit_network_id;
130     }
131
132     setNetworkParam(id, "ssid", ssidEdit->text().ascii(), true);
133     
134     const char *key_mgmt = NULL, *proto = NULL, *pairwise = NULL;
135     switch (auth) {
136     case AUTH_NONE:
137         key_mgmt = "NONE";
138         break;
139     case AUTH_IEEE8021X:
140         key_mgmt = "IEEE8021X";
141         break;
142     case AUTH_WPA_PSK:
143         key_mgmt = "WPA-PSK";
144         proto = "WPA";
145         break;
146     case AUTH_WPA_EAP:
147         key_mgmt = "WPA-EAP";
148         proto = "WPA";
149         break;
150     case AUTH_WPA2_PSK:
151         key_mgmt = "WPA-PSK";
152         proto = "WPA2";
153         break;
154     case AUTH_WPA2_EAP:
155         key_mgmt = "WPA-EAP";
156         proto = "WPA2";
157         break;
158     }
159     
160     if (auth == AUTH_WPA_PSK || auth == AUTH_WPA_EAP ||
161         auth == AUTH_WPA2_PSK || auth == AUTH_WPA2_EAP) {
162         int encr = encrSelect->currentItem();
163         if (encr == 0)
164             pairwise = "TKIP";
165         else
166             pairwise = "CCMP";
167     }
168     
169     if (proto)
170         setNetworkParam(id, "proto", proto, false);
171     if (key_mgmt)
172         setNetworkParam(id, "key_mgmt", key_mgmt, false);
173     if (pairwise) {
174         setNetworkParam(id, "pairwise", pairwise, false);
175         setNetworkParam(id, "group", "TKIP CCMP WEP104 WEP40", false);
176     }
177     if (pskEdit->isEnabled() &&
178         strcmp(passwordEdit->text().ascii(), WPA_GUI_KEY_DATA) != 0)
179         setNetworkParam(id, "psk", pskEdit->text().ascii(), psklen != 64);
180     if (eapSelect->isEnabled())
181         setNetworkParam(id, "eap", eapSelect->currentText().ascii(), false);
182     if (identityEdit->isEnabled())
183         setNetworkParam(id, "identity", identityEdit->text().ascii(), true);
184     if (passwordEdit->isEnabled() &&
185         strcmp(passwordEdit->text().ascii(), WPA_GUI_KEY_DATA) != 0)
186         setNetworkParam(id, "password", passwordEdit->text().ascii(), true);
187     if (cacertEdit->isEnabled())
188         setNetworkParam(id, "ca_cert", cacertEdit->text().ascii(), true);
189     writeWepKey(id, wep0Edit, 0);
190     writeWepKey(id, wep1Edit, 1);
191     writeWepKey(id, wep2Edit, 2);
192     writeWepKey(id, wep3Edit, 3);
193   
194     if (wep0Radio->isEnabled() && wep0Radio->isChecked())
195         setNetworkParam(id, "wep_tx_keyidx", "0", false);
196     else if (wep1Radio->isEnabled() && wep1Radio->isChecked())
197         setNetworkParam(id, "wep_tx_keyidx", "1", false);
198     else if (wep2Radio->isEnabled() && wep2Radio->isChecked())
199         setNetworkParam(id, "wep_tx_keyidx", "2", false);
200     else if (wep3Radio->isEnabled() && wep3Radio->isChecked())
201         setNetworkParam(id, "wep_tx_keyidx", "3", false);
202
203     snprintf(cmd, sizeof(cmd), "ENABLE_NETWORK %d", id);
204     reply_len = sizeof(reply);
205     wpagui->ctrlRequest(cmd, reply, &reply_len);
206     if (strncmp(reply, "OK", 2) != 0) {
207         QMessageBox::warning(this, "wpa_gui", "Failed to enable network in wpa_supplicant\n"
208                              "configuration.");
209         /* Network was added, so continue anyway */
210     }
211     wpagui->triggerUpdate();
212     wpagui->ctrlRequest("SAVE_CONFIG", reply, &reply_len);
213
214     close();
215 }
216
217
218 void NetworkConfig::setWpaGui( WpaGui *_wpagui )
219 {
220     wpagui = _wpagui;
221 }
222
223
224 int NetworkConfig::setNetworkParam(int id, const char *field, const char *value, bool quote)
225 {
226     char reply[10], cmd[256];
227     size_t reply_len;
228     snprintf(cmd, sizeof(cmd), "SET_NETWORK %d %s %s%s%s",
229              id, field, quote ? "\"" : "", value, quote ? "\"" : "");
230     reply_len = sizeof(reply);
231     wpagui->ctrlRequest(cmd, reply, &reply_len);
232     return strncmp(reply, "OK", 2) == 0 ? 0 : -1;
233 }
234
235
236 void NetworkConfig::encrChanged( const QString &sel )
237 {
238     wepEnabled(sel.find("WEP") == 0);
239 }
240
241
242 void NetworkConfig::wepEnabled( bool enabled )
243 {
244     wep0Edit->setEnabled(enabled);
245     wep1Edit->setEnabled(enabled);
246     wep2Edit->setEnabled(enabled);
247     wep3Edit->setEnabled(enabled);
248     wep0Radio->setEnabled(enabled);
249     wep1Radio->setEnabled(enabled);
250     wep2Radio->setEnabled(enabled);
251     wep3Radio->setEnabled(enabled);
252 }
253
254
255 void NetworkConfig::writeWepKey( int network_id, QLineEdit *edit, int id )
256 {
257     char buf[10];
258     bool hex;
259     const char *txt, *pos;
260     size_t len;
261   
262     if (!edit->isEnabled() || edit->text().isEmpty())
263         return;
264     
265     /*
266         * Assume hex key if only hex characters are present and length matches
267        * with 40, 104, or 128-bit key
268        */
269     txt = edit->text().ascii();
270     if (strcmp(txt, WPA_GUI_KEY_DATA) == 0)
271         return;
272     len = strlen(txt);
273     if (len == 0)
274         return;
275     pos = txt;
276     hex = true;
277     while (*pos) {
278         if (!((*pos >= '0' && *pos <= '9') || (*pos >= 'a' && *pos <= 'f') ||
279               (*pos >= 'A' && *pos <= 'F'))) {
280             hex = false;
281             break;
282         }
283         pos++;
284     }
285     if (hex && len != 10 && len != 26 && len != 32)
286         hex = false;
287     snprintf(buf, sizeof(buf), "wep_key%d", id);
288     setNetworkParam(network_id, buf, txt, !hex);
289 }
290
291
292 static int key_value_isset(const char *reply, size_t reply_len)
293 {
294     return reply_len > 0 && (reply_len < 4 || memcmp(reply, "FAIL", 4) != 0);
295 }
296
297
298 void NetworkConfig::paramsFromConfig( int network_id )
299 {
300     int i, res;
301
302     edit_network_id = network_id;
303     getEapCapa();
304     
305     char reply[1024], cmd[256], *pos;
306     size_t reply_len;
307     
308     snprintf(cmd, sizeof(cmd), "GET_NETWORK %d ssid", network_id);
309     reply_len = sizeof(reply) - 1;
310     if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 2 &&
311         reply[0] == '"') {
312         reply[reply_len] = '\0';
313         pos = strchr(reply + 1, '"');
314         if (pos)
315             *pos = '\0';
316         ssidEdit->setText(reply + 1);
317     }
318     
319     snprintf(cmd, sizeof(cmd), "GET_NETWORK %d proto", network_id);
320     reply_len = sizeof(reply) - 1;
321     int wpa = 0;
322     if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) {
323         reply[reply_len] = '\0';
324         if (strstr(reply, "RSN") || strstr(reply, "WPA2"))
325             wpa = 2;
326         else if (strstr(reply, "WPA"))
327             wpa = 1;
328     }
329
330     int auth = AUTH_NONE, encr = 0;
331     snprintf(cmd, sizeof(cmd), "GET_NETWORK %d key_mgmt", network_id);
332     reply_len = sizeof(reply) - 1;
333     if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) {
334         reply[reply_len] = '\0';
335         if (strstr(reply, "WPA-EAP"))
336             auth = wpa & 2 ? AUTH_WPA2_EAP : AUTH_WPA_EAP;
337         else if (strstr(reply, "WPA-PSK"))
338             auth = wpa & 2 ? AUTH_WPA2_PSK : AUTH_WPA_PSK;
339         else if (strstr(reply, "IEEE8021X")) {
340             auth = AUTH_IEEE8021X;
341             encr = 1;
342         }
343     }
344
345     snprintf(cmd, sizeof(cmd), "GET_NETWORK %d pairwise", network_id);
346     reply_len = sizeof(reply) - 1;
347     if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) {
348         reply[reply_len] = '\0';
349         if (strstr(reply, "CCMP"))
350             encr = 1;
351         else if (strstr(reply, "TKIP"))
352             encr = 0;
353         else if (strstr(reply, "WEP"))
354             encr = 1;
355         else
356             encr = 0;
357     }
358
359     snprintf(cmd, sizeof(cmd), "GET_NETWORK %d psk", network_id);
360     reply_len = sizeof(reply) - 1;
361     res = wpagui->ctrlRequest(cmd, reply, &reply_len);
362     if (res >= 0 && reply_len >= 2 && reply[0] == '"') {
363         reply[reply_len] = '\0';
364         pos = strchr(reply + 1, '"');
365         if (pos)
366             *pos = '\0';
367         pskEdit->setText(reply + 1);
368     } else if (res >= 0 && key_value_isset(reply, reply_len)) {
369         pskEdit->setText(WPA_GUI_KEY_DATA);
370     }
371
372     snprintf(cmd, sizeof(cmd), "GET_NETWORK %d identity", network_id);
373     reply_len = sizeof(reply) - 1;
374     if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 2 &&
375         reply[0] == '"') {
376         reply[reply_len] = '\0';
377         pos = strchr(reply + 1, '"');
378         if (pos)
379             *pos = '\0';
380         identityEdit->setText(reply + 1);
381     }
382
383     snprintf(cmd, sizeof(cmd), "GET_NETWORK %d password", network_id);
384     reply_len = sizeof(reply) - 1;
385     res = wpagui->ctrlRequest(cmd, reply, &reply_len);
386     if (res >= 0 && reply_len >= 2 &&
387         reply[0] == '"') {
388         reply[reply_len] = '\0';
389         pos = strchr(reply + 1, '"');
390         if (pos)
391             *pos = '\0';
392         passwordEdit->setText(reply + 1);
393     } else if (res >= 0 && key_value_isset(reply, reply_len)) {
394         passwordEdit->setText(WPA_GUI_KEY_DATA);
395     }
396
397     snprintf(cmd, sizeof(cmd), "GET_NETWORK %d ca_cert", network_id);
398     reply_len = sizeof(reply) - 1;
399     if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 2 &&
400         reply[0] == '"') {
401         reply[reply_len] = '\0';
402         pos = strchr(reply + 1, '"');
403         if (pos)
404             *pos = '\0';
405         cacertEdit->setText(reply + 1);
406     }
407
408     snprintf(cmd, sizeof(cmd), "GET_NETWORK %d eap", network_id);
409     reply_len = sizeof(reply) - 1;
410     if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 1) {
411         reply[reply_len] = '\0';
412         for (i = 0; i < eapSelect->count(); i++) {
413             if (eapSelect->text(i).compare(reply) == 0) {
414                 eapSelect->setCurrentItem(i);
415                 break;
416             }
417         }
418     }
419
420     for (i = 0; i < 4; i++) {
421         QLineEdit *wepEdit;
422         switch (i) {
423         default:
424         case 0:
425             wepEdit = wep0Edit;
426             break;
427         case 1:
428             wepEdit = wep1Edit;
429             break;
430         case 2:
431             wepEdit = wep2Edit;
432             break;
433         case 3:
434             wepEdit = wep3Edit;
435             break;
436         }
437         snprintf(cmd, sizeof(cmd), "GET_NETWORK %d wep_key%d", network_id, i);
438         reply_len = sizeof(reply) - 1;
439         res = wpagui->ctrlRequest(cmd, reply, &reply_len);
440         if (res >= 0 && reply_len >= 2 && reply[0] == '"') {
441             reply[reply_len] = '\0';
442             pos = strchr(reply + 1, '"');
443             if (pos)
444                 *pos = '\0';
445             if (auth == AUTH_NONE || auth == AUTH_IEEE8021X)
446                 encr = 1;
447
448             wepEdit->setText(reply + 1);
449         } else if (res >= 0 && key_value_isset(reply, reply_len)) {
450             if (auth == AUTH_NONE || auth == AUTH_IEEE8021X)
451                 encr = 1;
452             wepEdit->setText(WPA_GUI_KEY_DATA);
453         }
454     }
455
456     snprintf(cmd, sizeof(cmd), "GET_NETWORK %d wep_tx_keyidx", network_id);
457     reply_len = sizeof(reply) - 1;
458     if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 1) {
459         reply[reply_len] = '\0';
460         switch (atoi(reply)) {
461         case 0:
462             wep0Radio->setChecked(true);
463             break;
464         case 1:
465             wep1Radio->setChecked(true);
466             break;
467         case 2:
468             wep2Radio->setChecked(true);
469             break;
470         case 3:
471             wep3Radio->setChecked(true);
472             break;
473         }
474     }
475
476     authSelect->setCurrentItem(auth);
477     authChanged(auth);
478     encrSelect->setCurrentItem(encr);
479     if (auth == AUTH_NONE || auth == AUTH_IEEE8021X)
480         wepEnabled(encr == 1);
481
482     removeButton->setEnabled(true);
483     addButton->setText("Save");
484 }
485
486
487 void NetworkConfig::removeNetwork()
488 {
489     char reply[10], cmd[256];
490     size_t reply_len;
491     
492     if (QMessageBox::information(this, "wpa_gui",
493                                  "This will permanently remove the network\n"
494                                  "from the configuration. Do you really want\n"
495                                  "to remove this network?", "Yes", "No") != 0)
496         return;
497     
498     snprintf(cmd, sizeof(cmd), "REMOVE_NETWORK %d", edit_network_id);
499     reply_len = sizeof(reply);
500     wpagui->ctrlRequest(cmd, reply, &reply_len);
501     if (strncmp(reply, "OK", 2) != 0) {
502         QMessageBox::warning(this, "wpa_gui",
503                              "Failed to remove network from wpa_supplicant\n"
504                              "configuration.");
505     } else {
506         wpagui->triggerUpdate();
507         wpagui->ctrlRequest("SAVE_CONFIG", reply, &reply_len);
508     }
509
510     close();
511 }
512
513
514 void NetworkConfig::newNetwork()
515 {
516     new_network = true;
517     getEapCapa();
518 }
519
520
521 void NetworkConfig::getEapCapa()
522 {
523     char reply[256];
524     size_t reply_len;
525     
526     if (wpagui == NULL)
527         return;
528
529     reply_len = sizeof(reply) - 1;
530     if (wpagui->ctrlRequest("GET_CAPABILITY eap", reply, &reply_len) < 0)
531         return;
532     reply[reply_len] = '\0';
533     
534     QString res(reply);
535     QStringList types = QStringList::split(QChar(' '), res);
536     eapSelect->insertStringList(types);
537 }