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)) {
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) {
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) {
}
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;
}
});
}