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);