X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fcoreconnectdlg.cpp;h=16655ffd128cc5d2b7259282def24028374a3e2b;hp=524bd566663cb4fbbeb0b4bc4f26180b0b3fc8ff;hb=4aed4b037ea6feaeec09743e5d6018f58d47a535;hpb=30c2dcaf2c892b14e7072057ced4d2fdaaceb9eb diff --git a/src/qtui/coreconnectdlg.cpp b/src/qtui/coreconnectdlg.cpp index 524bd566..16655ffd 100644 --- a/src/qtui/coreconnectdlg.cpp +++ b/src/qtui/coreconnectdlg.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel IRC Team * + * Copyright (C) 2005-09 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -18,22 +18,47 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +#include "coreconnectdlg.h" + #include +#include #include +#include -#include "coreconnectdlg.h" +#ifdef HAVE_SSL +#include +#include +#endif +#include "client.h" #include "clientsettings.h" #include "clientsyncer.h" #include "coreconfigwizard.h" +#include "iconloader.h" +#include "quassel.h" -CoreConnectDlg::CoreConnectDlg(QWidget *parent, bool autoconnect) : QDialog(parent) { +CoreConnectDlg::CoreConnectDlg(bool autoconnect, QWidget *parent) + : QDialog(parent), + _internalAccountId(0) +{ ui.setupUi(this); + ui.editAccount->setIcon(SmallIcon("document-properties")); + ui.addAccount->setIcon(SmallIcon("list-add")); + ui.deleteAccount->setIcon(SmallIcon("list-remove")); + ui.connectIcon->setPixmap(BarIcon("network-disconnect")); + ui.secureConnection->setPixmap(SmallIcon("document-encrypt")); + + if(Quassel::runMode() != Quassel::Monolithic) { + ui.useInternalCore->hide(); + } + + // make it look more native under Mac OS X: + setWindowFlags(Qt::Sheet); clientSyncer = new ClientSyncer(this); - wizard = 0; + Client::registerClientSyncer(clientSyncer); - setAttribute(Qt::WA_DeleteOnClose); + wizard = 0; doingAutoConnect = false; @@ -46,6 +71,11 @@ CoreConnectDlg::CoreConnectDlg(QWidget *parent, bool autoconnect) : QDialog(pare foreach(AccountId id, s.knownAccounts()) { if(!id.isValid()) continue; QVariantMap data = s.retrieveAccountData(id); + if(data.contains("InternalAccount") && data["InternalAccount"].toBool()) { + _internalAccountId = id; + continue; + } + data["AccountId"] = QVariant::fromValue(id); accounts[id] = data; QListWidgetItem *item = new QListWidgetItem(data["AccountName"].toString(), ui.accountList); item->setData(Qt::UserRole, QVariant::fromValue(id)); @@ -55,12 +85,13 @@ CoreConnectDlg::CoreConnectDlg(QWidget *parent, bool autoconnect) : QDialog(pare else ui.accountList->setCurrentRow(0); setAccountWidgetStates(); - ui.accountButtonBox->setFocus(); - ui.accountButtonBox->button(QDialogButtonBox::Ok)->setDefault(true); - ui.accountButtonBox->button(QDialogButtonBox::Ok)->setAutoDefault(true); + + ui.accountButtonBox->button(QDialogButtonBox::Ok)->setFocus(); + //ui.accountButtonBox->button(QDialogButtonBox::Ok)->setAutoDefault(true); connect(clientSyncer, SIGNAL(socketStateChanged(QAbstractSocket::SocketState)),this, SLOT(initPhaseSocketState(QAbstractSocket::SocketState))); connect(clientSyncer, SIGNAL(connectionError(const QString &)), this, SLOT(initPhaseError(const QString &))); + connect(clientSyncer, SIGNAL(connectionWarnings(const QStringList &)), this, SLOT(initPhaseWarnings(const QStringList &))); connect(clientSyncer, SIGNAL(connectionMsg(const QString &)), this, SLOT(initPhaseMsg(const QString &))); connect(clientSyncer, SIGNAL(startLogin()), this, SLOT(startLogin())); connect(clientSyncer, SIGNAL(loginFailed(const QString &)), this, SLOT(loginFailed(const QString &))); @@ -68,9 +99,8 @@ CoreConnectDlg::CoreConnectDlg(QWidget *parent, bool autoconnect) : QDialog(pare connect(clientSyncer, SIGNAL(startCoreSetup(const QVariantList &)), this, SLOT(startCoreConfig(const QVariantList &))); connect(clientSyncer, SIGNAL(sessionProgress(quint32, quint32)), this, SLOT(coreSessionProgress(quint32, quint32))); connect(clientSyncer, SIGNAL(networksProgress(quint32, quint32)), this, SLOT(coreNetworksProgress(quint32, quint32))); - connect(clientSyncer, SIGNAL(channelsProgress(quint32, quint32)), this, SLOT(coreChannelsProgress(quint32, quint32))); - connect(clientSyncer, SIGNAL(ircUsersProgress(quint32, quint32)), this, SLOT(coreIrcUsersProgress(quint32, quint32))); connect(clientSyncer, SIGNAL(syncFinished()), this, SLOT(syncFinished())); + connect(clientSyncer, SIGNAL(encrypted()), ui.secureConnection, SLOT(show())); connect(ui.user, SIGNAL(textChanged(const QString &)), this, SLOT(setLoginWidgetStates())); connect(ui.password, SIGNAL(textChanged(const QString &)), this, SLOT(setLoginWidgetStates())); @@ -131,14 +161,7 @@ void CoreConnectDlg::on_addAccount_clicked() { for(int i = 0; i < ui.accountList->count(); i++) existing << ui.accountList->item(i)->text(); CoreAccountEditDlg dlg(0, QVariantMap(), existing, this); if(dlg.exec() == QDialog::Accepted) { - // find free ID - AccountId id = accounts.count() + 1; - for(AccountId i = 1; i <= accounts.count(); i++) { - if(!accounts.keys().contains(i)) { - id = i; - break; - } - } + AccountId id = findFreeAccountId(); QVariantMap data = dlg.accountData(); data["AccountId"] = QVariant::fromValue(id); accounts[id] = data; @@ -201,6 +224,11 @@ void CoreConnectDlg::on_accountButtonBox_accepted() { connectToCore(); } +void CoreConnectDlg::on_useInternalCore_clicked() { + clientSyncer->useInternalCore(); + ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Cancel); +} + /***************************************************** * Connecting to the Core ****************************************************/ @@ -208,7 +236,8 @@ void CoreConnectDlg::on_accountButtonBox_accepted() { /*** Phase One: initializing the core connection ***/ void CoreConnectDlg::connectToCore() { - ui.connectIcon->setPixmap(QPixmap::fromImage(QImage(":/22x22/actions/network-disconnect"))); + ui.secureConnection->hide(); + ui.connectIcon->setPixmap(BarIcon("network-disconnect")); ui.connectLabel->setText(tr("Connect to %1").arg(accountData["Host"].toString())); ui.coreInfoLabel->setText(""); ui.loginStack->setCurrentWidget(ui.loginEmptyPage); @@ -218,24 +247,56 @@ void CoreConnectDlg::connectToCore() { disconnect(ui.loginButtonBox, 0, this, 0); connect(ui.loginButtonBox, SIGNAL(rejected()), this, SLOT(restartPhaseNull())); - - //connect(Client::instance(), SIGNAL(coreConnectionPhaseOne(const QVariantMap &)), this, SLOT(phaseOneFinished clientSyncer->connectToCore(accountData); } void CoreConnectDlg::initPhaseError(const QString &error) { doingAutoConnect = false; - ui.connectIcon->setPixmap(QPixmap::fromImage(QImage(":/22x22/status/dialog-error"))); + ui.secureConnection->hide(); + ui.connectIcon->setPixmap(BarIcon("dialog-error")); //ui.connectLabel->setBrush(QBrush("red")); ui.connectLabel->setText(tr("
Connection to %1 failed!
").arg(accountData["Host"].toString())); ui.coreInfoLabel->setText(error); ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Retry|QDialogButtonBox::Cancel); - ui.loginButtonBox->button(QDialogButtonBox::Retry)->setDefault(true); + ui.loginButtonBox->button(QDialogButtonBox::Retry)->setFocus(); disconnect(ui.loginButtonBox, 0, this, 0); connect(ui.loginButtonBox, SIGNAL(accepted()), this, SLOT(restartPhaseNull())); connect(ui.loginButtonBox, SIGNAL(rejected()), this, SLOT(reject())); } +void CoreConnectDlg::initPhaseWarnings(const QStringList &warnings) { + doingAutoConnect = false; + ui.secureConnection->hide(); + ui.connectIcon->setPixmap(BarIcon("dialog-warning")); + ui.connectLabel->setText(tr("
Errors occurred while connecting to \"%1\":
").arg(accountData["Host"].toString())); + QStringList warningItems; + foreach(QString warning, warnings) { + warningItems << QString("
  • %1
  • ").arg(warning); + } + ui.coreInfoLabel->setText(QString("
      %1
    ").arg(warningItems.join(""))); + ui.loginStack->setCurrentWidget(ui.connectionWarningsPage); + ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Cancel); + ui.loginButtonBox->button(QDialogButtonBox::Cancel)->setFocus(); + disconnect(ui.loginButtonBox, 0, this, 0); + connect(ui.loginButtonBox, SIGNAL(rejected()), this, SLOT(restartPhaseNull())); +} + +void CoreConnectDlg::on_viewSslCertButton_clicked() { +#ifdef HAVE_SSL + const QSslSocket *socket = qobject_cast(clientSyncer->currentDevice()); + if(!socket) + return; + + SslCertDisplayDialog dialog(socket->peerName(), socket->peerCertificate()); + dialog.exec(); +#endif +} + +void CoreConnectDlg::on_ignoreWarningsButton_clicked() { + clientSyncer->ignoreWarnings(ui.ignoreWarningsPermanently->isChecked()); +} + + void CoreConnectDlg::initPhaseMsg(const QString &msg) { ui.coreInfoLabel->setText(msg); } @@ -264,17 +325,18 @@ void CoreConnectDlg::restartPhaseNull() { *********************************************************/ void CoreConnectDlg::startLogin() { - ui.connectIcon->setPixmap(QPixmap::fromImage(QImage(":/22x22/actions/network-connect"))); + ui.connectIcon->setPixmap(BarIcon("network-connect")); ui.loginStack->setCurrentWidget(ui.loginCredentialsPage); - ui.loginStack->setMinimumSize(ui.loginStack->sizeHint()); ui.loginStack->updateGeometry(); + //ui.loginStack->setMinimumSize(ui.loginStack->sizeHint()); ui.loginStack->updateGeometry(); ui.loginButtonBox->setStandardButtons(QDialogButtonBox::Ok|QDialogButtonBox::Cancel); ui.loginButtonBox->button(QDialogButtonBox::Ok)->setDefault(true); + ui.loginButtonBox->button(QDialogButtonBox::Ok)->setFocus(); if(!accountData["User"].toString().isEmpty()) { ui.user->setText(accountData["User"].toString()); if(accountData["RememberPasswd"].toBool()) { ui.password->setText(accountData["Password"].toString()); ui.rememberPasswd->setChecked(true); - ui.loginButtonBox->setFocus(); + ui.loginButtonBox->button(QDialogButtonBox::Ok)->setFocus(); } else { ui.rememberPasswd->setChecked(false); ui.password->setFocus(); @@ -324,6 +386,7 @@ void CoreConnectDlg::loginFailed(const QString &error) { if(wizard) { wizard->reject(); } + ui.connectIcon->setPixmap(BarIcon("dialog-error")); ui.loginStack->setCurrentWidget(ui.loginCredentialsPage); ui.loginGroup->setTitle(tr("Login")); ui.user->setEnabled(true); @@ -380,10 +443,6 @@ void CoreConnectDlg::startSync() { ui.sessionProgress->setValue(0); ui.networksProgress->setRange(0, 1); ui.networksProgress->setValue(0); - ui.channelsProgress->setRange(0, 1); - ui.channelsProgress->setValue(0); - ui.ircUsersProgress->setRange(0, 1); - ui.ircUsersProgress->setValue(0); ui.stackedWidget->setCurrentWidget(ui.syncPage); // clean up old page @@ -391,7 +450,8 @@ void CoreConnectDlg::startSync() { ui.user->setEnabled(true); ui.password->setEnabled(true); ui.rememberPasswd->setEnabled(true); - ui.loginButtonBox->button(QDialogButtonBox::Ok)->setEnabled(true); + if(ui.loginButtonBox->standardButtons() & QDialogButtonBox::Ok) // in mono mode we don't show an Ok Button + ui.loginButtonBox->button(QDialogButtonBox::Ok)->setEnabled(true); } void CoreConnectDlg::coreSessionProgress(quint32 val, quint32 max) { @@ -412,31 +472,6 @@ void CoreConnectDlg::coreNetworksProgress(quint32 val, quint32 max) { } } -void CoreConnectDlg::coreChannelsProgress(quint32 val, quint32 max) { - if(max == 0) { - ui.channelsProgress->setFormat("0/0"); - ui.channelsProgress->setRange(0, 1); - ui.channelsProgress->setValue(1); - } else { - ui.channelsProgress->setFormat("%v/%m"); - ui.channelsProgress->setRange(0, max); - ui.channelsProgress->setValue(val); - } -} - -void CoreConnectDlg::coreIrcUsersProgress(quint32 val, quint32 max) { - if(max == 0) { - ui.ircUsersProgress->setFormat("0/0"); - ui.ircUsersProgress->setRange(0, 1); - ui.ircUsersProgress->setValue(1); - } else { - if(val % 100) return; - ui.ircUsersProgress->setFormat("%v/%m"); - ui.ircUsersProgress->setRange(0, max); - ui.ircUsersProgress->setValue(val); - } -} - void CoreConnectDlg::syncFinished() { if(!wizard) accept(); else { @@ -446,35 +481,67 @@ void CoreConnectDlg::syncFinished() { } } +AccountId CoreConnectDlg::findFreeAccountId() { + for(AccountId i = 1;; i++) { + if(!accounts.contains(i) && i != _internalAccountId) + return i; + } +} + /***************************************************************************************** * CoreAccountEditDlg *****************************************************************************************/ - -CoreAccountEditDlg::CoreAccountEditDlg(AccountId id, const QVariantMap &acct, const QStringList &_existing, QWidget *parent) : QDialog(parent) { +CoreAccountEditDlg::CoreAccountEditDlg(AccountId id, const QVariantMap &acct, const QStringList &_existing, QWidget *parent) + : QDialog(parent) +{ ui.setupUi(this); + ui.useSsl->setIcon(SmallIcon("document-encrypt")); + existing = _existing; - account = acct; if(id.isValid()) { + account = acct; + existing.removeAll(acct["AccountName"].toString()); ui.host->setText(acct["Host"].toString()); ui.port->setValue(acct["Port"].toUInt()); - ui.useInternal->setChecked(acct["UseInternal"].toBool()); ui.accountName->setText(acct["AccountName"].toString()); +#ifdef HAVE_SSL + ui.useSsl->setChecked(acct["useSsl"].toBool()); +#else + ui.useSsl->setChecked(false); + ui.useSsl->setEnabled(false); +#endif + ui.useProxy->setChecked(acct["useProxy"].toBool()); + ui.proxyHost->setText(acct["proxyHost"].toString()); + ui.proxyPort->setValue(acct["proxyPort"].toUInt()); + ui.proxyType->setCurrentIndex(acct["proxyType"].toInt() == QNetworkProxy::Socks5Proxy ? 0 : 1); + ui.proxyUser->setText(acct["proxyUser"].toString()); + ui.proxyPassword->setText(acct["proxyPassword"].toString()); } else { setWindowTitle(tr("Add Core Account")); +#ifndef HAVE_SSL + ui.useSsl->setChecked(false); + ui.useSsl->setEnabled(false); +#endif } } QVariantMap CoreAccountEditDlg::accountData() { - account["AccountName"] = ui.accountName->text(); - account["Host"] = ui.host->text(); + account["AccountName"] = ui.accountName->text().trimmed(); + account["Host"] = ui.host->text().trimmed(); account["Port"] = ui.port->value(); - account["UseInternal"] = ui.useInternal->isChecked(); + account["useSsl"] = ui.useSsl->isChecked(); + account["useProxy"] = ui.useProxy->isChecked(); + account["proxyHost"] = ui.proxyHost->text().trimmed(); + account["proxyPort"] = ui.proxyPort->value(); + account["proxyType"] = ui.proxyType->currentIndex() == 0 ? QNetworkProxy::Socks5Proxy : QNetworkProxy::HttpProxy; + account["proxyUser"] = ui.proxyUser->text().trimmed(); + account["proxyPassword"] = ui.proxyPassword->text().trimmed(); return account; } void CoreAccountEditDlg::setWidgetStates() { - bool ok = !ui.accountName->text().isEmpty() && !existing.contains(ui.accountName->text()) && (ui.useInternal->isChecked() || !ui.host->text().isEmpty()); + bool ok = !ui.accountName->text().trimmed().isEmpty() && !existing.contains(ui.accountName->text()) && !ui.host->text().isEmpty(); ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(ok); } @@ -488,7 +555,58 @@ void CoreAccountEditDlg::on_accountName_textChanged(const QString &text) { setWidgetStates(); } -void CoreAccountEditDlg::on_useRemote_toggled(bool state) { - Q_UNUSED(state); - setWidgetStates(); -} + +// ======================================== +// SslCertDisplayDialog +// ======================================== +SslCertDisplayDialog::SslCertDisplayDialog(const QString &host, const QSslCertificate &cert, QWidget *parent) + : QDialog(parent) +{ +#ifndef HAVE_SSL + Q_UNUSED(cert) +#else + + setWindowTitle(tr("SSL Certificate used by %1").arg(host)); + + QVBoxLayout *mainLayout = new QVBoxLayout(this); + + QGroupBox *issuerBox = new QGroupBox(tr("Issuer Info"), this); + QFormLayout *issuerLayout = new QFormLayout(issuerBox); + issuerLayout->addRow(tr("Organization:"), new QLabel(cert.issuerInfo(QSslCertificate::Organization), this)); + issuerLayout->addRow(tr("Locality Name:"), new QLabel(cert.issuerInfo(QSslCertificate::LocalityName), this)); + issuerLayout->addRow(tr("Organizational Unit Name:"), new QLabel(cert.issuerInfo(QSslCertificate::OrganizationalUnitName), this)); + issuerLayout->addRow(tr("Country Name:"), new QLabel(cert.issuerInfo(QSslCertificate::CountryName), this)); + issuerLayout->addRow(tr("State or Province Name:"), new QLabel(cert.issuerInfo(QSslCertificate::StateOrProvinceName), this)); + mainLayout->addWidget(issuerBox); + + QGroupBox *subjectBox = new QGroupBox(tr("Subject Info"), this); + QFormLayout *subjectLayout = new QFormLayout(subjectBox); + subjectLayout->addRow(tr("Organization:"), new QLabel(cert.subjectInfo(QSslCertificate::Organization), this)); + subjectLayout->addRow(tr("Locality Name:"), new QLabel(cert.subjectInfo(QSslCertificate::LocalityName), this)); + subjectLayout->addRow(tr("Organizational Unit Name:"), new QLabel(cert.subjectInfo(QSslCertificate::OrganizationalUnitName), this)); + subjectLayout->addRow(tr("Country Name:"), new QLabel(cert.subjectInfo(QSslCertificate::CountryName), this)); + subjectLayout->addRow(tr("State or Province Name:"), new QLabel(cert.subjectInfo(QSslCertificate::StateOrProvinceName), this)); + mainLayout->addWidget(subjectBox); + + QGroupBox *additionalBox = new QGroupBox(tr("Additional Info"), this); + QFormLayout *additionalLayout = new QFormLayout(additionalBox); + additionalLayout->addRow(tr("Valid From:"), new QLabel(cert.effectiveDate().toString(), this)); + additionalLayout->addRow(tr("Valid To:"), new QLabel(cert.expiryDate().toString(), this)); + QStringList hostnames = cert.alternateSubjectNames().values(QSsl::DnsEntry); + for(int i = 0; i < hostnames.count(); i++) { + additionalLayout->addRow(tr("Hostname %1:").arg(i + 1), new QLabel(hostnames[i], this)); + } + QStringList mailaddresses = cert.alternateSubjectNames().values(QSsl::EmailEntry); + for(int i = 0; i < mailaddresses.count(); i++) { + additionalLayout->addRow(tr("E-Mail Address %1:").arg(i + 1), new QLabel(mailaddresses[i], this)); + } + mainLayout->addWidget(additionalBox); + + + QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok, Qt::Horizontal, this); + mainLayout->addWidget(buttonBox); + + connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); + connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); +#endif +};