X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsettingspages%2Fidentitiessettingspage.cpp;h=788df96da5579249c9f7b48722caf27a5790fdca;hp=e51fa7aa446e62a84a7f47d3c8d8c13c140ca6c5;hb=1adc00219ba072da57994764d086beed8ffb7bb4;hpb=ac21cc48d22f0cf58a98b74754fa94564a8e3f45 diff --git a/src/qtui/settingspages/identitiessettingspage.cpp b/src/qtui/settingspages/identitiessettingspage.cpp index e51fa7aa..788df96d 100644 --- a/src/qtui/settingspages/identitiessettingspage.cpp +++ b/src/qtui/settingspages/identitiessettingspage.cpp @@ -20,11 +20,12 @@ #include "identitiessettingspage.h" -#include -#include #include +#include +#include +#include +#include #include -#include #include "client.h" #include "iconloader.h" @@ -45,7 +46,7 @@ IdentitiesSettingsPage::IdentitiesSettingsPage(QWidget *parent) ui.nickUp->setIcon(SmallIcon("go-up")); ui.nickDown->setIcon(SmallIcon("go-down")); - setEnabled(Client::isConnected()); // need a core connection! + coreConnectionStateChanged(Client::isConnected()); // need a core connection! setWidgetStates(); connect(Client::instance(), SIGNAL(coreConnectionStateChanged(bool)), this, SLOT(coreConnectionStateChanged(bool))); connect(Client::instance(), SIGNAL(identityCreated(IdentityId)), this, SLOT(clientIdentityCreated(IdentityId))); @@ -75,15 +76,16 @@ IdentitiesSettingsPage::IdentitiesSettingsPage(QWidget *parent) connect(ui.nicknameList, SIGNAL(itemSelectionChanged()), this, SLOT(setWidgetStates())); -#ifdef HAVE_SSL - ui.keyAndCertSettings->setCurrentIndex(1); -#else - ui.keyAndCertSettings->setCurrentIndex(0); -#endif - // we would need this if we enabled drag and drop in the nicklist... //connect(ui.nicknameList, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(setWidgetStates())); //connect(ui.nicknameList->model(), SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(nicklistHasChanged())); + +#ifdef HAVE_SSL + ui.sslKeyGroupBox->setAcceptDrops(true); + ui.sslKeyGroupBox->installEventFilter(this); + ui.sslCertGroupBox->setAcceptDrops(true); + ui.sslCertGroupBox->installEventFilter(this); +#endif } void IdentitiesSettingsPage::setWidgetStates() { @@ -99,9 +101,20 @@ void IdentitiesSettingsPage::setWidgetStates() { ui.deleteNick->setEnabled(ui.nicknameList->count() > 1); } -void IdentitiesSettingsPage::coreConnectionStateChanged(bool state) { - this->setEnabled(state); - if(state) { +void IdentitiesSettingsPage::coreConnectionStateChanged(bool connected) { + setEnabled(connected); + if(connected) { +#ifdef HAVE_SSL + if(Client::signalProxy()->isSecure()) { + ui.keyAndCertSettings->setCurrentIndex(2); + _editSsl = true; + } else { + ui.keyAndCertSettings->setCurrentIndex(1); + _editSsl = false; + } +#else + ui.keyAndCertSettings->setCurrentIndex(0); +#endif load(); } else { // reset @@ -202,9 +215,13 @@ bool IdentitiesSettingsPage::aboutToSave() { void IdentitiesSettingsPage::clientIdentityCreated(IdentityId id) { CertIdentity *identity = new CertIdentity(*Client::identity(id), this); +#ifdef HAVE_SSL identity->enableEditSsl(_editSsl); +#endif insertIdentity(identity); +#ifdef HAVE_SSL connect(identity, SIGNAL(sslSettingsUpdated()), this, SLOT(clientIdentityUpdated())); +#endif connect(Client::identity(id), SIGNAL(updatedRemotely()), this, SLOT(clientIdentityUpdated())); } @@ -314,8 +331,10 @@ void IdentitiesSettingsPage::displayIdentity(CertIdentity *id, bool dontsave) { ui.kickReason->setText(id->kickReason()); ui.partReason->setText(id->partReason()); ui.quitReason->setText(id->quitReason()); +#ifdef HAVE_SSL showKeyState(id->sslKey()); showCertState(id->sslCert()); +#endif } } @@ -341,8 +360,10 @@ void IdentitiesSettingsPage::saveToIdentity(CertIdentity *id) { id->setKickReason(ui.kickReason->text()); id->setPartReason(ui.partReason->text()); id->setQuitReason(ui.quitReason->text()); +#ifdef HAVE_SSL id->setSslKey(QSslKey(ui.keyTypeLabel->property("sslKey").toByteArray(), (QSsl::KeyAlgorithm)(ui.keyTypeLabel->property("sslKeyType").toInt()))); id->setSslCert(QSslCertificate(ui.certOrgLabel->property("sslCert").toByteArray())); +#endif } void IdentitiesSettingsPage::on_addIdentity_clicked() { @@ -355,7 +376,9 @@ void IdentitiesSettingsPage::on_addIdentity_clicked() { } id = -id.toInt(); CertIdentity *newId = new CertIdentity(id, this); +#ifdef HAVE_SSL newId->enableEditSsl(_editSsl); +#endif if(dlg.duplicateId() != 0) { // duplicate newId->update(*identities[dlg.duplicateId()]); @@ -448,6 +471,7 @@ void IdentitiesSettingsPage::on_nickDown_clicked() { } } +#ifdef HAVE_SSL void IdentitiesSettingsPage::on_continueUnsecured_clicked() { _editSsl = true; @@ -459,30 +483,79 @@ void IdentitiesSettingsPage::on_continueUnsecured_clicked() { ui.keyAndCertSettings->setCurrentIndex(2); } +bool IdentitiesSettingsPage::eventFilter(QObject *watched, QEvent *event) { + bool isCert = (watched == ui.sslCertGroupBox); + switch(event->type()) { + case QEvent::DragEnter: + sslDragEnterEvent(static_cast(event)); + return true; + case QEvent::Drop: + sslDropEvent(static_cast(event), isCert); + return true; + default: + return false; + } +} + +void IdentitiesSettingsPage::sslDragEnterEvent(QDragEnterEvent *event) { + if(event->mimeData()->hasFormat("text/uri-list") || event->mimeData()->hasFormat("text/uri")) { + event->setDropAction(Qt::CopyAction); + event->accept(); + } +} + +void IdentitiesSettingsPage::sslDropEvent(QDropEvent *event, bool isCert) { + QByteArray rawUris; + if(event->mimeData()->hasFormat("text/uri-list")) + rawUris = event->mimeData()->data("text/uri-list"); + else + rawUris = event->mimeData()->data("text/uri"); + + QTextStream uriStream(rawUris); + QString filename = QUrl(uriStream.readLine()).toLocalFile(); + + if(isCert) { + QSslCertificate cert = certByFilename(filename); + if(cert.isValid()) + showCertState(cert); + } else { + QSslKey key = keyByFilename(filename); + if(!key.isNull()) + showKeyState(key); + } + event->accept(); + widgetHasChanged(); +} + void IdentitiesSettingsPage::on_clearOrLoadKeyButton_clicked() { QSslKey key; - if(ui.keyTypeLabel->property("sslKey").toByteArray().isEmpty()) { - QString keyFileName = QFileDialog::getOpenFileName(this, tr("Load a Key"), QDesktopServices::storageLocation(QDesktopServices::HomeLocation)); - QFile keyFile(keyFileName); - keyFile.open(QIODevice::ReadOnly); - QByteArray keyRaw = keyFile.read(2 << 20); - keyFile.close(); - - for(int i = 0; i < 2; i++) { - for(int j = 0; j < 2; j++) { - key = QSslKey(keyRaw, (QSsl::KeyAlgorithm)j, (QSsl::EncodingFormat)i); - if(!key.isNull()) - goto showKey; - } - } - } + if(ui.keyTypeLabel->property("sslKey").toByteArray().isEmpty()) + key = keyByFilename(QFileDialog::getOpenFileName(this, tr("Load a Key"), QDesktopServices::storageLocation(QDesktopServices::HomeLocation))); - showKey: showKeyState(key); widgetHasChanged(); } +QSslKey IdentitiesSettingsPage::keyByFilename(const QString &filename) { + QSslKey key; + + QFile keyFile(filename); + keyFile.open(QIODevice::ReadOnly); + QByteArray keyRaw = keyFile.read(2 << 20); + keyFile.close(); + + for(int i = 0; i < 2; i++) { + for(int j = 0; j < 2; j++) { + key = QSslKey(keyRaw, (QSsl::KeyAlgorithm)j, (QSsl::EncodingFormat)i); + if(!key.isNull()) + goto returnKey; + } + } + returnKey: + return key; +} + void IdentitiesSettingsPage::showKeyState(const QSslKey &key) { if(key.isNull()) { ui.keyTypeLabel->setText(tr("No Key loaded")); @@ -507,24 +580,28 @@ void IdentitiesSettingsPage::showKeyState(const QSslKey &key) { void IdentitiesSettingsPage::on_clearOrLoadCertButton_clicked() { QSslCertificate cert; - if(ui.certOrgLabel->property("sslCert").toByteArray().isEmpty()) { - QString certFileName = QFileDialog::getOpenFileName(this, tr("Load a Certificate"), QDesktopServices::storageLocation(QDesktopServices::HomeLocation)); - QFile certFile(certFileName); - certFile.open(QIODevice::ReadOnly); - QByteArray certRaw = certFile.read(2 << 20); - certFile.close(); - - for(int i = 0; i < 2; i++) { - cert = QSslCertificate(certRaw, (QSsl::EncodingFormat)i); - if(cert.isValid()) - break; - } - } + if(ui.certOrgLabel->property("sslCert").toByteArray().isEmpty()) + cert = certByFilename(QFileDialog::getOpenFileName(this, tr("Load a Certificate"), QDesktopServices::storageLocation(QDesktopServices::HomeLocation))); showCertState(cert); widgetHasChanged(); } +QSslCertificate IdentitiesSettingsPage::certByFilename(const QString &filename) { + QSslCertificate cert; + QFile certFile(filename); + certFile.open(QIODevice::ReadOnly); + QByteArray certRaw = certFile.read(2 << 20); + certFile.close(); + + for(int i = 0; i < 2; i++) { + cert = QSslCertificate(certRaw, (QSsl::EncodingFormat)i); + if(cert.isValid()) + break; + } + return cert; +} + void IdentitiesSettingsPage::showCertState(const QSslCertificate &cert) { if(!cert.isValid()) { ui.certOrgLabel->setText(tr("No Certificate loaded")); @@ -537,6 +614,7 @@ void IdentitiesSettingsPage::showCertState(const QSslCertificate &cert) { } ui.certOrgLabel->setProperty("sslCert", cert.toPem()); } +#endif //HAVE_SSL /*****************************************************************************************/ @@ -595,7 +673,9 @@ SaveIdentitiesDlg::SaveIdentitiesDlg(const QList &toCreate, cons } connect(cid, SIGNAL(updatedRemotely()), this, SLOT(clientEvent())); Client::updateIdentity(id->id(), id->toVariantMap()); +#ifdef HAVE_SSL id->requestUpdateSslSettings(); +#endif } foreach(IdentityId id, toRemove) { Client::removeIdentity(id);