summaryrefslogtreecommitdiffstats
path: root/common/rfb/Blacklist.h
diff options
context:
space:
mode:
Diffstat (limited to 'common/rfb/Blacklist.h')
-rw-r--r--common/rfb/Blacklist.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/common/rfb/Blacklist.h b/common/rfb/Blacklist.h
new file mode 100644
index 00000000..0eb38460
--- /dev/null
+++ b/common/rfb/Blacklist.h
@@ -0,0 +1,91 @@
+/* Copyright (C) 2002-2005 RealVNC Ltd. All Rights Reserved.
+ *
+ * This 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 software 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 software; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+ * USA.
+ */
+
+//
+// Blacklist.h - Handling of black-listed entities.
+// Just keeps a table mapping strings to timing information, including
+// how many times the entry has been black-listed and when to next
+// put it on probation (e.g. allow a connection in from the host, and
+// re-blacklist it if that fails).
+//
+
+#ifndef __RFB_BLACKLIST_H__
+#define __RFB_BLACKLIST_H__
+
+#include <string.h>
+#include <time.h>
+#include <map>
+
+#include <rfb/Configuration.h>
+#include <rfb/util.h>
+
+namespace rfb {
+
+ //
+ // -=- Blacklist handler
+ //
+ // Parameters include a threshold after which to blacklist the named
+ // host, and a timeout after which to re-consider them.
+ //
+ // Threshold means that isBlackmarked can be called that number of times
+ // before it will return true.
+ //
+ // Timeout means that after that many seconds, the next call to isBlackmarked
+ // will return false. At the same time, the timeout is doubled, so that the
+ // next calls will fail, until the timeout expires again or clearBlackmark is
+ // called.
+ //
+ // When clearBlackMark is called, the corresponding entry is completely
+ // removed, causing the next isBlackmarked call to return false.
+
+ // KNOWN BUG: Client can keep making rejected requests, thus increasing
+ // their timeout. If client does this for 30 years, timeout may wrap round
+ // to a very small value again.
+
+ // THIS CLASS IS NOT THREAD-SAFE!
+
+ class Blacklist {
+ public:
+ Blacklist();
+ ~Blacklist();
+
+ bool isBlackmarked(const char* name);
+ void clearBlackmark(const char* name);
+
+ static IntParameter threshold;
+ static IntParameter initialTimeout;
+
+ protected:
+ struct ltStr {
+ bool operator()(const char* s1, const char* s2) const {
+ return strcmp(s1, s2) < 0;
+ };
+ };
+ struct BlacklistInfo {
+ int marks;
+ time_t blockUntil;
+ unsigned int blockTimeout;
+ };
+ typedef std::map<const char*,BlacklistInfo,ltStr> BlacklistMap;
+ BlacklistMap blm;
+ };
+
+}
+
+#endif
+