X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fqtui%2Fmainwin.cpp;h=2a5b379d102567edc21e1006ae03b788b393b0a6;hb=c22e079180f20e57416aeeee26a2482d4d7f8642;hp=df1a7dcf8935dd05e61aead8b53ff00e6c14c3b0;hpb=6bcfaf51a90b3ec38cf8602cefd8aa8971d01586;p=quassel.git diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index df1a7dcf..2a5b379d 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -51,11 +51,14 @@ #include "chatmonitorview.h" #include "chatview.h" #include "client.h" -#include "clientsyncer.h" #include "clientbacklogmanager.h" #include "clientbufferviewconfig.h" #include "clientbufferviewmanager.h" #include "clientignorelistmanager.h" +#include "coreconfigwizard.h" +#include "coreconnectdlg.h" +#include "coreconnection.h" +#include "coreconnectionstatuswidget.h" #include "coreinfodlg.h" #include "contextmenuactionprovider.h" #include "debugbufferviewoverlay.h" @@ -93,6 +96,10 @@ # include "knotificationbackend.h" #endif /* HAVE_KDE */ +#ifdef HAVE_SSL +# include "sslinfodlg.h" +#endif + #ifdef HAVE_INDICATEQT #include "indicatornotificationbackend.h" #endif @@ -105,7 +112,7 @@ #include "settingspages/chatviewsettingspage.h" #include "settingspages/connectionsettingspage.h" #include "settingspages/coreaccountsettingspage.h" -#include "settingspages/generalsettingspage.h" +#include "settingspages/coreconnectionsettingspage.h" #include "settingspages/highlightsettingspage.h" #include "settingspages/identitiessettingspage.h" #include "settingspages/ignorelistsettingspage.h" @@ -122,9 +129,8 @@ MainWin::MainWin(QWidget *parent) #else : QMainWindow(parent), #endif - coreLagLabel(new QLabel()), - sslLabel(new QLabel()), - msgProcessorStatusWidget(new MsgProcessorStatusWidget()), + _msgProcessorStatusWidget(new MsgProcessorStatusWidget(this)), + _coreConnectionStatusWidget(new CoreConnectionStatusWidget(Client::coreConnection(), this)), _titleSetter(this), _awayLog(0), _layoutLoaded(false) @@ -156,6 +162,15 @@ void MainWin::init() { connect(GraphicalUi::contextMenuActionProvider(), SIGNAL(showChannelList(NetworkId)), SLOT(showChannelList(NetworkId))); connect(GraphicalUi::contextMenuActionProvider(), SIGNAL(showIgnoreList(QString)), SLOT(showIgnoreList(QString))); + connect(Client::coreConnection(), SIGNAL(startCoreSetup(QVariantList)), SLOT(showCoreConfigWizard(QVariantList))); + connect(Client::coreConnection(), SIGNAL(connectionErrorPopup(QString)), SLOT(handleCoreConnectionError(QString))); + connect(Client::coreConnection(), SIGNAL(userAuthenticationRequired(CoreAccount *, bool *, QString)), SLOT(userAuthenticationRequired(CoreAccount *, bool *, QString))); + connect(Client::coreConnection(), SIGNAL(handleNoSslInClient(bool*)), SLOT(handleNoSslInClient(bool *))); + connect(Client::coreConnection(), SIGNAL(handleNoSslInCore(bool*)), SLOT(handleNoSslInCore(bool *))); +#ifdef HAVE_SSL + connect(Client::coreConnection(), SIGNAL(handleSslErrors(const QSslSocket *, bool *, bool *)), SLOT(handleSslErrors(const QSslSocket *, bool *, bool *))); +#endif + // Setup Dock Areas setDockNestingEnabled(true); setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); @@ -210,10 +225,10 @@ void MainWin::init() { // restore locked state of docks QtUi::actionCollection("General")->action("LockLayout")->setChecked(s.value("LockLayout", false).toBool()); - if(Quassel::runMode() != Quassel::Monolithic) { - //showCoreConnectionDlg(true); // autoconnect if appropriate - } else { - startInternalCore(); + CoreConnection *conn = Client::coreConnection(); + if(!conn->connectToCore()) { + // No autoconnect selected (or no accounts) + showCoreConnectionDlg(); } } @@ -623,18 +638,11 @@ void MainWin::setupTitleSetter() { void MainWin::setupStatusBar() { // MessageProcessor progress - statusBar()->addPermanentWidget(msgProcessorStatusWidget); - - // Core Lag: - updateLagIndicator(); - statusBar()->addPermanentWidget(coreLagLabel); - coreLagLabel->hide(); - connect(Client::signalProxy(), SIGNAL(lagUpdated(int)), this, SLOT(updateLagIndicator(int))); + statusBar()->addPermanentWidget(_msgProcessorStatusWidget); - // SSL indicator - sslLabel->setPixmap(QPixmap()); - statusBar()->addPermanentWidget(sslLabel); - sslLabel->hide(); + // Connection state + _coreConnectionStatusWidget->update(); + statusBar()->addPermanentWidget(_coreConnectionStatusWidget); QAction *showStatusbar = QtUi::actionCollection("General")->action("ToggleStatusBar"); @@ -646,6 +654,8 @@ void MainWin::setupStatusBar() { connect(showStatusbar, SIGNAL(toggled(bool)), statusBar(), SLOT(setVisible(bool))); connect(showStatusbar, SIGNAL(toggled(bool)), this, SLOT(saveStatusBarStatus(bool))); + + connect(Client::coreConnection(), SIGNAL(connectionMsg(QString)), statusBar(), SLOT(showMessage(QString))); } void MainWin::setupHotList() { @@ -712,11 +722,11 @@ void MainWin::setConnectedState() { action->setVisible(!Client::internalCore()); } - disconnect(Client::backlogManager(), SIGNAL(updateProgress(int, int)), msgProcessorStatusWidget, SLOT(setProgress(int, int))); + disconnect(Client::backlogManager(), SIGNAL(updateProgress(int, int)), _msgProcessorStatusWidget, SLOT(setProgress(int, int))); disconnect(Client::backlogManager(), SIGNAL(messagesRequested(const QString &)), this, SLOT(showStatusBarMessage(const QString &))); disconnect(Client::backlogManager(), SIGNAL(messagesProcessed(const QString &)), this, SLOT(showStatusBarMessage(const QString &))); if(!Client::internalCore()) { - connect(Client::backlogManager(), SIGNAL(updateProgress(int, int)), msgProcessorStatusWidget, SLOT(setProgress(int, int))); + connect(Client::backlogManager(), SIGNAL(updateProgress(int, int)), _msgProcessorStatusWidget, SLOT(setProgress(int, int))); connect(Client::backlogManager(), SIGNAL(messagesRequested(const QString &)), this, SLOT(showStatusBarMessage(const QString &))); connect(Client::backlogManager(), SIGNAL(messagesProcessed(const QString &)), this, SLOT(showStatusBarMessage(const QString &))); } @@ -727,14 +737,7 @@ void MainWin::setConnectedState() { else statusBar()->clearMessage(); - if(Client::signalProxy()->isSecure()) { - sslLabel->setPixmap(SmallIcon("security-high")); - } else { - sslLabel->setPixmap(SmallIcon("security-low")); - } - - sslLabel->setVisible(!Client::internalCore()); - coreLagLabel->setVisible(!Client::internalCore()); + _coreConnectionStatusWidget->setVisible(!Client::internalCore()); updateIcon(); systemTray()->setState(SystemTray::Active); @@ -746,7 +749,7 @@ void MainWin::setConnectedState() { void MainWin::loadLayout() { QtUiSettings s; - int accountId = Client::currentCoreAccount().toInt(); + int accountId = Client::currentCoreAccount().accountId().toInt(); QByteArray state = s.value(QString("MainWinState-%1").arg(accountId)).toByteArray(); if(state.isEmpty()) { // Make sure that the default bufferview is shown @@ -761,19 +764,10 @@ void MainWin::loadLayout() { void MainWin::saveLayout() { QtUiSettings s; - int accountId = Client::currentCoreAccount().toInt(); + int accountId = Client::currentCoreAccount().accountId().toInt(); if(accountId > 0) s.setValue(QString("MainWinState-%1").arg(accountId) , saveState(accountId)); } -void MainWin::updateLagIndicator(int lag) { - QString text = tr("Core Lag: %1"); - if(lag == -1) - text = text.arg('-'); - else - text = text.arg("%1 msec").arg(lag); - coreLagLabel->setText(text); -} - void MainWin::disconnectedFromCore() { // save core specific layout and remove bufferviews; saveLayout(); @@ -808,21 +802,93 @@ void MainWin::setDisconnectedState() { coll->action("CoreInfo")->setEnabled(false); //_viewMenu->setEnabled(false); statusBar()->showMessage(tr("Not connected to core.")); - sslLabel->setPixmap(QPixmap()); - sslLabel->hide(); - updateLagIndicator(); - coreLagLabel->hide(); - if(msgProcessorStatusWidget) - msgProcessorStatusWidget->setProgress(0, 0); + if(_msgProcessorStatusWidget) + _msgProcessorStatusWidget->setProgress(0, 0); updateIcon(); systemTray()->setState(SystemTray::Inactive); } -void MainWin::startInternalCore() { - ClientSyncer *syncer = new ClientSyncer(); - Client::registerClientSyncer(syncer); - connect(syncer, SIGNAL(syncFinished()), syncer, SLOT(deleteLater()), Qt::QueuedConnection); - syncer->useInternalCore(); +void MainWin::userAuthenticationRequired(CoreAccount *account, bool *valid, const QString &errorMessage) { + Q_UNUSED(errorMessage) + CoreConnectAuthDlg dlg(account, this); + *valid = (dlg.exec() == QDialog::Accepted); +} + +void MainWin::handleNoSslInClient(bool *accepted) { + QMessageBox box(QMessageBox::Warning, tr("Unencrypted Connection"), tr("Your client does not support SSL encryption"), + QMessageBox::Ignore|QMessageBox::Cancel, this); + box.setInformativeText(tr("Sensitive data, like passwords, will be transmitted unencrypted to your Quassel core.")); + box.setDefaultButton(QMessageBox::Ignore); + *accepted = box.exec() == QMessageBox::Ignore; +} + +void MainWin::handleNoSslInCore(bool *accepted) { + QMessageBox box(QMessageBox::Warning, tr("Unencrypted Connection"), tr("Your core does not support SSL encryption"), + QMessageBox::Ignore|QMessageBox::Cancel, this); + box.setInformativeText(tr("Sensitive data, like passwords, will be transmitted unencrypted to your Quassel core.")); + box.setDefaultButton(QMessageBox::Ignore); + *accepted = box.exec() == QMessageBox::Ignore; + +} + +#ifdef HAVE_SSL + +void MainWin::handleSslErrors(const QSslSocket *socket, bool *accepted, bool *permanently) { + QString errorString = ""; + + QMessageBox box(QMessageBox::Warning, + tr("Untrusted Security Certificate"), + tr("The SSL certificate provided by the core at %1 is untrusted for the following reasons:").arg(socket->peerName()), + QMessageBox::Cancel, this); + box.setInformativeText(errorString); + box.addButton(tr("Continue"), QMessageBox::AcceptRole); + box.setDefaultButton(box.addButton(tr("Show Certificate"), QMessageBox::HelpRole)); + + QMessageBox::ButtonRole role; + do { + box.exec(); + role = box.buttonRole(box.clickedButton()); + if(role == QMessageBox::HelpRole) { + SslInfoDlg dlg(socket, this); + dlg.exec(); + } + } while(role == QMessageBox::HelpRole); + + *accepted = role == QMessageBox::AcceptRole; + if(*accepted) { + QMessageBox box2(QMessageBox::Warning, + tr("Untrusted Security Certificate"), + tr("Would you like to accept this certificate forever without being prompted?"), + 0, this); + box2.setDefaultButton(box2.addButton(tr("Current Session Only"), QMessageBox::NoRole)); + box2.addButton(tr("Forever"), QMessageBox::YesRole); + box2.exec(); + *permanently = box2.buttonRole(box2.clickedButton()) == QMessageBox::YesRole; + } +} + +#endif /* HAVE_SSL */ + +void MainWin::handleCoreConnectionError(const QString &error) { + QMessageBox::critical(this, tr("Core Connection Error"), error, QMessageBox::Ok); +} + +void MainWin::showCoreConnectionDlg() { + CoreConnectDlg dlg(this); + if(dlg.exec() == QDialog::Accepted) { + AccountId accId = dlg.selectedAccount(); + if(accId.isValid()) + Client::coreConnection()->connectToCore(accId); + } +} + +void MainWin::showCoreConfigWizard(const QVariantList &backends) { + CoreConfigWizard *wizard = new CoreConfigWizard(Client::coreConnection(), backends, this); + + wizard->show(); } void MainWin::showChannelList(NetworkId netId) { @@ -872,25 +938,26 @@ void MainWin::showSettingsDlg() { //Category: Interface dlg->registerSettingsPage(new AppearanceSettingsPage(dlg)); dlg->registerSettingsPage(new ChatViewSettingsPage(dlg)); + dlg->registerSettingsPage(new ChatMonitorSettingsPage(dlg)); dlg->registerSettingsPage(new ItemViewSettingsPage(dlg)); + dlg->registerSettingsPage(new BufferViewSettingsPage(dlg)); dlg->registerSettingsPage(new InputWidgetSettingsPage(dlg)); dlg->registerSettingsPage(new TopicWidgetSettingsPage(dlg)); dlg->registerSettingsPage(new HighlightSettingsPage(dlg)); dlg->registerSettingsPage(new NotificationsSettingsPage(dlg)); dlg->registerSettingsPage(new BacklogSettingsPage(dlg)); - dlg->registerSettingsPage(new BufferViewSettingsPage(dlg)); - dlg->registerSettingsPage(new ChatMonitorSettingsPage(dlg)); - //Category: Misc - dlg->registerSettingsPage(new GeneralSettingsPage(dlg)); + //Category: IRC dlg->registerSettingsPage(new ConnectionSettingsPage(dlg)); dlg->registerSettingsPage(new IdentitiesSettingsPage(dlg)); dlg->registerSettingsPage(new NetworksSettingsPage(dlg)); dlg->registerSettingsPage(new AliasesSettingsPage(dlg)); dlg->registerSettingsPage(new IgnoreListSettingsPage(dlg)); + // Category: Remote Cores if(Quassel::runMode() != Quassel::Monolithic) { dlg->registerSettingsPage(new CoreAccountSettingsPage(dlg)); + dlg->registerSettingsPage(new CoreConnectionSettingsPage(dlg)); } dlg->show();