~ubuntu-branches/ubuntu/precise/networkmanagement/precise

« back to all changes in this revision

Viewing changes to libs/ui/security/tlswidget.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Felix Geyer
  • Date: 2011-10-23 14:00:13 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20111023140013-e38hdzybcg6zndrk
Tags: 0.9~svngit.nm09.20111023.ff842e-0ubuntu1
* New upstream snapshot.
* Drop all patches, merged upstream.
* Add kubuntu_add_subdirectory_po.diff to build the translations.

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
 
22
22
#include "tlswidget.h"
23
23
 
24
 
#include "connection.h"
25
 
#include "settings/802-1x.h"
26
 
 
 
24
#include "editlistdialog.h"
 
25
#include "listvalidator.h"
 
26
 
 
27
#include <connection.h>
 
28
#include <settings/802-1x.h>
 
29
#include <knmserviceprefs.h>
 
30
 
 
31
#include "../../../libs/internals/paths.h"
27
32
#include "eapmethod_p.h"
28
33
 
29
 
#include <kfiledialog.h>
30
 
#include <KUser>
31
 
 
32
34
class TlsWidgetPrivate : public EapMethodPrivate
33
35
{
34
36
public:
38
40
 
39
41
    }
40
42
    bool inner;
41
 
    enum Certs {ClientCert = 0, CACert, PrivateKey};
 
43
    bool showAdvancedSettings;
 
44
    QRegExpValidator *altSubjectValidator;
 
45
    QRegExpValidator *serversValidator;
42
46
};
43
47
 
44
48
TlsWidget::TlsWidget(bool isInnerMethod, Knm::Connection* connection, QWidget * parent)
45
49
: EapMethod(*new TlsWidgetPrivate(isInnerMethod), connection, parent)
46
50
{
 
51
    Q_D(TlsWidget);
47
52
    setupUi(this);
48
 
    connect(chkUseSystemCaCerts,SIGNAL(toggled(bool)),this,SLOT(toggleSystemCa(bool)));
49
 
 
50
 
    connect(clientCertLoad,SIGNAL(clicked()),this,SLOT(loadCert()));
51
 
    connect(caCertLoad,SIGNAL(clicked()),this,SLOT(loadCert()));
52
 
    connect(privateKeyLoad,SIGNAL(clicked()),this,SLOT(loadCert()));
53
 
    clientCertLoad->setIcon(KIcon("document-open"));
54
 
    caCertLoad->setIcon(KIcon("document-open"));
55
 
    privateKeyLoad->setIcon(KIcon("document-open"));
 
53
    d->altSubjectValidator = new QRegExpValidator(QRegExp(QLatin1String("^(DNS:[a-zA-Z0-9_-]+\\.[a-zA-Z0-9_.-]+|EMAIL:[a-zA-Z0-9._-]+@[a-zA-Z0-9_-]+\\.[a-zA-Z0-9_.-]+|URI:[a-zA-Z0-9._-]+:.+)$")), this);
 
54
    d->serversValidator = new QRegExpValidator(QRegExp(QLatin1String("^[a-zA-Z0-9_-]+\\.[a-zA-Z0-9_.-]+$")), this);
 
55
 
 
56
    ListValidator *altSubjectValidator = new ListValidator(this);
 
57
    altSubjectValidator->setInnerValidator(d->altSubjectValidator);
 
58
    leAltSubjectMatches->setValidator(altSubjectValidator);
 
59
 
 
60
    ListValidator *serversValidator = new ListValidator(this);
 
61
    serversValidator->setInnerValidator(d->serversValidator);
 
62
    leConnectToTheseServers->setValidator(d->serversValidator);
 
63
 
 
64
    KNetworkManagerServicePrefs::instance(Knm::NETWORKMANAGEMENT_RCFILE);
 
65
    KNetworkManagerServicePrefs::self()->readConfig();
 
66
    d->showAdvancedSettings = KNetworkManagerServicePrefs::self()->showAdvancedSettings();
 
67
    if (d->showAdvancedSettings) {
 
68
        lblConnectToTheseServers->hide();
 
69
        leConnectToTheseServers->hide();
 
70
        connectToTheseServersMoreBtn->hide();
 
71
        connect(altSubjectMatchesMoreBtn, SIGNAL(clicked()), this, SLOT(showAltSubjectMatchesEditor()));
 
72
    } else {
 
73
        lblSubjectMatch->hide();
 
74
        leSubjectMatch->hide();
 
75
        lblAltSubjectMatches->hide();
 
76
        leAltSubjectMatches->hide();
 
77
        altSubjectMatchesMoreBtn->hide();
 
78
        connect(connectToTheseServersMoreBtn, SIGNAL(clicked()), this, SLOT(showServersEditor()));
 
79
    }
 
80
 
 
81
    connect(cmbPrivateKeyPasswordStorage, SIGNAL(currentIndexChanged(int)), this, SLOT(privateKeyPasswordStorageChanged(int)));
56
82
}
57
83
 
