From eb06d6b4ea1b37887f7578b2645e2b0ff8b967e6 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Sun, 29 Jan 2012 20:55:24 +0100 Subject: [PATCH] when banning an ip address, terminate the connection of everyone with that address --- servatrice/src/servatrice.cpp | 10 ++++++++++ servatrice/src/servatrice.h | 1 + servatrice/src/serversocketinterface.cpp | 15 ++++++++++----- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index 237cd1b6..88941987 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -394,6 +394,16 @@ int Servatrice::getUsersWithAddress(const QHostAddress &address) const return result; } +QList Servatrice::getUsersWithAddressAsList(const QHostAddress &address) const +{ + QMutexLocker locker(&serverMutex); + QList result; + for (int i = 0; i < clients.size(); ++i) + if (static_cast(clients[i])->getPeerAddress() == address) + result.append(static_cast(clients[i])); + return result; +} + int Servatrice::startSession(const QString &userName, const QString &address) { if (authenticationMethod == AuthenticationNone) diff --git a/servatrice/src/servatrice.h b/servatrice/src/servatrice.h index c216cdce..dc8b1dd1 100644 --- a/servatrice/src/servatrice.h +++ b/servatrice/src/servatrice.h @@ -73,6 +73,7 @@ public: void updateLoginMessage(); ServerInfo_User getUserData(const QString &name); int getUsersWithAddress(const QHostAddress &address) const; + QList getUsersWithAddressAsList(const QHostAddress &address) const; QMap getBuddyList(const QString &name); QMap getIgnoreList(const QString &name); bool isInBuddyList(const QString &whoseList, const QString &who); diff --git a/servatrice/src/serversocketinterface.cpp b/servatrice/src/serversocketinterface.cpp index ece22778..0cf3a52c 100644 --- a/servatrice/src/serversocketinterface.cpp +++ b/servatrice/src/serversocketinterface.cpp @@ -505,16 +505,21 @@ Response::ResponseCode ServerSocketInterface::cmdBanFromServer(const Command_Ban servatrice->execSqlQuery(query); servatrice->dbMutex.unlock(); + QList userList = servatrice->getUsersWithAddressAsList(QHostAddress(address)); ServerSocketInterface *user = static_cast(server->getUsers().value(userName)); - if (user) { + if (user && !userList.contains(user)) + userList.append(user); + if (!userList.isEmpty()) { Event_ConnectionClosed event; event.set_reason(Event_ConnectionClosed::BANNED); if (cmd.has_visible_reason()) event.set_reason_str(cmd.visible_reason()); - SessionEvent *se = user->prepareSessionEvent(event); - user->sendProtocolItem(*se); - delete se; - user->deleteLater(); + for (int i = 0; i < userList.size(); ++i) { + SessionEvent *se = userList[i]->prepareSessionEvent(event); + userList[i]->sendProtocolItem(*se); + userList[i]->deleteLater(); + delete se; + } } return Response::RespOk;