identd: Rework lowestSocketId handling
[quassel.git] / src / core / identserver.cpp
index 08b1b67..ea1295e 100644 (file)
@@ -32,7 +32,7 @@ IdentServer::IdentServer(bool strict, QObject *parent) : QObject(parent), _stric
 IdentServer::~IdentServer() = default;
 
 bool IdentServer::startListening() {
-    uint16_t port = 10113;
+    uint16_t port = Quassel::optionValue("ident-port").toUShort();
 
     bool success = false;
     if (_v6server.listen(QHostAddress("::1"), port)) {
@@ -96,53 +96,50 @@ void IdentServer::respond() {
 
     qint64 transactionId = _socketId;
 
-    if (socket->canReadLine()) {
-        QByteArray query = socket->readLine();
-        if (query.endsWith("\r\n"))
-            query.chop(2);
-        else if (query.endsWith("\n"))
-            query.chop(1);
+    if (!socket->canReadLine()) {
+        return;
+    }
 
-        QList<QByteArray> split = query.split(',');
+    QByteArray query = socket->readLine();
+    if (query.endsWith("\r\n"))
+        query.chop(2);
+    else if (query.endsWith("\n"))
+        query.chop(1);
 
-        bool success = false;
+    QList<QByteArray> split = query.split(',');
 
-        quint16 localPort;
-        if (!split.empty()) {
-            localPort = split[0].trimmed().toUShort(&success, 10);
-        }
+    bool success = false;
 
-        Request request{socket, localPort, query, transactionId, _requestId++};
-        if (!success) {
-            responseUnavailable(request);
-        } else if (!responseAvailable(request)) {
-            if (hasSocketsBelowId(transactionId)) {
-                _requestQueue.emplace_back(request);
-            } else {
-                responseUnavailable(request);
-            }
-        }
+    quint16 localPort = 0;
+    if (!split.empty()) {
+        localPort = split[0].trimmed().toUShort(&success, 10);
+    }
+
+    Request request{socket, localPort, query, transactionId, _requestId++};
+    if (!success) {
+        responseUnavailable(request);
+    } else if (responseAvailable(request)) {
+        // success
+    } else if (lowestSocketId() < transactionId) {
+        _requestQueue.emplace_back(request);
+    } else {
+        responseUnavailable(request);
     }
 }
 
 bool IdentServer::responseAvailable(Request request) {
-    QString user;
-    bool success = true;
-    if (_connections.contains(request.localPort)) {
-        user = _connections[request.localPort];
-    } else {
-        success = false;
+    if (!_connections.contains(request.localPort)) {
+        return false;
     }
 
-    QString data;
-    if (success) {
-        data += request.query + " : USERID : Quassel : " + user + "\r\n";
+    QString user = _connections[request.localPort];
+    QString data = request.query + " : USERID : Quassel : " + user + "\r\n";
 
-        request.socket->write(data.toUtf8());
-        request.socket->flush();
-        request.socket->close();
-    }
-    return success;
+    request.socket->write(data.toUtf8());
+    request.socket->flush();
+    request.socket->close();
+
+    return true;
 }
 
 void IdentServer::responseUnavailable(Request request) {
@@ -185,10 +182,12 @@ qint64 IdentServer::addWaitingSocket() {
     return newSocketId;
 }
 
-bool IdentServer::hasSocketsBelowId(qint64 id) {
-    return std::any_of(_waiting.begin(), _waiting.end(), [=](qint64 socketId) {
-        return socketId <= id;
-    });
+qint64 IdentServer::lowestSocketId() {
+    if (_waiting.empty()) {
+        return std::numeric_limits<qint64>::max();
+    }
+
+    return _waiting.front();
 }
 
 void IdentServer::removeWaitingSocket(qint64 socketId) {
@@ -196,21 +195,15 @@ void IdentServer::removeWaitingSocket(qint64 socketId) {
 }
 
 void IdentServer::processWaiting(qint64 socketId) {
-    qint64 lowestSocketId = std::numeric_limits<qint64 >::max();
-    for (qint64 id : _waiting) {
-        if (id < lowestSocketId) {
-            lowestSocketId = id;
-        }
-    }
     removeWaitingSocket(socketId);
     _requestQueue.remove_if([=](Request request) {
-        if (request.transactionId < lowestSocketId) {
-            responseUnavailable(request);
+        if (socketId < request.transactionId && responseAvailable(request)) {
             return true;
-        } else if (request.transactionId > socketId) {
-            return responseAvailable(request);
-        } else {
+        } else if (lowestSocketId() < request.transactionId) {
             return false;
+        } else {
+            responseUnavailable(request);
+            return true;
         }
     });
 }