58
84
TlsWidget::~TlsWidget()
72
98
    QString value;
73
99
    if (d->setting->useSystemCaCerts()) {
74
100
        chkUseSystemCaCerts->setChecked(true);
75
 
        caCertLoad->setEnabled(false);
 
101
        kurCaCert->setEnabled(false);
 
102
        kurClientCert->clear();
76
103
    } else {
77
 
        if (!d->setting->cacert().isEmpty()) {
78
 
            setText(d->CACert,true);
 
104
 
 
105
        if (d->inner) {
 
106
            value = d->setting->phase2cacertasstring();
79
107
        } else {
80
 
            setText(d->CACert,false);
81
 
        }
82
 
    }
83
 
 
84
 
    if (!d->setting->clientcert().isEmpty()) {
85
 
        setText(d->ClientCert,true);
86
 
    } else {
87
 
        setText(d->ClientCert,false);
88
 
    }
89
 
 
90
 
    if (!d->setting->privatekey().isEmpty()) {
91
 
        setText(d->PrivateKey,true);
92
 
    } else {
93
 
        setText(d->PrivateKey,false);
 
108
            value = d->setting->cacertasstring();
 
109
        }
 
110
        if (!value.isEmpty())
 
111
            kurCaCert->setUrl(value);
 
112
    }
 
113
 
 
114
    if (d->inner) {
 
115
        value = d->setting->phase2clientcertasstring();
 
116
    } else {
 
117
        value = d->setting->clientcertasstring();
 
118
    }
 
119
    if (!value.isEmpty())
 
120
        kurClientCert->setUrl(value);
 
121
 
 
122
    if (d->inner) {
 
123
        value = d->setting->phase2privatekeyasstring();
 
124
    } else {
 
125
        value = d->setting->privatekeyasstring();
 
126
    }
 
127
    if (!value.isEmpty())
 
128
        kurPrivateKey->setUrl(value);
 
129
 
 
130
    QStringList altsubjectmatches;
 
131
    if (d->inner) {
 
132
        leSubjectMatch->setText(d->setting->phase2subjectmatch());
 
133
        altsubjectmatches = d->setting->phase2altsubjectmatches();
 
134
    }
 
135
    else {
 
136
        leSubjectMatch->setText(d->setting->subjectmatch());
 
137
        altsubjectmatches = d->setting->altsubjectmatches();
 
138
    }
 
139
    leAltSubjectMatches->setText(altsubjectmatches.join(QLatin1String(", ")));
 
140
    if (!d->showAdvancedSettings) {
 
141
        QStringList servers;
 
142
        foreach (const QString &match, altsubjectmatches) {
 
143
            if (match.startsWith(QLatin1String("DNS:")))
 
144
                servers.append(match.right(match.length()-4));
 
145
        }
 
146
        leConnectToTheseServers->setText(servers.join(QLatin1String(", ")));
94
147
    }
95
148
}
96
149
 
100
153
    if (!d->inner) {
101
154
        // make it TLS
102
155
        d->setting->setEapFlags(Knm::Security8021xSetting::tls);
103
 
        d->setting->addToCertToDelete(Knm::Security8021xSetting::Phase2CACert);
104
 
        d->setting->addToCertToDelete(Knm::Security8021xSetting::Phase2ClientCert);
105
 
        d->setting->addToCertToDelete(Knm::Security8021xSetting::Phase2PrivateKey);
106
 
        d->setting->setPhase2cacerttoimport("");
107
 
        d->setting->setPhase2clientcerttoimport("");
108
 
        d->setting->setPhase2privatekeytoimport("");
109
156
        d->setting->setPrivatekeypassword(lePrivateKeyPassword->text());
110
157
    } else {
111
 
        d->setting->addToCertToDelete(Knm::Security8021xSetting::CACert);
112
 
        d->setting->addToCertToDelete(Knm::Security8021xSetting::ClientCert);
113
 
        d->setting->addToCertToDelete(Knm::Security8021xSetting::PrivateKey);
114
 
        d->setting->setCacerttoimport("");
115
 
        d->setting->setClientcerttoimport("");
116
 
        d->setting->setPrivatekeytoimport("");
117
158
        d->setting->setPhase2privatekeypassword(lePrivateKeyPassword->text());
118
159
    }
