X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fsettingspages%2Fidentitiessettingspage.cpp;h=ca965aac79ddd097c51ffa4d1ae6bfa71e1bc58f;hp=de7a02b47e31d97dab59b8ba47666c811ac3452f;hb=eb4950098fca394cf25215dfd187029bcd036ca4;hpb=04f354ee05a2cb703cf58be99fbd6e356bf452b6 diff --git a/src/qtui/settingspages/identitiessettingspage.cpp b/src/qtui/settingspages/identitiessettingspage.cpp index de7a02b4..ca965aac 100644 --- a/src/qtui/settingspages/identitiessettingspage.cpp +++ b/src/qtui/settingspages/identitiessettingspage.cpp @@ -20,10 +20,6 @@ #include "identitiessettingspage.h" -#include -#include -#include -#include #include #include @@ -35,70 +31,25 @@ IdentitiesSettingsPage::IdentitiesSettingsPage(QWidget *parent) : SettingsPage(tr("General"), tr("Identities"), parent), _editSsl(false) { - ui.setupUi(this); ui.renameIdentity->setIcon(BarIcon("edit-rename")); ui.addIdentity->setIcon(BarIcon("list-add-user")); ui.deleteIdentity->setIcon(BarIcon("list-remove-user")); - ui.addNick->setIcon(SmallIcon("list-add")); - ui.deleteNick->setIcon(SmallIcon("edit-delete")); - ui.renameNick->setIcon(SmallIcon("edit-rename")); - ui.nickUp->setIcon(SmallIcon("go-up")); - ui.nickDown->setIcon(SmallIcon("go-down")); 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))); connect(Client::instance(), SIGNAL(identityRemoved(IdentityId)), this, SLOT(clientIdentityRemoved(IdentityId))); - currentId = 0; - - // We need to know whenever the state of input widgets changes... - //connect(ui.identityList, SIGNAL(editTextChanged(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.realName, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.nicknameList, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(widgetHasChanged())); - connect(ui.awayNick, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.awayNickEnabled, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.awayReason, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.awayReasonEnabled, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.autoAwayEnabled, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.autoAwayTime, SIGNAL(valueChanged(int)), this, SLOT(widgetHasChanged())); - connect(ui.autoAwayReason, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.autoAwayReasonEnabled, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.detachAwayEnabled, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.detachAwayReason, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.detachAwayReasonEnabled, SIGNAL(clicked(bool)), this, SLOT(widgetHasChanged())); - connect(ui.ident, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.kickReason, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.partReason, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - connect(ui.quitReason, SIGNAL(textEdited(const QString &)), this, SLOT(widgetHasChanged())); - - connect(ui.nicknameList, SIGNAL(itemSelectionChanged()), this, SLOT(setWidgetStates())); - - // 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())); - + connect(ui.identityEditor, SIGNAL(widgetHasChanged()), this, SLOT(widgetHasChanged())); #ifdef HAVE_SSL - ui.sslKeyGroupBox->setAcceptDrops(true); - ui.sslKeyGroupBox->installEventFilter(this); - ui.sslCertGroupBox->setAcceptDrops(true); - ui.sslCertGroupBox->installEventFilter(this); + connect(ui.identityEditor, SIGNAL(requestEditSsl()), this, SLOT(continueUnsecured())); #endif -} -void IdentitiesSettingsPage::setWidgetStates() { - if(ui.nicknameList->selectedItems().count()) { - ui.renameNick->setEnabled(true); - ui.nickUp->setEnabled(ui.nicknameList->row(ui.nicknameList->selectedItems()[0]) > 0); - ui.nickDown->setEnabled(ui.nicknameList->row(ui.nicknameList->selectedItems()[0]) < ui.nicknameList->count()-1); - } else { - ui.renameNick->setDisabled(true); - ui.nickUp->setDisabled(true); - ui.nickDown->setDisabled(true); - } - ui.deleteNick->setEnabled(ui.nicknameList->count() > 1); + currentId = 0; + + //connect(ui.identityList, SIGNAL(editTextChanged(const QString &)), this, SLOT(widgetHasChanged())); } void IdentitiesSettingsPage::coreConnectionStateChanged(bool connected) { @@ -106,14 +57,14 @@ void IdentitiesSettingsPage::coreConnectionStateChanged(bool connected) { if(connected) { #ifdef HAVE_SSL if(Client::signalProxy()->isSecure()) { - ui.keyAndCertSettings->setCurrentIndex(2); + ui.identityEditor->setSslState(IdentityEditWidget::AllowSsl); _editSsl = true; } else { - ui.keyAndCertSettings->setCurrentIndex(1); + ui.identityEditor->setSslState(IdentityEditWidget::UnsecureSsl); _editSsl = false; } #else - ui.keyAndCertSettings->setCurrentIndex(0); + ui.identityEditor->setSslState(IdentityEditWidget::NoSsl); #endif load(); } else { @@ -122,6 +73,19 @@ void IdentitiesSettingsPage::coreConnectionStateChanged(bool connected) { } } +#ifdef HAVE_SSL +void IdentitiesSettingsPage::continueUnsecured() { + _editSsl = true; + + QHash::iterator idIter; + for(idIter = identities.begin(); idIter != identities.end(); idIter++) { + idIter.value()->enableEditSsl(); + } + + ui.identityEditor->setSslState(IdentityEditWidget::AllowSsl); +} +#endif + void IdentitiesSettingsPage::save() { setEnabled(false); QList toCreate, toUpdate; @@ -184,7 +148,7 @@ bool IdentitiesSettingsPage::testHasChanged() { if(currentId != 0) { changedIdentities.removeAll(currentId); CertIdentity temp(currentId, this); - saveToIdentity(&temp); + ui.identityEditor->saveToIdentity(&temp); temp.setIdentityName(identities[currentId]->identityName()); if(temp != *Client::identity(currentId) || temp.isDirty()) changedIdentities.append(currentId); @@ -194,7 +158,7 @@ bool IdentitiesSettingsPage::testHasChanged() { } bool IdentitiesSettingsPage::aboutToSave() { - saveToIdentity(identities[currentId]); + ui.identityEditor->saveToIdentity(identities[currentId]); QList errors; foreach(Identity *id, identities.values()) { if(id->identityName().isEmpty()) errors.append(1); @@ -244,7 +208,7 @@ void IdentitiesSettingsPage::clientIdentityUpdated() { identity->copyFrom(*clientIdentity); if(identity->id() == currentId) - displayIdentity(identity, true); + ui.identityEditor->displayIdentity(identity); } void IdentitiesSettingsPage::clientIdentityRemoved(IdentityId id) { @@ -292,80 +256,25 @@ void IdentitiesSettingsPage::removeIdentity(Identity *id) { } void IdentitiesSettingsPage::on_identityList_currentIndexChanged(int index) { + CertIdentity *previousIdentity = 0; + if(currentId != 0 && identities.contains(currentId)) + previousIdentity = identities[currentId]; + if(index < 0) { //ui.identityList->setEditable(false); - displayIdentity(0); + ui.identityEditor->displayIdentity(0, previousIdentity); + currentId = 0; } else { IdentityId id = ui.identityList->itemData(index).toInt(); - if(identities.contains(id)) displayIdentity(identities[id]); + if(identities.contains(id)) { + ui.identityEditor->displayIdentity(identities[id], previousIdentity); + currentId = id; + } ui.deleteIdentity->setEnabled(id != 1); // default identity cannot be deleted ui.renameIdentity->setEnabled(id != 1); // ...or renamed } } -void IdentitiesSettingsPage::displayIdentity(CertIdentity *id, bool dontsave) { - if(currentId != 0 && !dontsave && identities.contains(currentId)) { - saveToIdentity(identities[currentId]); - } - if(id) { - currentId = id->id(); - ui.realName->setText(id->realName()); - ui.nicknameList->clear(); - ui.nicknameList->addItems(id->nicks()); - //for(int i = 0; i < ui.nicknameList->count(); i++) { - // ui.nicknameList->item(i)->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsEnabled); - //} - if(ui.nicknameList->count()) ui.nicknameList->setCurrentRow(0); - ui.awayNick->setText(id->awayNick()); - ui.awayNickEnabled->setChecked(id->awayNickEnabled()); - ui.awayReason->setText(id->awayReason()); - ui.awayReasonEnabled->setChecked(id->awayReasonEnabled()); - ui.autoAwayEnabled->setChecked(id->autoAwayEnabled()); - ui.autoAwayTime->setValue(id->autoAwayTime()); - ui.autoAwayReason->setText(id->autoAwayReason()); - ui.autoAwayReasonEnabled->setChecked(id->autoAwayReasonEnabled()); - ui.detachAwayEnabled->setChecked(id->detachAwayEnabled()); - ui.detachAwayReason->setText(id->detachAwayReason()); - ui.detachAwayReasonEnabled->setChecked(id->detachAwayReasonEnabled()); - ui.ident->setText(id->ident()); - 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 - } -} - -void IdentitiesSettingsPage::saveToIdentity(CertIdentity *id) { - id->setRealName(ui.realName->text()); - QStringList nicks; - for(int i = 0; i < ui.nicknameList->count(); i++) { - nicks << ui.nicknameList->item(i)->text(); - } - id->setNicks(nicks); - id->setAwayNick(ui.awayNick->text()); - id->setAwayNickEnabled(ui.awayNickEnabled->isChecked()); - id->setAwayReason(ui.awayReason->text()); - id->setAwayReasonEnabled(ui.awayReasonEnabled->isChecked()); - id->setAutoAwayEnabled(ui.autoAwayEnabled->isChecked()); - id->setAutoAwayTime(ui.autoAwayTime->value()); - id->setAutoAwayReason(ui.autoAwayReason->text()); - id->setAutoAwayReasonEnabled(ui.autoAwayReasonEnabled->isChecked()); - id->setDetachAwayEnabled(ui.detachAwayEnabled->isChecked()); - id->setDetachAwayReason(ui.detachAwayReason->text()); - id->setDetachAwayReasonEnabled(ui.detachAwayReasonEnabled->isChecked()); - id->setIdent(ui.ident->text()); - 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() { CreateIdentityDlg dlg(ui.identityList->model(), this); if(dlg.exec() == QDialog::Accepted) { @@ -415,207 +324,6 @@ void IdentitiesSettingsPage::on_renameIdentity_clicked() { } } -void IdentitiesSettingsPage::on_addNick_clicked() { - QStringList existing; - for(int i = 0; i < ui.nicknameList->count(); i++) existing << ui.nicknameList->item(i)->text(); - NickEditDlg dlg(QString(), existing, this); - if(dlg.exec() == QDialog::Accepted) { - ui.nicknameList->addItem(dlg.nick()); - ui.nicknameList->setCurrentRow(ui.nicknameList->count()-1); - setWidgetStates(); - widgetHasChanged(); - } -} - -void IdentitiesSettingsPage::on_deleteNick_clicked() { - // no confirmation, since a nickname is really nothing hard to recreate - if(ui.nicknameList->selectedItems().count()) { - delete ui.nicknameList->takeItem(ui.nicknameList->row(ui.nicknameList->selectedItems()[0])); - ui.nicknameList->setCurrentRow(qMin(ui.nicknameList->currentRow()+1, ui.nicknameList->count()-1)); - setWidgetStates(); - widgetHasChanged(); - } -} - -void IdentitiesSettingsPage::on_renameNick_clicked() { - if(!ui.nicknameList->selectedItems().count()) return; - QString old = ui.nicknameList->selectedItems()[0]->text(); - QStringList existing; - for(int i = 0; i < ui.nicknameList->count(); i++) existing << ui.nicknameList->item(i)->text(); - NickEditDlg dlg(old, existing, this); - if(dlg.exec() == QDialog::Accepted) { - ui.nicknameList->selectedItems()[0]->setText(dlg.nick()); - } - -} - -void IdentitiesSettingsPage::on_nickUp_clicked() { - if(!ui.nicknameList->selectedItems().count()) return; - int row = ui.nicknameList->row(ui.nicknameList->selectedItems()[0]); - if(row > 0) { - ui.nicknameList->insertItem(row-1, ui.nicknameList->takeItem(row)); - ui.nicknameList->setCurrentRow(row-1); - setWidgetStates(); - widgetHasChanged(); - } -} - -void IdentitiesSettingsPage::on_nickDown_clicked() { - if(!ui.nicknameList->selectedItems().count()) return; - int row = ui.nicknameList->row(ui.nicknameList->selectedItems()[0]); - if(row < ui.nicknameList->count()-1) { - ui.nicknameList->insertItem(row+1, ui.nicknameList->takeItem(row)); - ui.nicknameList->setCurrentRow(row+1); - setWidgetStates(); - widgetHasChanged(); - } -} - -#ifdef HAVE_SSL -void IdentitiesSettingsPage::on_continueUnsecured_clicked() { - _editSsl = true; - - QHash::iterator idIter; - for(idIter = identities.begin(); idIter != identities.end(); idIter++) { - idIter.value()->enableEditSsl(); - } - - 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()) - key = keyByFilename(QFileDialog::getOpenFileName(this, tr("Load a Key"), QDesktopServices::storageLocation(QDesktopServices::HomeLocation))); - - 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")); - ui.clearOrLoadKeyButton->setText(tr("Load")); - } else { - switch(key.algorithm()) { - case QSsl::Rsa: - ui.keyTypeLabel->setText(tr("RSA")); - break; - case QSsl::Dsa: - ui.keyTypeLabel->setText(tr("DSA")); - break; - default: - ui.keyTypeLabel->setText(tr("No Key loaded")); - } - ui.clearOrLoadKeyButton->setText(tr("Clear")); - } - ui.keyTypeLabel->setProperty("sslKey", key.toPem()); - ui.keyTypeLabel->setProperty("sslKeyType", (int)key.algorithm()); -} - -void IdentitiesSettingsPage::on_clearOrLoadCertButton_clicked() { - QSslCertificate cert; - - 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")); - ui.certCNameLabel->setText(tr("No Certificate loaded")); - ui.clearOrLoadCertButton->setText(tr("Load")); - } else { - ui.certOrgLabel->setText(cert.subjectInfo(QSslCertificate::Organization)); - ui.certCNameLabel->setText(cert.subjectInfo(QSslCertificate::CommonName)); - ui.clearOrLoadCertButton->setText(tr("Clear")); - } - ui.certOrgLabel->setProperty("sslCert", cert.toPem()); - } -#endif //HAVE_SSL - /*****************************************************************************************/ CreateIdentityDlg::CreateIdentityDlg(QAbstractItemModel *model, QWidget *parent)