X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fnetworkconnection.cpp;h=a461d262e987ea8f34b6cd5fc50ca46fd01c98c0;hp=fd7e2ba50deb8588ca7fa6d0d85b5cdc0f70bcb4;hb=90ee8b5c90923a3d4a48fc5493ca999e9d0d6a97;hpb=236e70030428e5b85309d6ddb97b772fa3efe61a diff --git a/src/core/networkconnection.cpp b/src/core/networkconnection.cpp index fd7e2ba5..a461d262 100644 --- a/src/core/networkconnection.cpp +++ b/src/core/networkconnection.cpp @@ -65,7 +65,12 @@ NetworkConnection::NetworkConnection(Network *network, CoreSession *session) : Q connect(network, SIGNAL(autoReconnectIntervalSet(quint32)), this, SLOT(autoReconnectSettingsChanged())); connect(network, SIGNAL(autoReconnectRetriesSet(quint16)), this, SLOT(autoReconnectSettingsChanged())); +#ifndef QT_NO_OPENSSL + connect(&socket, SIGNAL(encrypted()), this, SLOT(socketEncrypted())); + connect(&socket, SIGNAL(sslErrors(const QList &)), this, SLOT(sslErrors(const QList &))); +#endif connect(&socket, SIGNAL(connected()), this, SLOT(socketConnected())); + connect(&socket, SIGNAL(disconnected()), this, SLOT(socketDisconnected())); connect(&socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError))); connect(&socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(socketStateChanged(QAbstractSocket::SocketState))); @@ -73,6 +78,8 @@ NetworkConnection::NetworkConnection(Network *network, CoreSession *session) : Q connect(_ircServerHandler, SIGNAL(nickChanged(const QString &, const QString &)), this, SLOT(nickChanged(const QString &, const QString &))); + + network->proxy()->attachSignal(this, SIGNAL(sslErrors(const QVariant &))); } NetworkConnection::~NetworkConnection() { @@ -206,7 +213,7 @@ void NetworkConnection::connectToIrc(bool reconnecting) { } } _previousConnectionAttemptFailed = false; - + QString host = serverList[_lastUsedServerlistIndex].toMap()["Host"].toString(); quint16 port = serverList[_lastUsedServerlistIndex].toMap()["Port"].toUInt(); displayStatusMsg(tr("Connecting to %1:%2...").arg(host).arg(port)); @@ -273,6 +280,11 @@ void NetworkConnection::disconnectFromIrc(bool requested) { void NetworkConnection::socketHasData() { while(socket.canReadLine()) { QByteArray s = socket.readLine().trimmed(); + // FIXME debug + if(Global::SPUTDEV && s == lastMsgReceived) { + qWarning() << "NetworkConnection::socketHasData(): Message repeated! -> loop?"; + } + lastMsgReceived = s; ircServerHandler()->handleServerMsg(s); } } @@ -293,7 +305,46 @@ void NetworkConnection::socketError(QAbstractSocket::SocketError) { //exit(1); } +#ifndef QT_NO_OPENSSL + +void NetworkConnection::sslErrors(const QList &errors) { + socket.ignoreSslErrors(); + /* TODO errorhandling + QVariantMap errmsg; + QVariantList errnums; + foreach(QSslError err, errors) errnums << err.error(); + errmsg["SslErrors"] = errnums; + errmsg["SslCert"] = socket.peerCertificate().toPem(); + errmsg["PeerAddress"] = socket.peerAddress().toString(); + errmsg["PeerPort"] = socket.peerPort(); + errmsg["PeerName"] = socket.peerName(); + emit sslErrors(errmsg); + disconnectFromIrc(); + */ +} + +void NetworkConnection::socketEncrypted() { + //qDebug() << "encrypted!"; + socketInitialized(); +} + +#endif // QT_NO_OPENSSL + void NetworkConnection::socketConnected() { +#ifdef QT_NO_OPENSSL + socketInitialized(); + return; +#else + if(!network()->serverList()[_lastUsedServerlistIndex].toMap()["UseSSL"].toBool()) { + socketInitialized(); + return; + } + //qDebug() << "starting handshake"; + socket.startClientEncryption(); +#endif +} + +void NetworkConnection::socketInitialized() { //emit connected(networkId()); initialize first! Identity *identity = coreSession()->identity(network()->identity()); if(!identity) { @@ -301,6 +352,10 @@ void NetworkConnection::socketConnected() { disconnectFromIrc(); return; } + QString passwd = network()->serverList()[_lastUsedServerlistIndex].toMap()["Password"].toString(); + if(!passwd.isEmpty()) { + putRawLine(serverEncode(QString("PASS %1").arg(passwd))); + } putRawLine(serverEncode(QString("NICK :%1").arg(identity->nicks()[0]))); // FIXME: try more nicks if error occurs putRawLine(serverEncode(QString("USER %1 8 * :%2").arg(identity->ident(), identity->realName()))); }