summaryrefslogtreecommitdiffstats
path: root/libktorrent/torrent/ipblocklist.h
diff options
context:
space:
mode:
Diffstat (limited to 'libktorrent/torrent/ipblocklist.h')
-rw-r--r--libktorrent/torrent/ipblocklist.h175
1 files changed, 175 insertions, 0 deletions
diff --git a/libktorrent/torrent/ipblocklist.h b/libktorrent/torrent/ipblocklist.h
new file mode 100644
index 0000000..b30a856
--- /dev/null
+++ b/libktorrent/torrent/ipblocklist.h
@@ -0,0 +1,175 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+#ifndef IPBLOCKLIST_H
+#define IPBLOCKLIST_H
+
+#include <interfaces/ipblockinginterface.h>
+
+#include <qmap.h>
+#include <qstringlist.h>
+#include <util/constants.h>
+
+class QString;
+
+namespace bt
+{
+ class IPKey
+ {
+ public:
+ IPKey();
+ IPKey(QString& ip, Uint32 mask = 0xFFFFFFFF);
+ IPKey(Uint32 ip, Uint32 mask = 0xFFFFFFFF);
+ IPKey(const IPKey& ip);
+ ~IPKey();
+
+ bool operator== (const IPKey& ip) const;
+ bool operator!= (const IPKey& ip) const;
+ bool operator < (const IPKey & ip) const;
+ IPKey& operator= (const IPKey& ip);
+
+ QString toString();
+
+ Uint32 m_ip;
+ Uint32 m_mask;
+ };
+
+ /**
+ * @author Ivan Vasic <ivasic@gmail.com>
+ * @brief Keeps track of blocked peers
+ *
+ * This class is used for keeping the IP addresses list of peers that
+ * have sent bad chunks.
+ *
+ * Peers that have sent >= 3 bad chunks are blocked.
+ */
+ class IPBlocklist
+ {
+ IPBlocklist();
+ IPBlocklist(const IPBlocklist & );
+ const IPBlocklist& operator=(const IPBlocklist&);
+
+ public:
+
+ inline static IPBlocklist & instance()
+ {
+ static IPBlocklist singleton;
+ return singleton;
+ }
+
+ /**
+ * @brief Adds ip address to the list.
+ * It also increases the number of times this IP appeared in the list.
+ * @param ip QString containing the peer IP address
+ * @param state int number of bad chunks client from ip sent. Basically this parameter
+ * is used only to permanently block some IP (by setting this param to 3)
+ */
+ void insert(QString ip, int state=1);
+
+ /**
+ * @brief Adds IP range to the list
+ * It is used for blocking plugin. For single IP use insert() instead.
+ * @param ip QString peer IP address. Uses ''*" for ranges.
+ **/
+ void addRange(QString ip);
+
+
+ /**
+ * @brief Removes IP range from list
+ * It is used for blocking plugin.
+ * @param ip QString peer IP address. Uses ''*" for ranges.
+ **/
+ void removeRange(QString ip);
+
+ /**
+ * Checks if IP is in the blocking list
+ * @param ip - IP address to check
+ * @returns true if IP is blocked
+ */
+ bool isBlocked(const QString& ip);
+
+ /**
+ * @brief Sets the pointer to the IPBlockingInterface (IPBlocking plugin)
+ * Call this function from IPBlocking plugin when it gets loaded.
+ * @arg ptr - pointer to be set
+ */
+ void setPluginInterfacePtr(kt::IPBlockingInterface* ptr);
+
+ /**
+ * @brief Unsets the interface pointer
+ * Call this when IPBlockingPlugin gets unloaded or deleted
+ */
+ void unsetPluginInterfacePtr() { pluginInterface = 0; }
+
+
+ /**
+ * @brief This function will fill QStringList with all banned peer IP addresses.
+ * @return QStringList filled with blacklisted peers.
+ * It will create a new QStringList object so don't forget to delete it after using.
+ */
+ QStringList* getBlocklist();
+
+
+ /**
+ * @brief This function will load blacklisted peers to IPFilter.
+ * @param list QStringList containing all banned peers.
+ * @note This function will remove current peers from blocklist before setting new list!!!
+ */
+ void setBlocklist(QStringList* list);
+
+ private:
+
+ /**
+ * Pointer to the IPBlocking plugin which implements IPBlockingInterface
+ * Used to provide a way to use this plugin functions from within this class
+ */
+ kt::IPBlockingInterface* pluginInterface;
+
+ /**
+ * @param IPKey - Key: Peer IP address and bit mask if it is a range
+ * @param int - Number of bad chunks sent.
+ **/
+ QMap<IPKey, int> m_peers;
+
+ /**
+ * @brief Adds IP range to the list.
+ * @param key IPKey that represents this IP range
+ * @param state int Number of 'warnings' for the range.
+ * Default is 3 - that means range is blocked permanently.
+ */
+ void insertRangeIP(IPKey& key, int state=3);
+
+
+ /**
+ * Checks if IP is listed in local database (IPBlocklist::m_peers)
+ * @return TRUE if IP is to be blocked
+ */
+ bool isBlockedLocal(const QString& ip);
+
+ /**
+ * Checks if IP is listed in plugins antip2p file
+ * @return TRUE if IP is to be blocked
+ */
+ bool isBlockedPlugin(const QString& ip);
+ };
+}
+
+#endif
+