$search
00001 /* 00002 * wpa_gui - NetworkConfig class 00003 * Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi> 00004 * 00005 * This program is free software; you can redistribute it and/or modify 00006 * it under the terms of the GNU General Public License version 2 as 00007 * published by the Free Software Foundation. 00008 * 00009 * Alternatively, this software may be distributed under the terms of BSD 00010 * license. 00011 * 00012 * See README and COPYING for more details. 00013 */ 00014 00015 #include <cstdio> 00016 #include <QMessageBox> 00017 00018 #include "networkconfig.h" 00019 #include "wpagui.h" 00020 00021 enum { 00022 AUTH_NONE_OPEN, 00023 AUTH_NONE_WEP, 00024 AUTH_NONE_WEP_SHARED, 00025 AUTH_IEEE8021X, 00026 AUTH_WPA_PSK, 00027 AUTH_WPA_EAP, 00028 AUTH_WPA2_PSK, 00029 AUTH_WPA2_EAP 00030 }; 00031 00032 #define WPA_GUI_KEY_DATA "[key is configured]" 00033 00034 00035 NetworkConfig::NetworkConfig(QWidget *parent, const char *, bool, Qt::WFlags) 00036 : QDialog(parent) 00037 { 00038 setupUi(this); 00039 00040 encrSelect->setEnabled(false); 00041 connect(authSelect, SIGNAL(activated(int)), this, 00042 SLOT(authChanged(int))); 00043 connect(cancelButton, SIGNAL(clicked()), this, SLOT(close())); 00044 connect(addButton, SIGNAL(clicked()), this, SLOT(addNetwork())); 00045 connect(encrSelect, SIGNAL(activated(const QString &)), this, 00046 SLOT(encrChanged(const QString &))); 00047 connect(removeButton, SIGNAL(clicked()), this, SLOT(removeNetwork())); 00048 connect(eapSelect, SIGNAL(activated(int)), this, 00049 SLOT(eapChanged(int))); 00050 connect(useWpsButton, SIGNAL(clicked()), this, SLOT(useWps())); 00051 00052 wpagui = NULL; 00053 new_network = false; 00054 } 00055 00056 00057 NetworkConfig::~NetworkConfig() 00058 { 00059 } 00060 00061 00062 void NetworkConfig::languageChange() 00063 { 00064 retranslateUi(this); 00065 } 00066 00067 00068 void NetworkConfig::paramsFromScanResults(QTreeWidgetItem *sel) 00069 { 00070 new_network = true; 00071 00072 /* SSID BSSID frequency signal flags */ 00073 setWindowTitle(sel->text(0)); 00074 ssidEdit->setText(sel->text(0)); 00075 00076 QString flags = sel->text(4); 00077 int auth, encr = 0; 00078 if (flags.indexOf("[WPA2-EAP") >= 0) 00079 auth = AUTH_WPA2_EAP; 00080 else if (flags.indexOf("[WPA-EAP") >= 0) 00081 auth = AUTH_WPA_EAP; 00082 else if (flags.indexOf("[WPA2-PSK") >= 0) 00083 auth = AUTH_WPA2_PSK; 00084 else if (flags.indexOf("[WPA-PSK") >= 0) 00085 auth = AUTH_WPA_PSK; 00086 else 00087 auth = AUTH_NONE_OPEN; 00088 00089 if (flags.indexOf("-CCMP") >= 0) 00090 encr = 1; 00091 else if (flags.indexOf("-TKIP") >= 0) 00092 encr = 0; 00093 else if (flags.indexOf("WEP") >= 0) { 00094 encr = 1; 00095 if (auth == AUTH_NONE_OPEN) 00096 auth = AUTH_NONE_WEP; 00097 } else 00098 encr = 0; 00099 00100 authSelect->setCurrentIndex(auth); 00101 authChanged(auth); 00102 encrSelect->setCurrentIndex(encr); 00103 00104 wepEnabled(auth == AUTH_NONE_WEP); 00105 00106 getEapCapa(); 00107 00108 if (flags.indexOf("[WPS") >= 0) 00109 useWpsButton->setEnabled(true); 00110 bssid = sel->text(1); 00111 } 00112 00113 00114 void NetworkConfig::authChanged(int sel) 00115 { 00116 encrSelect->setEnabled(sel != AUTH_NONE_OPEN && sel != AUTH_NONE_WEP && 00117 sel != AUTH_NONE_WEP_SHARED); 00118 pskEdit->setEnabled(sel == AUTH_WPA_PSK || sel == AUTH_WPA2_PSK); 00119 bool eap = sel == AUTH_IEEE8021X || sel == AUTH_WPA_EAP || 00120 sel == AUTH_WPA2_EAP; 00121 eapSelect->setEnabled(eap); 00122 identityEdit->setEnabled(eap); 00123 passwordEdit->setEnabled(eap); 00124 cacertEdit->setEnabled(eap); 00125 phase2Select->setEnabled(eap); 00126 if (eap) 00127 eapChanged(eapSelect->currentIndex()); 00128 00129 while (encrSelect->count()) 00130 encrSelect->removeItem(0); 00131 00132 if (sel == AUTH_NONE_OPEN || sel == AUTH_NONE_WEP || 00133 sel == AUTH_NONE_WEP_SHARED || sel == AUTH_IEEE8021X) { 00134 encrSelect->addItem("None"); 00135 encrSelect->addItem("WEP"); 00136 encrSelect->setCurrentIndex(sel == AUTH_NONE_OPEN ? 0 : 1); 00137 } else { 00138 encrSelect->addItem("TKIP"); 00139 encrSelect->addItem("CCMP"); 00140 encrSelect->setCurrentIndex((sel == AUTH_WPA2_PSK || 00141 sel == AUTH_WPA2_EAP) ? 1 : 0); 00142 } 00143 00144 wepEnabled(sel == AUTH_NONE_WEP || sel == AUTH_NONE_WEP_SHARED); 00145 } 00146 00147 00148 void NetworkConfig::eapChanged(int sel) 00149 { 00150 QString prev_val = phase2Select->currentText(); 00151 while (phase2Select->count()) 00152 phase2Select->removeItem(0); 00153 00154 QStringList inner; 00155 inner << "PEAP" << "TTLS" << "FAST"; 00156 if (!inner.contains(eapSelect->itemText(sel))) 00157 return; 00158 00159 phase2Select->addItem("[ any ]"); 00160 00161 /* Add special cases based on outer method */ 00162 if (eapSelect->currentText().compare("TTLS") == 0) { 00163 phase2Select->addItem("PAP"); 00164 phase2Select->addItem("CHAP"); 00165 phase2Select->addItem("MSCHAP"); 00166 phase2Select->addItem("MSCHAPv2"); 00167 } else if (eapSelect->currentText().compare("FAST") == 0) 00168 phase2Select->addItem("GTC(auth) + MSCHAPv2(prov)"); 00169 00170 /* Add all enabled EAP methods that can be used in the tunnel */ 00171 int i; 00172 QStringList allowed; 00173 allowed << "MSCHAPV2" << "MD5" << "GTC" << "TLS" << "OTP" << "SIM" 00174 << "AKA"; 00175 for (i = 0; i < eapSelect->count(); i++) { 00176 if (allowed.contains(eapSelect->itemText(i))) { 00177 phase2Select->addItem("EAP-" + eapSelect->itemText(i)); 00178 } 00179 } 00180 00181 for (i = 0; i < phase2Select->count(); i++) { 00182 if (phase2Select->itemText(i).compare(prev_val) == 0) { 00183 phase2Select->setCurrentIndex(i); 00184 break; 00185 } 00186 } 00187 } 00188 00189 00190 void NetworkConfig::addNetwork() 00191 { 00192 char reply[10], cmd[256]; 00193 size_t reply_len; 00194 int id; 00195 int psklen = pskEdit->text().length(); 00196 int auth = authSelect->currentIndex(); 00197 00198 if (auth == AUTH_WPA_PSK || auth == AUTH_WPA2_PSK) { 00199 if (psklen < 8 || psklen > 64) { 00200 QMessageBox::warning( 00201 this, 00202 tr("WPA Pre-Shared Key Error"), 00203 tr("WPA-PSK requires a passphrase of 8 to 63 " 00204 "characters\n" 00205 "or 64 hex digit PSK")); 00206 pskEdit->setFocus(); 00207 return; 00208 } 00209 } 00210 00211 if (idstrEdit->isEnabled() && !idstrEdit->text().isEmpty()) { 00212 QRegExp rx("^(\\w|-)+$"); 00213 if (rx.indexIn(idstrEdit->text()) < 0) { 00214 QMessageBox::warning( 00215 this, tr("Network ID Error"), 00216 tr("Network ID String contains non-word " 00217 "characters.\n" 00218 "It must be a simple string, " 00219 "without spaces, containing\n" 00220 "only characters in this range: " 00221 "[A-Za-z0-9_-]\n")); 00222 idstrEdit->setFocus(); 00223 return; 00224 } 00225 } 00226 00227 if (wpagui == NULL) 00228 return; 00229 00230 memset(reply, 0, sizeof(reply)); 00231 reply_len = sizeof(reply) - 1; 00232 00233 if (new_network) { 00234 wpagui->ctrlRequest("ADD_NETWORK", reply, &reply_len); 00235 if (reply[0] == 'F') { 00236 QMessageBox::warning(this, "wpa_gui", 00237 tr("Failed to add " 00238 "network to wpa_supplicant\n" 00239 "configuration.")); 00240 return; 00241 } 00242 id = atoi(reply); 00243 } else 00244 id = edit_network_id; 00245 00246 setNetworkParam(id, "ssid", ssidEdit->text().toAscii().constData(), 00247 true); 00248 00249 const char *key_mgmt = NULL, *proto = NULL, *pairwise = NULL; 00250 switch (auth) { 00251 case AUTH_NONE_OPEN: 00252 case AUTH_NONE_WEP: 00253 case AUTH_NONE_WEP_SHARED: 00254 key_mgmt = "NONE"; 00255 break; 00256 case AUTH_IEEE8021X: 00257 key_mgmt = "IEEE8021X"; 00258 break; 00259 case AUTH_WPA_PSK: 00260 key_mgmt = "WPA-PSK"; 00261 proto = "WPA"; 00262 break; 00263 case AUTH_WPA_EAP: 00264 key_mgmt = "WPA-EAP"; 00265 proto = "WPA"; 00266 break; 00267 case AUTH_WPA2_PSK: 00268 key_mgmt = "WPA-PSK"; 00269 proto = "WPA2"; 00270 break; 00271 case AUTH_WPA2_EAP: 00272 key_mgmt = "WPA-EAP"; 00273 proto = "WPA2"; 00274 break; 00275 } 00276 00277 if (auth == AUTH_NONE_WEP_SHARED) 00278 setNetworkParam(id, "auth_alg", "SHARED", false); 00279 else 00280 setNetworkParam(id, "auth_alg", "OPEN", false); 00281 00282 if (auth == AUTH_WPA_PSK || auth == AUTH_WPA_EAP || 00283 auth == AUTH_WPA2_PSK || auth == AUTH_WPA2_EAP) { 00284 int encr = encrSelect->currentIndex(); 00285 if (encr == 0) 00286 pairwise = "TKIP"; 00287 else 00288 pairwise = "CCMP"; 00289 } 00290 00291 if (proto) 00292 setNetworkParam(id, "proto", proto, false); 00293 if (key_mgmt) 00294 setNetworkParam(id, "key_mgmt", key_mgmt, false); 00295 if (pairwise) { 00296 setNetworkParam(id, "pairwise", pairwise, false); 00297 setNetworkParam(id, "group", "TKIP CCMP WEP104 WEP40", false); 00298 } 00299 if (pskEdit->isEnabled() && 00300 strcmp(pskEdit->text().toAscii().constData(), 00301 WPA_GUI_KEY_DATA) != 0) 00302 setNetworkParam(id, "psk", 00303 pskEdit->text().toAscii().constData(), 00304 psklen != 64); 00305 if (eapSelect->isEnabled()) { 00306 const char *eap = 00307 eapSelect->currentText().toAscii().constData(); 00308 setNetworkParam(id, "eap", eap, false); 00309 if (strcmp(eap, "SIM") == 0 || strcmp(eap, "AKA") == 0) 00310 setNetworkParam(id, "pcsc", "", true); 00311 else 00312 setNetworkParam(id, "pcsc", "NULL", false); 00313 } 00314 if (phase2Select->isEnabled()) { 00315 QString eap = eapSelect->currentText(); 00316 QString inner = phase2Select->currentText(); 00317 char phase2[32]; 00318 phase2[0] = '\0'; 00319 if (eap.compare("PEAP") == 0) { 00320 if (inner.startsWith("EAP-")) 00321 snprintf(phase2, sizeof(phase2), "auth=%s", 00322 inner.right(inner.size() - 4). 00323 toAscii().constData()); 00324 } else if (eap.compare("TTLS") == 0) { 00325 if (inner.startsWith("EAP-")) 00326 snprintf(phase2, sizeof(phase2), "autheap=%s", 00327 inner.right(inner.size() - 4). 00328 toAscii().constData()); 00329 else 00330 snprintf(phase2, sizeof(phase2), "auth=%s", 00331 inner.toAscii().constData()); 00332 } else if (eap.compare("FAST") == 0) { 00333 const char *provisioning = NULL; 00334 if (inner.startsWith("EAP-")) { 00335 snprintf(phase2, sizeof(phase2), "auth=%s", 00336 inner.right(inner.size() - 4). 00337 toAscii().constData()); 00338 provisioning = "fast_provisioning=2"; 00339 } else if (inner.compare("GTC(auth) + MSCHAPv2(prov)") 00340 == 0) { 00341 snprintf(phase2, sizeof(phase2), 00342 "auth=GTC auth=MSCHAPV2"); 00343 provisioning = "fast_provisioning=1"; 00344 } else 00345 provisioning = "fast_provisioning=3"; 00346 if (provisioning) { 00347 char blob[32]; 00348 setNetworkParam(id, "phase1", provisioning, 00349 true); 00350 snprintf(blob, sizeof(blob), 00351 "blob://fast-pac-%d", id); 00352 setNetworkParam(id, "pac_file", blob, true); 00353 } 00354 } 00355 if (phase2[0]) 00356 setNetworkParam(id, "phase2", phase2, true); 00357 else 00358 setNetworkParam(id, "phase2", "NULL", false); 00359 } else 00360 setNetworkParam(id, "phase2", "NULL", false); 00361 if (identityEdit->isEnabled() && identityEdit->text().length() > 0) 00362 setNetworkParam(id, "identity", 00363 identityEdit->text().toAscii().constData(), 00364 true); 00365 else 00366 setNetworkParam(id, "identity", "NULL", false); 00367 if (passwordEdit->isEnabled() && passwordEdit->text().length() > 0 && 00368 strcmp(passwordEdit->text().toAscii().constData(), 00369 WPA_GUI_KEY_DATA) != 0) 00370 setNetworkParam(id, "password", 00371 passwordEdit->text().toAscii().constData(), 00372 true); 00373 else if (passwordEdit->text().length() == 0) 00374 setNetworkParam(id, "password", "NULL", false); 00375 if (cacertEdit->isEnabled() && cacertEdit->text().length() > 0) 00376 setNetworkParam(id, "ca_cert", 00377 cacertEdit->text().toAscii().constData(), 00378 true); 00379 else 00380 setNetworkParam(id, "ca_cert", "NULL", false); 00381 writeWepKey(id, wep0Edit, 0); 00382 writeWepKey(id, wep1Edit, 1); 00383 writeWepKey(id, wep2Edit, 2); 00384 writeWepKey(id, wep3Edit, 3); 00385 00386 if (wep0Radio->isEnabled() && wep0Radio->isChecked()) 00387 setNetworkParam(id, "wep_tx_keyidx", "0", false); 00388 else if (wep1Radio->isEnabled() && wep1Radio->isChecked()) 00389 setNetworkParam(id, "wep_tx_keyidx", "1", false); 00390 else if (wep2Radio->isEnabled() && wep2Radio->isChecked()) 00391 setNetworkParam(id, "wep_tx_keyidx", "2", false); 00392 else if (wep3Radio->isEnabled() && wep3Radio->isChecked()) 00393 setNetworkParam(id, "wep_tx_keyidx", "3", false); 00394 00395 if (idstrEdit->isEnabled() && idstrEdit->text().length() > 0) 00396 setNetworkParam(id, "id_str", 00397 idstrEdit->text().toAscii().constData(), 00398 true); 00399 else 00400 setNetworkParam(id, "id_str", "NULL", false); 00401 00402 if (prioritySpinBox->isEnabled()) { 00403 QString prio; 00404 prio = prio.setNum(prioritySpinBox->value()); 00405 setNetworkParam(id, "priority", prio.toAscii().constData(), 00406 false); 00407 } 00408 00409 snprintf(cmd, sizeof(cmd), "ENABLE_NETWORK %d", id); 00410 reply_len = sizeof(reply); 00411 wpagui->ctrlRequest(cmd, reply, &reply_len); 00412 if (strncmp(reply, "OK", 2) != 0) { 00413 QMessageBox::warning(this, "wpa_gui", 00414 tr("Failed to enable " 00415 "network in wpa_supplicant\n" 00416 "configuration.")); 00417 /* Network was added, so continue anyway */ 00418 } 00419 wpagui->triggerUpdate(); 00420 wpagui->ctrlRequest("SAVE_CONFIG", reply, &reply_len); 00421 00422 close(); 00423 } 00424 00425 00426 void NetworkConfig::setWpaGui(WpaGui *_wpagui) 00427 { 00428 wpagui = _wpagui; 00429 } 00430 00431 00432 int NetworkConfig::setNetworkParam(int id, const char *field, 00433 const char *value, bool quote) 00434 { 00435 char reply[10], cmd[256]; 00436 size_t reply_len; 00437 snprintf(cmd, sizeof(cmd), "SET_NETWORK %d %s %s%s%s", 00438 id, field, quote ? "\"" : "", value, quote ? "\"" : ""); 00439 reply_len = sizeof(reply); 00440 wpagui->ctrlRequest(cmd, reply, &reply_len); 00441 return strncmp(reply, "OK", 2) == 0 ? 0 : -1; 00442 } 00443 00444 00445 void NetworkConfig::encrChanged(const QString &) 00446 { 00447 } 00448 00449 00450 void NetworkConfig::wepEnabled(bool enabled) 00451 { 00452 wep0Edit->setEnabled(enabled); 00453 wep1Edit->setEnabled(enabled); 00454 wep2Edit->setEnabled(enabled); 00455 wep3Edit->setEnabled(enabled); 00456 wep0Radio->setEnabled(enabled); 00457 wep1Radio->setEnabled(enabled); 00458 wep2Radio->setEnabled(enabled); 00459 wep3Radio->setEnabled(enabled); 00460 } 00461 00462 00463 void NetworkConfig::writeWepKey(int network_id, QLineEdit *edit, int id) 00464 { 00465 char buf[10]; 00466 bool hex; 00467 const char *txt, *pos; 00468 size_t len; 00469 00470 if (!edit->isEnabled() || edit->text().isEmpty()) 00471 return; 00472 00473 /* 00474 * Assume hex key if only hex characters are present and length matches 00475 * with 40, 104, or 128-bit key 00476 */ 00477 txt = edit->text().toAscii().constData(); 00478 if (strcmp(txt, WPA_GUI_KEY_DATA) == 0) 00479 return; 00480 len = strlen(txt); 00481 if (len == 0) 00482 return; 00483 pos = txt; 00484 hex = true; 00485 while (*pos) { 00486 if (!((*pos >= '0' && *pos <= '9') || 00487 (*pos >= 'a' && *pos <= 'f') || 00488 (*pos >= 'A' && *pos <= 'F'))) { 00489 hex = false; 00490 break; 00491 } 00492 pos++; 00493 } 00494 if (hex && len != 10 && len != 26 && len != 32) 00495 hex = false; 00496 snprintf(buf, sizeof(buf), "wep_key%d", id); 00497 setNetworkParam(network_id, buf, txt, !hex); 00498 } 00499 00500 00501 static int key_value_isset(const char *reply, size_t reply_len) 00502 { 00503 return reply_len > 0 && (reply_len < 4 || memcmp(reply, "FAIL", 4) != 0); 00504 } 00505 00506 00507 void NetworkConfig::paramsFromConfig(int network_id) 00508 { 00509 int i, res; 00510 00511 edit_network_id = network_id; 00512 getEapCapa(); 00513 00514 char reply[1024], cmd[256], *pos; 00515 size_t reply_len; 00516 00517 snprintf(cmd, sizeof(cmd), "GET_NETWORK %d ssid", network_id); 00518 reply_len = sizeof(reply) - 1; 00519 if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && 00520 reply_len >= 2 && reply[0] == '"') { 00521 reply[reply_len] = '\0'; 00522 pos = strchr(reply + 1, '"'); 00523 if (pos) 00524 *pos = '\0'; 00525 ssidEdit->setText(reply + 1); 00526 } 00527 00528 snprintf(cmd, sizeof(cmd), "GET_NETWORK %d proto", network_id); 00529 reply_len = sizeof(reply) - 1; 00530 int wpa = 0; 00531 if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) { 00532 reply[reply_len] = '\0'; 00533 if (strstr(reply, "RSN") || strstr(reply, "WPA2")) 00534 wpa = 2; 00535 else if (strstr(reply, "WPA")) 00536 wpa = 1; 00537 } 00538 00539 int auth = AUTH_NONE_OPEN, encr = 0; 00540 snprintf(cmd, sizeof(cmd), "GET_NETWORK %d key_mgmt", network_id); 00541 reply_len = sizeof(reply) - 1; 00542 if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) { 00543 reply[reply_len] = '\0'; 00544 if (strstr(reply, "WPA-EAP")) 00545 auth = wpa & 2 ? AUTH_WPA2_EAP : AUTH_WPA_EAP; 00546 else if (strstr(reply, "WPA-PSK")) 00547 auth = wpa & 2 ? AUTH_WPA2_PSK : AUTH_WPA_PSK; 00548 else if (strstr(reply, "IEEE8021X")) { 00549 auth = AUTH_IEEE8021X; 00550 encr = 1; 00551 } 00552 } 00553 00554 snprintf(cmd, sizeof(cmd), "GET_NETWORK %d pairwise", network_id); 00555 reply_len = sizeof(reply) - 1; 00556 if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) { 00557 reply[reply_len] = '\0'; 00558 if (strstr(reply, "CCMP") && auth != AUTH_NONE_OPEN && 00559 auth != AUTH_NONE_WEP && auth != AUTH_NONE_WEP_SHARED) 00560 encr = 1; 00561 else if (strstr(reply, "TKIP")) 00562 encr = 0; 00563 else if (strstr(reply, "WEP")) 00564 encr = 1; 00565 else 00566 encr = 0; 00567 } 00568 00569 snprintf(cmd, sizeof(cmd), "GET_NETWORK %d psk", network_id); 00570 reply_len = sizeof(reply) - 1; 00571 res = wpagui->ctrlRequest(cmd, reply, &reply_len); 00572 if (res >= 0 && reply_len >= 2 && reply[0] == '"') { 00573 reply[reply_len] = '\0'; 00574 pos = strchr(reply + 1, '"'); 00575 if (pos) 00576 *pos = '\0'; 00577 pskEdit->setText(reply + 1); 00578 } else if (res >= 0 && key_value_isset(reply, reply_len)) { 00579 pskEdit->setText(WPA_GUI_KEY_DATA); 00580 } 00581 00582 snprintf(cmd, sizeof(cmd), "GET_NETWORK %d identity", network_id); 00583 reply_len = sizeof(reply) - 1; 00584 if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && 00585 reply_len >= 2 && reply[0] == '"') { 00586 reply[reply_len] = '\0'; 00587 pos = strchr(reply + 1, '"'); 00588 if (pos) 00589 *pos = '\0'; 00590 identityEdit->setText(reply + 1); 00591 } 00592 00593 snprintf(cmd, sizeof(cmd), "GET_NETWORK %d password", network_id); 00594 reply_len = sizeof(reply) - 1; 00595 res = wpagui->ctrlRequest(cmd, reply, &reply_len); 00596 if (res >= 0 && reply_len >= 2 && reply[0] == '"') { 00597 reply[reply_len] = '\0'; 00598 pos = strchr(reply + 1, '"'); 00599 if (pos) 00600 *pos = '\0'; 00601 passwordEdit->setText(reply + 1); 00602 } else if (res >= 0 && key_value_isset(reply, reply_len)) { 00603 passwordEdit->setText(WPA_GUI_KEY_DATA); 00604 } 00605 00606 snprintf(cmd, sizeof(cmd), "GET_NETWORK %d ca_cert", network_id); 00607 reply_len = sizeof(reply) - 1; 00608 if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && 00609 reply_len >= 2 && reply[0] == '"') { 00610 reply[reply_len] = '\0'; 00611 pos = strchr(reply + 1, '"'); 00612 if (pos) 00613 *pos = '\0'; 00614 cacertEdit->setText(reply + 1); 00615 } 00616 00617 enum { NO_INNER, PEAP_INNER, TTLS_INNER, FAST_INNER } eap = NO_INNER; 00618 snprintf(cmd, sizeof(cmd), "GET_NETWORK %d eap", network_id); 00619 reply_len = sizeof(reply) - 1; 00620 if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && 00621 reply_len >= 1) { 00622 reply[reply_len] = '\0'; 00623 for (i = 0; i < eapSelect->count(); i++) { 00624 if (eapSelect->itemText(i).compare(reply) == 0) { 00625 eapSelect->setCurrentIndex(i); 00626 if (strcmp(reply, "PEAP") == 0) 00627 eap = PEAP_INNER; 00628 else if (strcmp(reply, "TTLS") == 0) 00629 eap = TTLS_INNER; 00630 else if (strcmp(reply, "FAST") == 0) 00631 eap = FAST_INNER; 00632 break; 00633 } 00634 } 00635 } 00636 00637 if (eap != NO_INNER) { 00638 snprintf(cmd, sizeof(cmd), "GET_NETWORK %d phase2", 00639 network_id); 00640 reply_len = sizeof(reply) - 1; 00641 if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && 00642 reply_len >= 1) { 00643 reply[reply_len] = '\0'; 00644 eapChanged(eapSelect->currentIndex()); 00645 } else 00646 eap = NO_INNER; 00647 } 00648 00649 char *val; 00650 val = reply + 1; 00651 while (*(val + 1)) 00652 val++; 00653 if (*val == '"') 00654 *val = '\0'; 00655 00656 switch (eap) { 00657 case PEAP_INNER: 00658 if (strncmp(reply, "\"auth=", 6)) 00659 break; 00660 val = reply + 2; 00661 memcpy(val, "EAP-", 4); 00662 break; 00663 case TTLS_INNER: 00664 if (strncmp(reply, "\"autheap=", 9) == 0) { 00665 val = reply + 5; 00666 memcpy(val, "EAP-", 4); 00667 } else if (strncmp(reply, "\"auth=", 6) == 0) 00668 val = reply + 6; 00669 break; 00670 case FAST_INNER: 00671 if (strncmp(reply, "\"auth=", 6)) 00672 break; 00673 if (strcmp(reply + 6, "GTC auth=MSCHAPV2") == 0) { 00674 val = (char *) "GTC(auth) + MSCHAPv2(prov)"; 00675 break; 00676 } 00677 val = reply + 2; 00678 memcpy(val, "EAP-", 4); 00679 break; 00680 case NO_INNER: 00681 break; 00682 } 00683 00684 for (i = 0; i < phase2Select->count(); i++) { 00685 if (phase2Select->itemText(i).compare(val) == 0) { 00686 phase2Select->setCurrentIndex(i); 00687 break; 00688 } 00689 } 00690 00691 for (i = 0; i < 4; i++) { 00692 QLineEdit *wepEdit; 00693 switch (i) { 00694 default: 00695 case 0: 00696 wepEdit = wep0Edit; 00697 break; 00698 case 1: 00699 wepEdit = wep1Edit; 00700 break; 00701 case 2: 00702 wepEdit = wep2Edit; 00703 break; 00704 case 3: 00705 wepEdit = wep3Edit; 00706 break; 00707 } 00708 snprintf(cmd, sizeof(cmd), "GET_NETWORK %d wep_key%d", 00709 network_id, i); 00710 reply_len = sizeof(reply) - 1; 00711 res = wpagui->ctrlRequest(cmd, reply, &reply_len); 00712 if (res >= 0 && reply_len >= 2 && reply[0] == '"') { 00713 reply[reply_len] = '\0'; 00714 pos = strchr(reply + 1, '"'); 00715 if (pos) 00716 *pos = '\0'; 00717 if (auth == AUTH_NONE_OPEN || auth == AUTH_IEEE8021X) { 00718 if (auth == AUTH_NONE_OPEN) 00719 auth = AUTH_NONE_WEP; 00720 encr = 1; 00721 } 00722 00723 wepEdit->setText(reply + 1); 00724 } else if (res >= 0 && key_value_isset(reply, reply_len)) { 00725 if (auth == AUTH_NONE_OPEN || auth == AUTH_IEEE8021X) { 00726 if (auth == AUTH_NONE_OPEN) 00727 auth = AUTH_NONE_WEP; 00728 encr = 1; 00729 } 00730 wepEdit->setText(WPA_GUI_KEY_DATA); 00731 } 00732 } 00733 00734 if (auth == AUTH_NONE_WEP) { 00735 snprintf(cmd, sizeof(cmd), "GET_NETWORK %d auth_alg", 00736 network_id); 00737 reply_len = sizeof(reply) - 1; 00738 if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) { 00739 reply[reply_len] = '\0'; 00740 if (strcmp(reply, "SHARED") == 0) 00741 auth = AUTH_NONE_WEP_SHARED; 00742 } 00743 } 00744 00745 snprintf(cmd, sizeof(cmd), "GET_NETWORK %d wep_tx_keyidx", network_id); 00746 reply_len = sizeof(reply) - 1; 00747 if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 1) 00748 { 00749 reply[reply_len] = '\0'; 00750 switch (atoi(reply)) { 00751 case 0: 00752 wep0Radio->setChecked(true); 00753 break; 00754 case 1: 00755 wep1Radio->setChecked(true); 00756 break; 00757 case 2: 00758 wep2Radio->setChecked(true); 00759 break; 00760 case 3: 00761 wep3Radio->setChecked(true); 00762 break; 00763 } 00764 } 00765 00766 snprintf(cmd, sizeof(cmd), "GET_NETWORK %d id_str", network_id); 00767 reply_len = sizeof(reply) - 1; 00768 if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && 00769 reply_len >= 2 && reply[0] == '"') { 00770 reply[reply_len] = '\0'; 00771 pos = strchr(reply + 1, '"'); 00772 if (pos) 00773 *pos = '\0'; 00774 idstrEdit->setText(reply + 1); 00775 } 00776 00777 snprintf(cmd, sizeof(cmd), "GET_NETWORK %d priority", network_id); 00778 reply_len = sizeof(reply) - 1; 00779 if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 1) 00780 { 00781 reply[reply_len] = '\0'; 00782 prioritySpinBox->setValue(atoi(reply)); 00783 } 00784 00785 authSelect->setCurrentIndex(auth); 00786 authChanged(auth); 00787 encrSelect->setCurrentIndex(encr); 00788 wepEnabled(auth == AUTH_NONE_WEP || auth == AUTH_NONE_WEP_SHARED); 00789 00790 removeButton->setEnabled(true); 00791 addButton->setText("Save"); 00792 } 00793 00794 00795 void NetworkConfig::removeNetwork() 00796 { 00797 char reply[10], cmd[256]; 00798 size_t reply_len; 00799 00800 if (QMessageBox::information( 00801 this, "wpa_gui", 00802 tr("This will permanently remove the network\n" 00803 "from the configuration. Do you really want\n" 00804 "to remove this network?"), 00805 tr("Yes"), tr("No")) != 0) 00806 return; 00807 00808 snprintf(cmd, sizeof(cmd), "REMOVE_NETWORK %d", edit_network_id); 00809 reply_len = sizeof(reply); 00810 wpagui->ctrlRequest(cmd, reply, &reply_len); 00811 if (strncmp(reply, "OK", 2) != 0) { 00812 QMessageBox::warning(this, "wpa_gui", 00813 tr("Failed to remove network from " 00814 "wpa_supplicant\n" 00815 "configuration.")); 00816 } else { 00817 wpagui->triggerUpdate(); 00818 wpagui->ctrlRequest("SAVE_CONFIG", reply, &reply_len); 00819 } 00820 00821 close(); 00822 } 00823 00824 00825 void NetworkConfig::newNetwork() 00826 { 00827 new_network = true; 00828 getEapCapa(); 00829 } 00830 00831 00832 void NetworkConfig::getEapCapa() 00833 { 00834 char reply[256]; 00835 size_t reply_len; 00836 00837 if (wpagui == NULL) 00838 return; 00839 00840 reply_len = sizeof(reply) - 1; 00841 if (wpagui->ctrlRequest("GET_CAPABILITY eap", reply, &reply_len) < 0) 00842 return; 00843 reply[reply_len] = '\0'; 00844 00845 QString res(reply); 00846 QStringList types = res.split(QChar(' ')); 00847 eapSelect->insertItems(-1, types); 00848 } 00849 00850 00851 void NetworkConfig::useWps() 00852 { 00853 if (wpagui == NULL) 00854 return; 00855 wpagui->setBssFromScan(bssid); 00856 wpagui->wpsDialog(); 00857 close(); 00858 }