X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fclient%2Fclientsyncer.cpp;h=e9d64f3206131bc36c917050eafca64558455ff6;hp=234a3c9f942cc4ddfa54e0d5f88b1055802d7f2a;hb=4aed4b037ea6feaeec09743e5d6018f58d47a535;hpb=480eab8daec4fb56a6886918c6a913cc197330f1 diff --git a/src/client/clientsyncer.cpp b/src/client/clientsyncer.cpp index 234a3c9f..e9d64f32 100644 --- a/src/client/clientsyncer.cpp +++ b/src/client/clientsyncer.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 * @@ -26,8 +26,6 @@ #include "client.h" #include "identity.h" -#include "ircuser.h" -#include "ircchannel.h" #include "network.h" #include "networkmodel.h" #include "quassel.h" @@ -125,10 +123,10 @@ void ClientSyncer::connectToCore(const QVariantMap &conn) { #ifdef HAVE_SSL QSslSocket *sock = new QSslSocket(Client::instance()); + connect(sock, SIGNAL(encrypted()), this, SIGNAL(encrypted())); #else if(conn["useSsl"].toBool()) { emit connectionError(tr("This client is built without SSL Support!
Disable the usage of SSL in the account settings.")); - emit encrypted(false); return; } QTcpSocket *sock = new QTcpSocket(Client::instance()); @@ -157,7 +155,6 @@ void ClientSyncer::coreSocketConnected() { QVariantMap clientInit; clientInit["MsgType"] = "ClientInit"; clientInit["ClientVersion"] = Quassel::buildInfo().fancyVersionString; - clientInit["ClientBuild"] = 860; // FIXME legacy! clientInit["ClientDate"] = Quassel::buildInfo().buildDate; clientInit["ProtocolVersion"] = Quassel::buildInfo().protocolVersion; clientInit["UseSsl"] = coreConnectionInfo["useSsl"]; @@ -170,6 +167,38 @@ void ClientSyncer::coreSocketConnected() { SignalProxy::writeDataToDevice(socket, clientInit); } +void ClientSyncer::useInternalCore() { + AccountId internalAccountId; + + CoreAccountSettings accountSettings; + QList knownAccounts = accountSettings.knownAccounts(); + foreach(AccountId id, knownAccounts) { + if(!id.isValid()) + continue; + QVariantMap data = accountSettings.retrieveAccountData(id); + if(data.contains("InternalAccount") && data["InternalAccount"].toBool()) { + internalAccountId = id; + break; + } + } + + if(!internalAccountId.isValid()) { + for(AccountId i = 1;; i++) { + if(!knownAccounts.contains(i)) { + internalAccountId = i; + break; + } + } + QVariantMap data; + data["InternalAccount"] = true; + accountSettings.storeAccountData(internalAccountId, data); + } + + coreConnectionInfo["AccountId"] = QVariant::fromValue(internalAccountId); + emit startInternalCore(this); + emit connectToInternalCore(Client::instance()->signalProxy()); +} + void ClientSyncer::coreSocketDisconnected() { emit socketDisconnected(); Client::instance()->disconnectFromCore(); @@ -184,9 +213,7 @@ void ClientSyncer::coreSocketDisconnected() { void ClientSyncer::clientInitAck(const QVariantMap &msg) { // Core has accepted our version info and sent its own. Let's see if we accept it as well... - uint ver = 0; - if(!msg.contains("ProtocolVersion") && msg["CoreBuild"].toUInt() >= 732) ver = 1; // legacy! - if(msg.contains("ProtocolVersion")) ver = msg["ProtocolVersion"].toUInt(); + uint ver = msg["ProtocolVersion"].toUInt(); if(ver < Quassel::buildInfo().clientNeedsProtocol) { emit connectionError(tr("The Quassel Core you are trying to connect to is too old!
" "Need at least core/client protocol v%1 to connect.").arg(Quassel::buildInfo().clientNeedsProtocol)); @@ -195,36 +222,42 @@ void ClientSyncer::clientInitAck(const QVariantMap &msg) { } emit connectionMsg(msg["CoreInfo"].toString()); +#ifndef QT_NO_COMPRESS + if(msg["SupportsCompression"].toBool()) { + socket->setProperty("UseCompression", true); + } +#endif + + _coreMsgBuffer = msg; #ifdef HAVE_SSL if(coreConnectionInfo["useSsl"].toBool()) { if(msg["SupportSsl"].toBool()) { QSslSocket *sslSocket = qobject_cast(socket); Q_ASSERT(sslSocket); + connect(sslSocket, SIGNAL(encrypted()), this, SLOT(sslSocketEncrypted())); connect(sslSocket, SIGNAL(sslErrors(const QList &)), this, SLOT(sslErrors(const QList &))); + sslSocket->startClientEncryption(); - emit encrypted(true); - Client::instance()->setSecuredConnection(); } else { emit connectionError(tr("The Quassel Core you are trying to connect to does not support SSL!
If you want to connect anyways, disable the usage of SSL in the account settings.")); - emit encrypted(false); disconnectFromCore(); - return; } + return; } #endif + // if we use SSL we wait for the next step until every SSL warning has been cleared + connectionReady(); +} -#ifndef QT_NO_COMPRESS - if(msg["SupportsCompression"].toBool()) { - socket->setProperty("UseCompression", true); - } -#endif - - if(!msg["Configured"].toBool()) { +void ClientSyncer::connectionReady() { + if(!_coreMsgBuffer["Configured"].toBool()) { // start wizard - emit startCoreSetup(msg["StorageBackends"].toList()); - } else if(msg["LoginEnabled"].toBool()) { + emit startCoreSetup(_coreMsgBuffer["StorageBackends"].toList()); + } else if(_coreMsgBuffer["LoginEnabled"].toBool()) { emit startLogin(); } + _coreMsgBuffer.clear(); + resetWarningsHandler(); } void ClientSyncer::doCoreSetup(const QVariant &setupData) { @@ -243,17 +276,22 @@ void ClientSyncer::loginToCore(const QString &user, const QString &passwd) { SignalProxy::writeDataToDevice(socket, clientLogin); } +void ClientSyncer::internalSessionStateReceived(const QVariant &packedState) { + QVariantMap state = packedState.toMap(); + emit sessionProgress(1, 1); + Client::instance()->setConnectedToCore(coreConnectionInfo["AccountId"].value()); + syncToCore(state); +} + void ClientSyncer::sessionStateReceived(const QVariantMap &state) { emit sessionProgress(1, 1); disconnect(this, SIGNAL(recvPartialItem(quint32, quint32)), this, SIGNAL(sessionProgress(quint32, quint32))); disconnect(socket, 0, this, 0); // rest of communication happens through SignalProxy - //Client::signalProxy()->addPeer(socket); - Client::instance()->setConnectedToCore(socket, coreConnectionInfo["AccountId"].value()); + Client::instance()->setConnectedToCore(coreConnectionInfo["AccountId"].value(), socket); syncToCore(state); } void ClientSyncer::syncToCore(const QVariantMap &sessionState) { - // create identities foreach(QVariant vid, sessionState["Identities"].toList()) { Client::instance()->coreIdentityCreated(vid.value()); @@ -277,6 +315,8 @@ void ClientSyncer::syncToCore(const QVariantMap &sessionState) { // create network objects foreach(QVariant networkid, networkids) { NetworkId netid = networkid.value(); + if(Client::network(netid)) + continue; Network *net = new Network(netid, Client::instance()); netsToSync.insert(net); connect(net, SIGNAL(initDone()), this, SLOT(networkInitDone())); @@ -298,14 +338,44 @@ void ClientSyncer::checkSyncState() { } } +void ClientSyncer::setWarningsHandler(const char *slot) { + resetWarningsHandler(); + connect(this, SIGNAL(handleIgnoreWarnings(bool)), this, slot); +} + +void ClientSyncer::resetWarningsHandler() { + disconnect(this, SIGNAL(handleIgnoreWarnings(bool)), this, 0); +} + #ifdef HAVE_SSL -void ClientSyncer::sslErrors(const QList &errors) { - qDebug() << "SSL Errors:"; - foreach(QSslError err, errors) - qDebug() << " " << err; +void ClientSyncer::ignoreSslWarnings(bool permanently) { + QAbstractSocket *sock = qobject_cast(socket); + if(sock) { + // ensure that a proper state is displayed and no longer a warning + emit socketStateChanged(sock->state()); + } + emit connectionMsg(_coreMsgBuffer["CoreInfo"].toString()); + connectionReady(); +} +void ClientSyncer::sslSocketEncrypted() { QSslSocket *socket = qobject_cast(sender()); - if(socket) + if(socket) { + QByteArray digest = socket->peerCertificate().digest(); + } +} + +void ClientSyncer::sslErrors(const QList &errors) { + QSslSocket *socket = qobject_cast(sender()); + if(socket) { socket->ignoreSslErrors(); + } + + QStringList warnings; + foreach(QSslError err, errors) + warnings << err.errorString(); + + setWarningsHandler(SLOT(ignoreSslWarnings(bool))); + emit connectionWarnings(warnings); } #endif