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
char *key_mgmt = NULL, *proto = NULL, *pairwise = NULL;
140
key_mgmt = "IEEE8021X";
143
key_mgmt = "WPA-PSK";
147
key_mgmt = "WPA-EAP";
151
key_mgmt = "WPA-PSK";
155
key_mgmt = "WPA-EAP";
160
if (auth == AUTH_WPA_PSK || auth == AUTH_WPA_EAP ||
161
auth == AUTH_WPA2_PSK || auth == AUTH_WPA2_EAP) {
162
int encr = encrSelect->currentItem();
170
setNetworkParam(id, "proto", proto, false);
172
setNetworkParam(id, "key_mgmt", key_mgmt, false);
174
setNetworkParam(id, "pairwise", pairwise, false);
175
setNetworkParam(id, "group", "TKIP CCMP WEP104 WEP40", false);
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);
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);
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"
209
/* Network was added, so continue anyway */
211
wpagui->triggerUpdate();
212
wpagui->ctrlRequest("SAVE_CONFIG", reply, &reply_len);
218
void NetworkConfig::setWpaGui( WpaGui *_wpagui )
224
int NetworkConfig::setNetworkParam(int id, const char *field, const char *value, bool quote)
226
char reply[10], cmd[256];
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;
236
void NetworkConfig::encrChanged( const QString &sel )
238
wepEnabled(sel.find("WEP") == 0);
242
void NetworkConfig::wepEnabled( bool enabled )
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);
255
void NetworkConfig::writeWepKey( int network_id, QLineEdit *edit, int id )
259
const char *txt, *pos;
262
if (!edit->isEnabled() || edit->text().isEmpty())
266
* Assume hex key if only hex characters are present and length matches
267
* with 40, 104, or 128-bit key
269
txt = edit->text().ascii();
270
if (strcmp(txt, WPA_GUI_KEY_DATA) == 0)
278
if (!((*pos >= '0' && *pos <= '9') || (*pos >= 'a' && *pos <= 'f') ||
279
(*pos >= 'A' && *pos <= 'F'))) {
285
if (hex && len != 10 && len != 26 && len != 32)
287
snprintf(buf, sizeof(buf), "wep_key%d", id);
288
setNetworkParam(network_id, buf, txt, !hex);
292
static int key_value_isset(const char *reply, size_t reply_len)
294
return reply_len > 0 && (reply_len < 4 || memcmp(reply, "FAIL", 4) != 0);
298
void NetworkConfig::paramsFromConfig( int network_id )
302
edit_network_id = network_id;
305
char reply[1024], cmd[256], *pos;
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 &&
312
reply[reply_len] = '\0';
313
pos = strchr(reply + 1, '"');
316
ssidEdit->setText(reply + 1);
319
snprintf(cmd, sizeof(cmd), "GET_NETWORK %d proto", network_id);
320
reply_len = sizeof(reply) - 1;
322
if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) {
323
reply[reply_len] = '\0';
324
if (strstr(reply, "RSN") || strstr(reply, "WPA2"))
326
else if (strstr(reply, "WPA"))
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;
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"))
351
else if (strstr(reply, "TKIP"))
353
else if (strstr(reply, "WEP"))
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, '"');
367
pskEdit->setText(reply + 1);
368
} else if (res >= 0 && key_value_isset(reply, reply_len)) {
369
pskEdit->setText(WPA_GUI_KEY_DATA);
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 &&
376
reply[reply_len] = '\0';
377
pos = strchr(reply + 1, '"');
380
identityEdit->setText(reply + 1);
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 &&
388
reply[reply_len] = '\0';
389
pos = strchr(reply + 1, '"');
392
passwordEdit->setText(reply + 1);
393
} else if (res >= 0 && key_value_isset(reply, reply_len)) {
394
passwordEdit->setText(WPA_GUI_KEY_DATA);
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 &&
401
reply[reply_len] = '\0';
402
pos = strchr(reply + 1, '"');
405
cacertEdit->setText(reply + 1);
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);
420
for (i = 0; i < 4; i++) {
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, '"');
445
if (auth == AUTH_NONE || auth == AUTH_IEEE8021X)
448
wepEdit->setText(reply + 1);
449
} else if (res >= 0 && key_value_isset(reply, reply_len)) {
450
if (auth == AUTH_NONE || auth == AUTH_IEEE8021X)
452
wepEdit->setText(WPA_GUI_KEY_DATA);
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)) {
462
wep0Radio->setChecked(true);
465
wep1Radio->setChecked(true);
468
wep2Radio->setChecked(true);
471
wep3Radio->setChecked(true);
476
authSelect->setCurrentItem(auth);
478
encrSelect->setCurrentItem(encr);
479
if (auth == AUTH_NONE || auth == AUTH_IEEE8021X)
480
wepEnabled(encr == 1);
482
removeButton->setEnabled(true);
483
addButton->setText("Save");
487
void NetworkConfig::removeNetwork()
489
char reply[10], cmd[256];
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)
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"
506
wpagui->triggerUpdate();
507
wpagui->ctrlRequest("SAVE_CONFIG", reply, &reply_len);
514
void NetworkConfig::newNetwork()
521
void NetworkConfig::getEapCapa()
529
reply_len = sizeof(reply) - 1;
530
if (wpagui->ctrlRequest("GET_CAPABILITY eap", reply, &reply_len) < 0)
532
reply[reply_len] = '\0';
535
QStringList types = QStringList::split(QChar(' '), res);
536
eapSelect->insertStringList(types);