1
/****************************************************************************
2
** ui.h extension file, included from the uic-generated form implementation.
4
** If you want to add, delete, or rename functions or slots, use
5
** Qt Designer to update this file, preserving your code.
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
11
*****************************************************************************/
23
#define WPA_GUI_KEY_DATA "[key is configured]"
25
void NetworkConfig::init()
31
void NetworkConfig::paramsFromScanResults(Q3ListViewItem *sel)
35
/* SSID BSSID frequency signal flags */
36
setCaption(sel->text(0));
37
ssidEdit->setText(sel->text(0));
39
QString flags = sel->text(4);
41
if (flags.find("[WPA2-EAP") >= 0)
43
else if (flags.find("[WPA-EAP") >= 0)
45
else if (flags.find("[WPA2-PSK") >= 0)
47
else if (flags.find("[WPA-PSK") >= 0)
52
if (flags.find("-CCMP") >= 0)
54
else if (flags.find("-TKIP") >= 0)
56
else if (flags.find("WEP") >= 0)
61
authSelect->setCurrentItem(auth);
63
encrSelect->setCurrentItem(encr);
69
void NetworkConfig::authChanged(int sel)
71
pskEdit->setEnabled(sel == AUTH_WPA_PSK || sel == AUTH_WPA2_PSK);
72
bool eap = sel == AUTH_IEEE8021X || sel == AUTH_WPA_EAP ||
74
eapSelect->setEnabled(eap);
75
identityEdit->setEnabled(eap);
76
passwordEdit->setEnabled(eap);
77
cacertEdit->setEnabled(eap);
79
while (encrSelect->count())
80
encrSelect->removeItem(0);
82
if (sel == AUTH_NONE || sel == AUTH_IEEE8021X) {
83
encrSelect->insertItem("None");
84
encrSelect->insertItem("WEP");
85
encrSelect->setCurrentItem(sel == AUTH_NONE ? 0 : 1);
87
encrSelect->insertItem("TKIP");
88
encrSelect->insertItem("CCMP");
89
encrSelect->setCurrentItem((sel == AUTH_WPA2_PSK ||
90
sel == AUTH_WPA2_EAP) ? 1 : 0);
93
wepEnabled(sel == AUTH_IEEE8021X);
97
void NetworkConfig::addNetwork()
99
char reply[10], cmd[256];
102
int psklen = pskEdit->text().length();
103
int auth = authSelect->currentItem();
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");
117
memset(reply, 0, sizeof(reply));
118
reply_len = sizeof(reply) - 1;
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"
129
id = edit_network_id;
132
setNetworkParam(id, "ssid", ssidEdit->text().ascii(), true);
134
if (idstrEdit->isEnabled())
135
setNetworkParam(id, "id_str", idstrEdit->text().ascii(), true);
137
const char *key_mgmt = NULL, *proto = NULL, *pairwise = NULL;
143
key_mgmt = "IEEE8021X";
146
key_mgmt = "WPA-PSK";
150
key_mgmt = "WPA-EAP";
154
key_mgmt = "WPA-PSK";
158
key_mgmt = "WPA-EAP";
163
if (auth == AUTH_WPA_PSK || auth == AUTH_WPA_EAP ||
164
auth == AUTH_WPA2_PSK || auth == AUTH_WPA2_EAP) {
165
int encr = encrSelect->currentItem();
173
setNetworkParam(id, "proto", proto, false);
175
setNetworkParam(id, "key_mgmt", key_mgmt, false);
177
setNetworkParam(id, "pairwise", pairwise, false);
178
setNetworkParam(id, "group", "TKIP CCMP WEP104 WEP40", false);
180
if (pskEdit->isEnabled() &&
181
strcmp(passwordEdit->text().ascii(), WPA_GUI_KEY_DATA) != 0)
182
setNetworkParam(id, "psk", pskEdit->text().ascii(), psklen != 64);
183
if (eapSelect->isEnabled())
184
setNetworkParam(id, "eap", eapSelect->currentText().ascii(), false);
185
if (identityEdit->isEnabled())
186
setNetworkParam(id, "identity", identityEdit->text().ascii(), true);
187
if (passwordEdit->isEnabled() &&
188
strcmp(passwordEdit->text().ascii(), WPA_GUI_KEY_DATA) != 0)
189
setNetworkParam(id, "password", passwordEdit->text().ascii(), true);
190
if (cacertEdit->isEnabled())
191
setNetworkParam(id, "ca_cert", cacertEdit->text().ascii(), true);
192
writeWepKey(id, wep0Edit, 0);
193
writeWepKey(id, wep1Edit, 1);
194
writeWepKey(id, wep2Edit, 2);
195
writeWepKey(id, wep3Edit, 3);
197
if (wep0Radio->isEnabled() && wep0Radio->isChecked())
198
setNetworkParam(id, "wep_tx_keyidx", "0", false);
199
else if (wep1Radio->isEnabled() && wep1Radio->isChecked())
200
setNetworkParam(id, "wep_tx_keyidx", "1", false);
201
else if (wep2Radio->isEnabled() && wep2Radio->isChecked())
202
setNetworkParam(id, "wep_tx_keyidx", "2", false);
203
else if (wep3Radio->isEnabled() && wep3Radio->isChecked())
204
setNetworkParam(id, "wep_tx_keyidx", "3", false);
206
snprintf(cmd, sizeof(cmd), "ENABLE_NETWORK %d", id);
207
reply_len = sizeof(reply);
208
wpagui->ctrlRequest(cmd, reply, &reply_len);
209
if (strncmp(reply, "OK", 2) != 0) {
210
QMessageBox::warning(this, "wpa_gui", "Failed to enable network in wpa_supplicant\n"
212
/* Network was added, so continue anyway */
214
wpagui->triggerUpdate();
215
wpagui->ctrlRequest("SAVE_CONFIG", reply, &reply_len);
221
void NetworkConfig::setWpaGui( WpaGui *_wpagui )
227
int NetworkConfig::setNetworkParam(int id, const char *field, const char *value, bool quote)
229
char reply[10], cmd[256];
231
snprintf(cmd, sizeof(cmd), "SET_NETWORK %d %s %s%s%s",
232
id, field, quote ? "\"" : "", value, quote ? "\"" : "");
233
reply_len = sizeof(reply);
234
wpagui->ctrlRequest(cmd, reply, &reply_len);
235
return strncmp(reply, "OK", 2) == 0 ? 0 : -1;
239
void NetworkConfig::encrChanged( const QString &sel )
241
wepEnabled(sel.find("WEP") == 0);
245
void NetworkConfig::wepEnabled( bool enabled )
247
wep0Edit->setEnabled(enabled);
248
wep1Edit->setEnabled(enabled);
249
wep2Edit->setEnabled(enabled);
250
wep3Edit->setEnabled(enabled);
251
wep0Radio->setEnabled(enabled);
252
wep1Radio->setEnabled(enabled);
253
wep2Radio->setEnabled(enabled);
254
wep3Radio->setEnabled(enabled);
258
void NetworkConfig::writeWepKey( int network_id, QLineEdit *edit, int id )
262
const char *txt, *pos;
265
if (!edit->isEnabled() || edit->text().isEmpty())
269
* Assume hex key if only hex characters are present and length matches
270
* with 40, 104, or 128-bit key
272
txt = edit->text().ascii();
273
if (strcmp(txt, WPA_GUI_KEY_DATA) == 0)
281
if (!((*pos >= '0' && *pos <= '9') || (*pos >= 'a' && *pos <= 'f') ||
282
(*pos >= 'A' && *pos <= 'F'))) {
288
if (hex && len != 10 && len != 26 && len != 32)
290
snprintf(buf, sizeof(buf), "wep_key%d", id);
291
setNetworkParam(network_id, buf, txt, !hex);
295
static int key_value_isset(const char *reply, size_t reply_len)
297
return reply_len > 0 && (reply_len < 4 || memcmp(reply, "FAIL", 4) != 0);
301
void NetworkConfig::paramsFromConfig( int network_id )
305
edit_network_id = network_id;
308
char reply[1024], cmd[256], *pos;
311
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d ssid", network_id);
312
reply_len = sizeof(reply) - 1;
313
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 2 &&
315
reply[reply_len] = '\0';
316
pos = strchr(reply + 1, '"');
319
ssidEdit->setText(reply + 1);
322
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d id_str", network_id);
323
reply_len = sizeof(reply) - 1;
324
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 2 &&
326
reply[reply_len] = '\0';
327
pos = strchr(reply + 1, '"');
330
idstrEdit->setText(reply + 1);
333
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d proto", network_id);
334
reply_len = sizeof(reply) - 1;
336
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) {
337
reply[reply_len] = '\0';
338
if (strstr(reply, "RSN") || strstr(reply, "WPA2"))
340
else if (strstr(reply, "WPA"))
344
int auth = AUTH_NONE, encr = 0;
345
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d key_mgmt", 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, "WPA-EAP"))
350
auth = wpa & 2 ? AUTH_WPA2_EAP : AUTH_WPA_EAP;
351
else if (strstr(reply, "WPA-PSK"))
352
auth = wpa & 2 ? AUTH_WPA2_PSK : AUTH_WPA_PSK;
353
else if (strstr(reply, "IEEE8021X")) {
354
auth = AUTH_IEEE8021X;
359
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d pairwise", network_id);
360
reply_len = sizeof(reply) - 1;
361
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) {
362
reply[reply_len] = '\0';
363
if (strstr(reply, "CCMP") && auth != AUTH_NONE)
365
else if (strstr(reply, "TKIP"))
367
else if (strstr(reply, "WEP"))
373
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d psk", network_id);
374
reply_len = sizeof(reply) - 1;
375
res = wpagui->ctrlRequest(cmd, reply, &reply_len);
376
if (res >= 0 && reply_len >= 2 && reply[0] == '"') {
377
reply[reply_len] = '\0';
378
pos = strchr(reply + 1, '"');
381
pskEdit->setText(reply + 1);
382
} else if (res >= 0 && key_value_isset(reply, reply_len)) {
383
pskEdit->setText(WPA_GUI_KEY_DATA);
386
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d identity", network_id);
387
reply_len = sizeof(reply) - 1;
388
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 2 &&
390
reply[reply_len] = '\0';
391
pos = strchr(reply + 1, '"');
394
identityEdit->setText(reply + 1);
397
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d password", network_id);
398
reply_len = sizeof(reply) - 1;
399
res = wpagui->ctrlRequest(cmd, reply, &reply_len);
400
if (res >= 0 && reply_len >= 2 &&
402
reply[reply_len] = '\0';
403
pos = strchr(reply + 1, '"');
406
passwordEdit->setText(reply + 1);
407
} else if (res >= 0 && key_value_isset(reply, reply_len)) {
408
passwordEdit->setText(WPA_GUI_KEY_DATA);
411
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d ca_cert", network_id);
412
reply_len = sizeof(reply) - 1;
413
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 2 &&
415
reply[reply_len] = '\0';
416
pos = strchr(reply + 1, '"');
419
cacertEdit->setText(reply + 1);
422
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d eap", network_id);
423
reply_len = sizeof(reply) - 1;
424
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 1) {
425
reply[reply_len] = '\0';
426
for (i = 0; i < eapSelect->count(); i++) {
427
if (eapSelect->text(i).compare(reply) == 0) {
428
eapSelect->setCurrentItem(i);
434
for (i = 0; i < 4; i++) {
451
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d wep_key%d", network_id, i);
452
reply_len = sizeof(reply) - 1;
453
res = wpagui->ctrlRequest(cmd, reply, &reply_len);
454
if (res >= 0 && reply_len >= 2 && reply[0] == '"') {
455
reply[reply_len] = '\0';
456
pos = strchr(reply + 1, '"');
459
if (auth == AUTH_NONE || auth == AUTH_IEEE8021X)
462
wepEdit->setText(reply + 1);
463
} else if (res >= 0 && key_value_isset(reply, reply_len)) {
464
if (auth == AUTH_NONE || auth == AUTH_IEEE8021X)
466
wepEdit->setText(WPA_GUI_KEY_DATA);
470
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d wep_tx_keyidx", network_id);
471
reply_len = sizeof(reply) - 1;
472
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 1) {
473
reply[reply_len] = '\0';
474
switch (atoi(reply)) {
476
wep0Radio->setChecked(true);
479
wep1Radio->setChecked(true);
482
wep2Radio->setChecked(true);
485
wep3Radio->setChecked(true);
490
authSelect->setCurrentItem(auth);
492
encrSelect->setCurrentItem(encr);
493
if (auth == AUTH_NONE || auth == AUTH_IEEE8021X)
494
wepEnabled(encr == 1);
496
removeButton->setEnabled(true);
497
addButton->setText("Save");
501
void NetworkConfig::removeNetwork()
503
char reply[10], cmd[256];
506
if (QMessageBox::information(this, "wpa_gui",
507
"This will permanently remove the network\n"
508
"from the configuration. Do you really want\n"
509
"to remove this network?", "Yes", "No") != 0)
512
snprintf(cmd, sizeof(cmd), "REMOVE_NETWORK %d", edit_network_id);
513
reply_len = sizeof(reply);
514
wpagui->ctrlRequest(cmd, reply, &reply_len);
515
if (strncmp(reply, "OK", 2) != 0) {
516
QMessageBox::warning(this, "wpa_gui",
517
"Failed to remove network from wpa_supplicant\n"
520
wpagui->triggerUpdate();
521
wpagui->ctrlRequest("SAVE_CONFIG", reply, &reply_len);
528
void NetworkConfig::newNetwork()
535
void NetworkConfig::getEapCapa()
543
reply_len = sizeof(reply) - 1;
544
if (wpagui->ctrlRequest("GET_CAPABILITY eap", reply, &reply_len) < 0)
546
reply[reply_len] = '\0';
549
QStringList types = QStringList::split(QChar(' '), res);
550
eapSelect->insertStringList(types);