119
160
 
124
165
    KUrl url;
125
166
    if (chkUseSystemCaCerts->isChecked()) {
126
167
        d->setting->setUseSystemCaCerts(true);
127
 
        d->setting->addToCertToDelete(Knm::Security8021xSetting::CACert);
128
 
        d->setting->addToCertToDelete(Knm::Security8021xSetting::Phase2CACert);
129
 
    } else {
130
 
        d->setting->setUseSystemCaCerts(false);
 
168
        d->setting->setPhase2capath(QByteArray());
 
169
        d->setting->setCapath(QByteArray());
 
170
    } else {
 
171
        url = kurCaCert->url();
 
172
        if (!url.directory().isEmpty() && !url.fileName().isEmpty()) {
 
173
            QString path = url.path();
 
174
            if (d->inner) {
 
175
                d->setting->setPhase2cacert(path);
 
176
            } else {
 
177
                d->setting->setCacert(path);
 
178
            }
 
179
        }
 
180
    }
 
181
 
 
182
    url = kurClientCert->url();
 
183
    if (!url.directory().isEmpty() && !url.fileName().isEmpty()) {
 
184
        QString path = url.path();
 
185
        if (d->inner) {
 
186
            d->setting->setPhase2clientcert(path);
 
187
        } else {
 
188
            d->setting->setClientcert(path);
 
189
        }
 
190
    }
 
191
 
 
192
    url = kurPrivateKey->url();
 
193
    if (!url.directory().isEmpty() && !url.fileName().isEmpty()) {
 
194
        QString path = url.path();
 
195
        if (d->inner) {
 
196
            d->setting->setPhase2privatekey(path);
 
197
        } else {
 
198
            d->setting->setPrivatekey(path);
 
199
        }
 
200
    }
 
201
 
 
202
    switch (cmbPrivateKeyPasswordStorage->currentIndex()) {
 
203
        case EapMethodPrivate::Store:
 
204
            if (d->inner) {
 
205
                d->setting->setPhase2privatekeypassword(lePrivateKeyPassword->text());
 
206
                if (!d->connection->permissions().isEmpty())
 
207
                    d->setting->setPhase2privatekeypasswordflags(Knm::Setting::AgentOwned);
 
208
                else
 
209
                    d->setting->setPhase2privatekeypasswordflags(Knm::Setting::None);
 
210
            } else {
 
211
                d->setting->setPrivatekeypassword(lePrivateKeyPassword->text());
 
212
                if (!d->connection->permissions().isEmpty())
 
213
                    d->setting->setPrivatekeypasswordflags(Knm::Setting::AgentOwned);
 
214
                else
 
215
                    d->setting->setPrivatekeypasswordflags(Knm::Setting::None);
 
216
            }
 
217
            break;
 
218
        case EapMethodPrivate::AlwaysAsk:
 
219
            d->inner ? d->setting->setPhase2privatekeypasswordflags(Knm::Setting::NotSaved) : d->setting->setPrivatekeypasswordflags(Knm::Setting::NotSaved);
 
220
            break;
 
221
        case EapMethodPrivate::NotRequired:
 
222
            d->inner ? d->setting->setPhase2privatekeypasswordflags(Knm::Setting::NotRequired) : d->setting->setPrivatekeypasswordflags(Knm::Setting::NotRequired);
 
223
            break;
 
224
    }
 
225
 
 
226
    QStringList altsubjectmatches = leAltSubjectMatches->text().remove(QLatin1Char(' ')).split(QLatin1Char(','), QString::SkipEmptyParts);
 
227
    if (!d->showAdvancedSettings) {
 
228
        foreach (const QString &match, leConnectToTheseServers->text().remove(QLatin1Char(' ')).split(QLatin1Char(','), QString::SkipEmptyParts)) {
 
229
            QString tempstr = QLatin1String("DNS:") + match;
 
230
            if (!altsubjectmatches.contains(tempstr))
 
231
                altsubjectmatches.append(tempstr);
 
232
        }
 
233
    }
 
