1526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt/****************************************************************************
2526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt** ui.h extension file, included from the uic-generated form implementation.
3526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt**
4526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt** If you want to add, delete, or rename functions or slots, use
5526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt** Qt Designer to update this file, preserving your code.
6526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt**
7526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt** You should not define a constructor or destructor in this file.
8526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt** Instead, write your code in functions called init() and destroy().
9526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt** These will automatically be called by the form's constructor and
10526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt** destructor.
11526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt*****************************************************************************/
12526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
13526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#include <stdlib.h>
14526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
15526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtenum {
16526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    AUTH_NONE = 0,
17526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    AUTH_IEEE8021X = 1,
18526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    AUTH_WPA_PSK = 2,
19526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    AUTH_WPA_EAP = 3,
20526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    AUTH_WPA2_PSK = 4,
21526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    AUTH_WPA2_EAP = 5
22526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt};
23526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
24526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt#define WPA_GUI_KEY_DATA "[key is configured]"
25526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
26526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid NetworkConfig::init()
27526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
28526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wpagui = NULL;
29526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    new_network = false;
30526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
31526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
32526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid NetworkConfig::paramsFromScanResults(Q3ListViewItem *sel)
33526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
34526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    new_network = true;
35526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
36526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    /* SSID BSSID frequency signal flags */
37526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    setCaption(sel->text(0));
38526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    ssidEdit->setText(sel->text(0));
39526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
40526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    QString flags = sel->text(4);
41526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    int auth, encr = 0;
42526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (flags.find("[WPA2-EAP") >= 0)
43526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	auth = AUTH_WPA2_EAP;
44526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    else if (flags.find("[WPA-EAP") >= 0)
45526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	auth = AUTH_WPA_EAP;
46526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    else if (flags.find("[WPA2-PSK") >= 0)
47526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	auth = AUTH_WPA2_PSK;
48526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    else if (flags.find("[WPA-PSK") >= 0)
49526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	auth = AUTH_WPA_PSK;
50526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    else
51526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	auth = AUTH_NONE;
52526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
53526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (flags.find("-CCMP") >= 0)
54526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	encr = 1;
55526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    else if (flags.find("-TKIP") >= 0)
56526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	encr = 0;
57526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    else if (flags.find("WEP") >= 0)
58526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	encr = 1;
59526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    else
60526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	encr = 0;
61526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
62526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    authSelect->setCurrentItem(auth);
63526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    authChanged(auth);
64526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    encrSelect->setCurrentItem(encr);
65526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
66526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    getEapCapa();
67526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
68526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
69526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
70526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid NetworkConfig::authChanged(int sel)
71526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
72526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    pskEdit->setEnabled(sel == AUTH_WPA_PSK || sel == AUTH_WPA2_PSK);
73526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    bool eap = sel == AUTH_IEEE8021X || sel == AUTH_WPA_EAP ||
74526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	       sel == AUTH_WPA2_EAP;
75526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    eapSelect->setEnabled(eap);
76526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    identityEdit->setEnabled(eap);
77526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    passwordEdit->setEnabled(eap);
78526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    cacertEdit->setEnabled(eap);
79526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
80526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    while (encrSelect->count())
81526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	encrSelect->removeItem(0);
82526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
83526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (sel == AUTH_NONE || sel == AUTH_IEEE8021X) {
84526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	encrSelect->insertItem("None");
85526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	encrSelect->insertItem("WEP");
86526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	encrSelect->setCurrentItem(sel == AUTH_NONE ? 0 : 1);
87526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    } else {
88526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	encrSelect->insertItem("TKIP");
89526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	encrSelect->insertItem("CCMP");
90526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	encrSelect->setCurrentItem((sel == AUTH_WPA2_PSK ||
91526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				    sel == AUTH_WPA2_EAP) ? 1 : 0);
92526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
93526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
94526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wepEnabled(sel == AUTH_IEEE8021X);
95526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
96526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
97526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
98526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid NetworkConfig::addNetwork()
99526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
100526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char reply[10], cmd[256];
101526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    size_t reply_len;
102526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    int id;
103526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    int psklen = pskEdit->text().length();
104526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    int auth = authSelect->currentItem();
105526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
106526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (auth == AUTH_WPA_PSK || auth == AUTH_WPA2_PSK) {
107526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (psklen < 8 || psklen > 64) {
108526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    QMessageBox::warning(this, "wpa_gui", "WPA-PSK requires a passphrase "
109526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				 "of 8 to 63 characters\n"
110526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				 "or 64 hex digit PSK");
111526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    return;
112526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
113526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
114526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
115526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (wpagui == NULL)
116526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
117526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
118526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    memset(reply, 0, sizeof(reply));
119526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply) - 1;
120526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
121526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (new_network) {
122526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpagui->ctrlRequest("ADD_NETWORK", reply, &reply_len);
123526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (reply[0] == 'F') {
124526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    QMessageBox::warning(this, "wpa_gui", "Failed to add network to wpa_supplicant\n"
125526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				 "configuration.");
126526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    return;
127526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
128526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	id = atoi(reply);
129526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    } else {
130526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	id = edit_network_id;
131526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
132526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
133526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    setNetworkParam(id, "ssid", ssidEdit->text().ascii(), true);
134526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
135526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (idstrEdit->isEnabled())
136526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	setNetworkParam(id, "id_str", idstrEdit->text().ascii(), true);
137526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
138526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    const char *key_mgmt = NULL, *proto = NULL, *pairwise = NULL;
139526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    switch (auth) {
140526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    case AUTH_NONE:
141526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	key_mgmt = "NONE";
142526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	break;
143526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    case AUTH_IEEE8021X:
144526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	key_mgmt = "IEEE8021X";
145526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	break;
146526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    case AUTH_WPA_PSK:
147526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	key_mgmt = "WPA-PSK";
148526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	proto = "WPA";
149526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	break;
150526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    case AUTH_WPA_EAP:
151526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	key_mgmt = "WPA-EAP";
152526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	proto = "WPA";
153526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	break;
154526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    case AUTH_WPA2_PSK:
155526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	key_mgmt = "WPA-PSK";
156526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	proto = "WPA2";
157526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	break;
158526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    case AUTH_WPA2_EAP:
159526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	key_mgmt = "WPA-EAP";
160526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	proto = "WPA2";
161526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	break;
162526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
163526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
164526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (auth == AUTH_WPA_PSK || auth == AUTH_WPA_EAP ||
165526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	auth == AUTH_WPA2_PSK || auth == AUTH_WPA2_EAP) {
166526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	int encr = encrSelect->currentItem();
167526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (encr == 0)
168526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    pairwise = "TKIP";
169526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	else
170526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    pairwise = "CCMP";
171526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
172526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
173526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (proto)
174526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	setNetworkParam(id, "proto", proto, false);
175526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (key_mgmt)
176526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	setNetworkParam(id, "key_mgmt", key_mgmt, false);
177526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (pairwise) {
178526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	setNetworkParam(id, "pairwise", pairwise, false);
179526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	setNetworkParam(id, "group", "TKIP CCMP WEP104 WEP40", false);
180526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
181526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (pskEdit->isEnabled() &&
182526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	strcmp(pskEdit->text().ascii(), WPA_GUI_KEY_DATA) != 0)
183526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	setNetworkParam(id, "psk", pskEdit->text().ascii(), psklen != 64);
184526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (eapSelect->isEnabled())
185526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	setNetworkParam(id, "eap", eapSelect->currentText().ascii(), false);
186526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (identityEdit->isEnabled())
187526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	setNetworkParam(id, "identity", identityEdit->text().ascii(), true);
188526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (passwordEdit->isEnabled() &&
189526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	strcmp(passwordEdit->text().ascii(), WPA_GUI_KEY_DATA) != 0)
190526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	setNetworkParam(id, "password", passwordEdit->text().ascii(), true);
191526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (cacertEdit->isEnabled())
192526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	setNetworkParam(id, "ca_cert", cacertEdit->text().ascii(), true);
193526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    writeWepKey(id, wep0Edit, 0);
194526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    writeWepKey(id, wep1Edit, 1);
195526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    writeWepKey(id, wep2Edit, 2);
196526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    writeWepKey(id, wep3Edit, 3);
197526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
198526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (wep0Radio->isEnabled() && wep0Radio->isChecked())
199526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	setNetworkParam(id, "wep_tx_keyidx", "0", false);
200526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    else if (wep1Radio->isEnabled() && wep1Radio->isChecked())
201526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	setNetworkParam(id, "wep_tx_keyidx", "1", false);
202526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    else if (wep2Radio->isEnabled() && wep2Radio->isChecked())
203526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	setNetworkParam(id, "wep_tx_keyidx", "2", false);
204526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    else if (wep3Radio->isEnabled() && wep3Radio->isChecked())
205526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	setNetworkParam(id, "wep_tx_keyidx", "3", false);
206526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
207526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cmd, sizeof(cmd), "ENABLE_NETWORK %d", id);
208526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply);
209526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wpagui->ctrlRequest(cmd, reply, &reply_len);
210526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (strncmp(reply, "OK", 2) != 0) {
211526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	QMessageBox::warning(this, "wpa_gui", "Failed to enable network in wpa_supplicant\n"
212526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			     "configuration.");
213526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	/* Network was added, so continue anyway */
214526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
215526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wpagui->triggerUpdate();
216526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wpagui->ctrlRequest("SAVE_CONFIG", reply, &reply_len);
217526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
218526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    close();
219526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
220526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
221526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
222526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid NetworkConfig::setWpaGui( WpaGui *_wpagui )
223526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
224526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wpagui = _wpagui;
225526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
226526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
227526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
228526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtint NetworkConfig::setNetworkParam(int id, const char *field, const char *value, bool quote)
229526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
230526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char reply[10], cmd[256];
231526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    size_t reply_len;
232526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cmd, sizeof(cmd), "SET_NETWORK %d %s %s%s%s",
233526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	     id, field, quote ? "\"" : "", value, quote ? "\"" : "");
234526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply);
235526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wpagui->ctrlRequest(cmd, reply, &reply_len);
236526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    return strncmp(reply, "OK", 2) == 0 ? 0 : -1;
237526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
238526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
239526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
240526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid NetworkConfig::encrChanged( const QString &sel )
241526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
242526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wepEnabled(sel.find("WEP") == 0);
243526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
244526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
245526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
246526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid NetworkConfig::wepEnabled( bool enabled )
247526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
248526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wep0Edit->setEnabled(enabled);
249526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wep1Edit->setEnabled(enabled);
250526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wep2Edit->setEnabled(enabled);
251526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wep3Edit->setEnabled(enabled);
252526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wep0Radio->setEnabled(enabled);
253526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wep1Radio->setEnabled(enabled);
254526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wep2Radio->setEnabled(enabled);
255526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wep3Radio->setEnabled(enabled);
256526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
257526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
258526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
259526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid NetworkConfig::writeWepKey( int network_id, QLineEdit *edit, int id )
260526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
261526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char buf[10];
262526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    bool hex;
263526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    const char *txt, *pos;
264526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    size_t len;
265526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
266526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (!edit->isEnabled() || edit->text().isEmpty())
267526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
268526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
269526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    /*
270526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt        * Assume hex key if only hex characters are present and length matches
271526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt       * with 40, 104, or 128-bit key
272526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt       */
273526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    txt = edit->text().ascii();
274526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (strcmp(txt, WPA_GUI_KEY_DATA) == 0)
275526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
276526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    len = strlen(txt);
277526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (len == 0)
278526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
279526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    pos = txt;
280526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    hex = true;
281526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    while (*pos) {
282526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (!((*pos >= '0' && *pos <= '9') || (*pos >= 'a' && *pos <= 'f') ||
283526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	      (*pos >= 'A' && *pos <= 'F'))) {
284526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    hex = false;
285526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
286526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
287526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos++;
288526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
289526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (hex && len != 10 && len != 26 && len != 32)
290526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	hex = false;
291526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(buf, sizeof(buf), "wep_key%d", id);
292526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    setNetworkParam(network_id, buf, txt, !hex);
293526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
294526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
295526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
296526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtstatic int key_value_isset(const char *reply, size_t reply_len)
297526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
298526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    return reply_len > 0 && (reply_len < 4 || memcmp(reply, "FAIL", 4) != 0);
299526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
300526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
301526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
302526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid NetworkConfig::paramsFromConfig( int network_id )
303526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
304526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    int i, res;
305526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
306526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    edit_network_id = network_id;
307526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    getEapCapa();
308526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
309526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char reply[1024], cmd[256], *pos;
310526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    size_t reply_len;
311526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
312526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cmd, sizeof(cmd), "GET_NETWORK %d ssid", network_id);
313526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply) - 1;
314526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 2 &&
315526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[0] == '"') {
316526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[reply_len] = '\0';
317526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = strchr(reply + 1, '"');
318526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (pos)
319526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    *pos = '\0';
320526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	ssidEdit->setText(reply + 1);
321526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
322526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
323526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cmd, sizeof(cmd), "GET_NETWORK %d id_str", network_id);
324526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply) - 1;
325526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 2 &&
326526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[0] == '"') {
327526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[reply_len] = '\0';
328526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = strchr(reply + 1, '"');
329526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (pos)
330526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    *pos = '\0';
331526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	idstrEdit->setText(reply + 1);
332526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
333526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
334526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cmd, sizeof(cmd), "GET_NETWORK %d proto", network_id);
335526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply) - 1;
336526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    int wpa = 0;
337526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) {
338526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[reply_len] = '\0';
339526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (strstr(reply, "RSN") || strstr(reply, "WPA2"))
340526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    wpa = 2;
341526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	else if (strstr(reply, "WPA"))
342526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    wpa = 1;
343526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
344526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
345526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    int auth = AUTH_NONE, encr = 0;
346526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cmd, sizeof(cmd), "GET_NETWORK %d key_mgmt", network_id);
347526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply) - 1;
348526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) {
349526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[reply_len] = '\0';
350526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (strstr(reply, "WPA-EAP"))
351526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    auth = wpa & 2 ? AUTH_WPA2_EAP : AUTH_WPA_EAP;
352526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	else if (strstr(reply, "WPA-PSK"))
353526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    auth = wpa & 2 ? AUTH_WPA2_PSK : AUTH_WPA_PSK;
354526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	else if (strstr(reply, "IEEE8021X")) {
355526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    auth = AUTH_IEEE8021X;
356526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    encr = 1;
357526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
358526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
359526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
360526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cmd, sizeof(cmd), "GET_NETWORK %d pairwise", network_id);
361526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply) - 1;
362526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0) {
363526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[reply_len] = '\0';
364526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (strstr(reply, "CCMP") && auth != AUTH_NONE)
365526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    encr = 1;
366526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	else if (strstr(reply, "TKIP"))
367526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    encr = 0;
368526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	else if (strstr(reply, "WEP"))
369526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    encr = 1;
370526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	else
371526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    encr = 0;
372526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
373526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
374526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cmd, sizeof(cmd), "GET_NETWORK %d psk", network_id);
375526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply) - 1;
376526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    res = wpagui->ctrlRequest(cmd, reply, &reply_len);
377526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (res >= 0 && reply_len >= 2 && reply[0] == '"') {
378526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[reply_len] = '\0';
379526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = strchr(reply + 1, '"');
380526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (pos)
381526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    *pos = '\0';
382526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pskEdit->setText(reply + 1);
383526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    } else if (res >= 0 && key_value_isset(reply, reply_len)) {
384526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pskEdit->setText(WPA_GUI_KEY_DATA);
385526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
386526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
387526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cmd, sizeof(cmd), "GET_NETWORK %d identity", network_id);
388526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply) - 1;
389526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 2 &&
390526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[0] == '"') {
391526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[reply_len] = '\0';
392526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = strchr(reply + 1, '"');
393526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (pos)
394526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    *pos = '\0';
395526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	identityEdit->setText(reply + 1);
396526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
397526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
398526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cmd, sizeof(cmd), "GET_NETWORK %d password", network_id);
399526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply) - 1;
400526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    res = wpagui->ctrlRequest(cmd, reply, &reply_len);
401526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (res >= 0 && reply_len >= 2 &&
402526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[0] == '"') {
403526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[reply_len] = '\0';
404526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = strchr(reply + 1, '"');
405526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (pos)
406526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    *pos = '\0';
407526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	passwordEdit->setText(reply + 1);
408526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    } else if (res >= 0 && key_value_isset(reply, reply_len)) {
409526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	passwordEdit->setText(WPA_GUI_KEY_DATA);
410526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
411526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
412526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cmd, sizeof(cmd), "GET_NETWORK %d ca_cert", network_id);
413526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply) - 1;
414526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 2 &&
415526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[0] == '"') {
416526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[reply_len] = '\0';
417526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	pos = strchr(reply + 1, '"');
418526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (pos)
419526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    *pos = '\0';
420526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	cacertEdit->setText(reply + 1);
421526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
422526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
423526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cmd, sizeof(cmd), "GET_NETWORK %d eap", network_id);
424526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply) - 1;
425526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 1) {
426526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[reply_len] = '\0';
427526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	for (i = 0; i < eapSelect->count(); i++) {
428526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    if (eapSelect->text(i).compare(reply) == 0) {
429526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		eapSelect->setCurrentItem(i);
430526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		break;
431526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    }
432526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
433526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
434526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
435526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    for (i = 0; i < 4; i++) {
436526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	QLineEdit *wepEdit;
437526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	switch (i) {
438526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	default:
439526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	case 0:
440526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    wepEdit = wep0Edit;
441526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
442526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	case 1:
443526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    wepEdit = wep1Edit;
444526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
445526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	case 2:
446526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    wepEdit = wep2Edit;
447526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
448526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	case 3:
449526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    wepEdit = wep3Edit;
450526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
451526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
452526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	snprintf(cmd, sizeof(cmd), "GET_NETWORK %d wep_key%d", network_id, i);
453526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply_len = sizeof(reply) - 1;
454526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	res = wpagui->ctrlRequest(cmd, reply, &reply_len);
455526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	if (res >= 0 && reply_len >= 2 && reply[0] == '"') {
456526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    reply[reply_len] = '\0';
457526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    pos = strchr(reply + 1, '"');
458526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    if (pos)
459526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		*pos = '\0';
460526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    if (auth == AUTH_NONE || auth == AUTH_IEEE8021X)
461526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		encr = 1;
462526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
463526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    wepEdit->setText(reply + 1);
464526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	} else if (res >= 0 && key_value_isset(reply, reply_len)) {
465526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    if (auth == AUTH_NONE || auth == AUTH_IEEE8021X)
466526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt		encr = 1;
467526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    wepEdit->setText(WPA_GUI_KEY_DATA);
468526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
469526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
470526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
471526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cmd, sizeof(cmd), "GET_NETWORK %d wep_tx_keyidx", network_id);
472526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply) - 1;
473526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (wpagui->ctrlRequest(cmd, reply, &reply_len) >= 0 && reply_len >= 1) {
474526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	reply[reply_len] = '\0';
475526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	switch (atoi(reply)) {
476526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	case 0:
477526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    wep0Radio->setChecked(true);
478526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
479526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	case 1:
480526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    wep1Radio->setChecked(true);
481526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
482526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	case 2:
483526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    wep2Radio->setChecked(true);
484526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
485526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	case 3:
486526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    wep3Radio->setChecked(true);
487526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	    break;
488526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	}
489526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
490526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
491526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    authSelect->setCurrentItem(auth);
492526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    authChanged(auth);
493526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    encrSelect->setCurrentItem(encr);
494526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (auth == AUTH_NONE || auth == AUTH_IEEE8021X)
495526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wepEnabled(encr == 1);
496526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
497526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    removeButton->setEnabled(true);
498526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    addButton->setText("Save");
499526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
500526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
501526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
502526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid NetworkConfig::removeNetwork()
503526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
504526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char reply[10], cmd[256];
505526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    size_t reply_len;
506526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
507526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (QMessageBox::information(this, "wpa_gui",
508526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				 "This will permanently remove the network\n"
509526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				 "from the configuration. Do you really want\n"
510526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt				 "to remove this network?", "Yes", "No") != 0)
511526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
512526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
513526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    snprintf(cmd, sizeof(cmd), "REMOVE_NETWORK %d", edit_network_id);
514526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply);
515526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    wpagui->ctrlRequest(cmd, reply, &reply_len);
516526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (strncmp(reply, "OK", 2) != 0) {
517526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	QMessageBox::warning(this, "wpa_gui",
518526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			     "Failed to remove network from wpa_supplicant\n"
519526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt			     "configuration.");
520526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    } else {
521526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpagui->triggerUpdate();
522526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	wpagui->ctrlRequest("SAVE_CONFIG", reply, &reply_len);
523526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    }
524526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
525526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    close();
526526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
527526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
528526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
529526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid NetworkConfig::newNetwork()
530526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
531526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    new_network = true;
532526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    getEapCapa();
533526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
534526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
535526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
536526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidtvoid NetworkConfig::getEapCapa()
537526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt{
538526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    char reply[256];
539526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    size_t reply_len;
540526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
541526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (wpagui == NULL)
542526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
543526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
544526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply_len = sizeof(reply) - 1;
545526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    if (wpagui->ctrlRequest("GET_CAPABILITY eap", reply, &reply_len) < 0)
546526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt	return;
547526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    reply[reply_len] = '\0';
548526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt
549526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    QString res(reply);
550526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    QStringList types = QStringList::split(QChar(' '), res);
551526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt    eapSelect->insertStringList(types);
552526fc2a7dc09b4450086cdec313a5c44d36b10fdDmitry Shmidt}
553