X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcore%2Fcore.cpp;h=01b341c8f46d0645d51db70998eb226d1f817a3b;hb=5b53e584f269e9ac1201a428a3812a7a0607ee34;hp=dd33cec542f80c163da4522f59f198afb19e231d;hpb=50680e8d8548a9b856faa7c5d3d5d4ae4a6be2bd;p=quassel.git diff --git a/src/core/core.cpp b/src/core/core.cpp index dd33cec5..01b341c8 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -85,7 +85,8 @@ void Core::init() { } } - connect(&server, SIGNAL(newConnection()), this, SLOT(incomingConnection())); + connect(&_server, SIGNAL(newConnection()), this, SLOT(incomingConnection())); + connect(&_v6server, SIGNAL(newConnection()), this, SLOT(incomingConnection())); if(!startListening(cs.port())) exit(1); // TODO make this less brutal } @@ -343,31 +344,33 @@ QHash Core::bufferLastSeenMsgIds(UserId user) { bool Core::startListening(uint port) { bool success = false; - // let's see if ipv6 is available - success = server.listen(QHostAddress::AnyIPv6, port); - - if(!success && server.serverError() == QAbstractSocket::UnsupportedSocketOperationError) { - // fall back to v4 - success = server.listen(QHostAddress::Any, port); + if(_server.listen(QHostAddress::Any, port)) { + quInfo() << "Listening for GUI clients on IPv6 port" << _server.serverPort() << "using protocol version" << Global::protocolVersion; + success = true; + } + if(_v6server.listen(QHostAddress::AnyIPv6, port)) { + quInfo() << "Listening for GUI clients on IPv4 port" << _v6server.serverPort() << "using protocol version" << Global::protocolVersion; + success = true; } if(!success) { - quError() << qPrintable(QString("Could not open GUI client port %1: %2").arg(port).arg(server.errorString())); - } else { - quInfo() << "Listening for GUI clients on port" << server.serverPort() << "using protocol version" << Global::protocolVersion; + quError() << qPrintable(QString("Could not open GUI client port %1: %2").arg(port).arg(_server.errorString())); } return success; } void Core::stopListening() { - server.close(); + _server.close(); + _v6server.close(); quInfo() << "No longer listening for GUI clients."; } void Core::incomingConnection() { - while(server.hasPendingConnections()) { - QTcpSocket *socket = server.nextPendingConnection(); + QTcpServer *server = qobject_cast(sender()); + Q_ASSERT(server); + while(server->hasPendingConnections()) { + QTcpSocket *socket = server->nextPendingConnection(); connect(socket, SIGNAL(disconnected()), this, SLOT(clientDisconnected())); connect(socket, SIGNAL(readyRead()), this, SLOT(clientHasData())); connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError))); @@ -376,8 +379,9 @@ void Core::incomingConnection() { blocksizes.insert(socket, (quint32)0); quInfo() << qPrintable(tr("Client connected from")) << qPrintable(socket->peerAddress().toString()); - if (!configured) { - server.close(); + if(!configured) { + _server.close(); + _v6server.close(); quDebug() << "Closing server for basic setup."; } } @@ -433,8 +437,8 @@ void Core::processClientMessage(QTcpSocket *socket, const QVariantMap &msg) { "Up %3d%4h%5m (since %6)").arg(Global::quasselVersion).arg(Global::quasselBuildDate) .arg(updays).arg(uphours,2,10,QChar('0')).arg(upmins,2,10,QChar('0')).arg(startTime().toString(Qt::TextDate)); -#ifndef QT_NO_OPENSSL - SslServer *sslServer = qobject_cast(&server); +#ifdef HAVE_SSL + SslServer *sslServer = qobject_cast(&_server); QSslSocket *sslSocket = qobject_cast(socket); bool supportSsl = (bool)sslServer && (bool)sslSocket && sslServer->certIsValid(); #else @@ -472,7 +476,7 @@ void Core::processClientMessage(QTcpSocket *socket, const QVariantMap &msg) { reply["MsgType"] = "ClientInitAck"; SignalProxy::writeDataToDevice(socket, reply); -#ifndef QT_NO_OPENSSL +#ifdef HAVE_SSL // after we told the client that we are ssl capable we switch to ssl mode if(supportSsl && msg["UseSsl"].toBool()) { quDebug() << qPrintable(tr("Starting TLS for Client:")) << qPrintable(socket->peerAddress().toString()); @@ -597,7 +601,7 @@ SessionThread *Core::createSession(UserId uid, bool restore) { return sess; } -#ifndef QT_NO_OPENSSL +#ifdef HAVE_SSL void Core::sslErrors(const QList &errors) { Q_UNUSED(errors); QSslSocket *socket = qobject_cast(sender());