234
    if (d->inner) {
 
235
        d->setting->setPhase2subjectmatch(leSubjectMatch->text());
 
236
        d->setting->setPhase2altsubjectmatches(altsubjectmatches);
 
237
    } else {
 
238
        d->setting->setSubjectmatch(leSubjectMatch->text());
 
239
        d->setting->setAltsubjectmatches(altsubjectmatches);
131
240
    }
132
241
}
133
242
 
134
243
void TlsWidget::readSecrets()
135
244
{
136
245
    Q_D(TlsWidget);
 
246
    QString password;
 
247
    Knm::Setting::secretsTypes flags;
137
248
    if (d->inner) {
138
 
        lePrivateKeyPassword->setText(d->setting->phase2privatekeypassword());
 
249
        password = d->setting->phase2privatekeypassword();
 
250
        flags = d->setting->phase2privatekeypasswordflags();
139
251
    } else {
140
 
        lePrivateKeyPassword->setText(d->setting->privatekeypassword());
 
252
        password = d->setting->privatekeypassword();
 
253
        flags = d->setting->privatekeypasswordflags();
 
254
    }
 
255
    if (flags.testFlag(Knm::Setting::AgentOwned) || flags.testFlag(Knm::Setting::None)) {
 
256
        lePrivateKeyPassword->setText(password);
 
257
        cmbPrivateKeyPasswordStorage->setCurrentIndex(EapMethodPrivate::Store);
 
258
    } else if (flags.testFlag(Knm::Setting::NotSaved)) {
 
259
        cmbPrivateKeyPasswordStorage->setCurrentIndex(EapMethodPrivate::AlwaysAsk);
 
260
    } else if (flags.testFlag(Knm::Setting::NotRequired)) {
 
261
        cmbPrivateKeyPasswordStorage->setCurrentIndex(EapMethodPrivate::NotRequired);
141
262
    }
142
263
}
143
264
 
146
267
    lePrivateKeyPassword->setPasswordMode(!on);
147
268
}
148
269
 
149
 
void TlsWidget::loadCert()
150
 
{
151
 
    Q_D(TlsWidget);
152
 
    QString objectname = sender()->objectName();
153
 
    if (d->inner) {
154
 
        if (objectname == QLatin1String("clientCertLoad")) {
155
 
            QString newcert = KFileDialog::getOpenFileName(KUser().homeDir(),"",this,i18nc("File chooser dialog title for certificate loading","Load Certificate"));
156
 
            if (!newcert.isEmpty()) {
157
 
                d->setting->setPhase2clientcerttoimport(newcert);
158
 
                setText(d->ClientCert,true);
159
 
            }
160
 
        } else if (objectname == QLatin1String("caCertLoad")) {
161
 
            QString newcert = KFileDialog::getOpenFileName(KUser().homeDir(),"",this,i18nc("File chooser dialog title for certificate loading","Load Certificate"));
162
 
            if (!newcert.isEmpty()) {
163
 
                d->setting->setPhase2cacerttoimport(newcert);
164
 
                setText(d->CACert,true);
165
 
            }
166
 
        } else if (objectname == QLatin1String("privateKeyLoad")) {
167
 
            QString newcert = KFileDialog::getOpenFileName(KUser().homeDir(),"",this,i18nc("File chooser dialog title for certificate loading","Load Certificate"));
168
 
            if (!newcert.isEmpty()) {
169
 
                d->setting->setPhase2privatekeytoimport(newcert);
170
 
                setText(d->PrivateKey,true);
171
 
            }
172
 
        }
173
 
    } else {
174
 
        if (objectname == QLatin1String("clientCertLoad")) {
175
 
            QString newcert = KFileDialog::getOpenFileName(KUser().homeDir(),"",this,i18nc("File chooser dialog title for certificate loading","Load Certificate"));
176
 
            if (!newcert.isEmpty()) {
177
 
                d->setting->setClientcerttoimport(newcert);
178
 
                setText(d->ClientCert,true);
179
 
            }
180
 
        } else if (objectname == QLatin1String("caCertLoad")) {
181
 
            QString newcert = KFileDialog::getOpenFileName(KUser().homeDir(),"",this,i18nc("File chooser dialog title for certificate loading","Load Certificate"));
182
 
            if (!newcert.isEmpty()) {
183
 
                d->setting->setCacerttoimport(newcert);
184
 
                setText(d->CACert,true);
185
 
            }
186
 
        } else if (objectname == QLatin1String("privateKeyLoad")) {
187
 
            QString newcert = KFileDialog::getOpenFileName(KUser().homeDir(),"",this,i18nc("File chooser dialog title for certificate loading","Load Certificate"));
188
 
            if (!newcert.isEmpty()) {
189
 
                d->setting->setPrivatekeytoimport(newcert);
190
 
                setText(d->PrivateKey,true);
191
 
            }
192
 
        }
193
 
    }
194
 
}
195
 
 
196
 
void TlsWidget::toggleSystemCa(bool toggled)
197
 
{
198
 
    Q_D(TlsWidget);
199
 
    if (toggled)
200
 
        setText(TlsWidgetPrivate::CACert,false);
201
 
    else if (d->inner && !d->setting->phase2cacert().isEmpty())
202
 
        setText(TlsWidgetPrivate::CACert,true);
203
 
    else if (!d->setting->cacert().isEmpty())
204
 
        setText(TlsWidgetPrivate::CACert,true);
205
 
}
206
 
 
207
 
void TlsWidget::setText(int cert, bool loaded)
208
 
{
209
 
    KPushButton *button;
210
 
    QLabel *label;
211
 
    KLed *led;
212
 
    switch (cert)
 
270
void TlsWidget::privateKeyPasswordStorageChanged(int type)
 
271
{
 
272
    switch (type)
213
273
    {
214
 
        case TlsWidgetPrivate::ClientCert:
215
 
            button = clientCertLoad;
216
 
            label = clientCertLoadedLabel;
217
 
            led = clientCertLed;
218
 
            break;
219
 
        case TlsWidgetPrivate::CACert:
220
 
            button = caCertLoad;
221
 
            label = caCertLoadedLabel;
222
 
            led = caCertLed;
223
 
            break;
224
 
        case TlsWidgetPrivate::PrivateKey:
 
274
        case EapMethodPrivate::Store:
 
275
            lePrivateKeyPassword->setEnabled(true);
 
276
            break;
225
277
        default:
226
 
            button = privateKeyLoad;
227
 
            label = privateKeyLoadedLabel;
228
 
            led = privateKeyLed;
 
278
            lePrivateKeyPassword->setEnabled(false);
229
279
            break;
230
280
    }
231
 
    if (loaded) {
232
 
        button->setText(i18nc("Text to display on certificate button a certificate is already loaded","Load new"));
233
 
        label->setText(i18nc("Text to display on CA certificate LED label when certificate is already loaded","Loaded"));
234
 
        led->setState(KLed::On);
235
 
    } else {
236
 
        button->setText(i18nc("Text to display on CA certificate button when no certificate is loaded yet","Load"));
237
 
        label->setText("");
238
 
        led->setState(KLed::Off);
 
281
}
 
282
 
 
283
void TlsWidget::showAltSubjectMatchesEditor()
 
284
{
 
285
    Q_D(TlsWidget);
 
286
    EditListDialog editor;
 
287
    editor.setItems(leAltSubjectMatches->text().remove(QLatin1Char(' ')).split(QLatin1Char(','), QString::SkipEmptyParts));
 
288
    editor.setCaption(i18n("Alternative Subject Matches"));
 
289
    editor.setValidator(d->altSubjectValidator);
 
290
    if (editor.exec() == QDialog::Accepted) {
 
291
        leAltSubjectMatches->setText(editor.items().join(QLatin1String(", ")));
 
292
    }
 
293
}
 
294
 
 
295
void TlsWidget::showServersEditor()
 
296
{
 
297
    Q_D(TlsWidget);
 
298
    EditListDialog editor;
 
299
    editor.setItems(leConnectToTheseServers->text().remove(QLatin1Char(' ')).split(QLatin1Char(','), QString::SkipEmptyParts));
 
300
    editor.setCaption(i18n("Connect to these Servers"));
 
301
    editor.setValidator(d->serversValidator);
 
302
    if (editor.exec() == QDialog::Accepted) {
 
303
        leConnectToTheseServers->setText(editor.items().join(QLatin1String(", ")));
239
304
    }
240
305
}
241
306