summaryrefslogtreecommitdiffstats
path: root/pica-registrar
diff options
context:
space:
mode:
authorme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2012-07-24 22:56:51 +0000
committerme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2012-07-24 22:56:51 +0000
commit9d70c13411d4544f346dd3462c0f94a7a7ff3450 (patch)
tree5ba220ab4a74f66643d18cc04778c85f413e1aab /pica-registrar
parentc7323aafac1769cb809da3f1d7ddd05383ace641 (diff)
downloadpica-pica-9d70c13411d4544f346dd3462c0f94a7a7ff3450.tar.gz
pica-pica-9d70c13411d4544f346dd3462c0f94a7a7ff3450.zip
registrat - short IP ban implemented
git-svn-id: svn://localhost/project_picapica/trunk@151 fb96df88-216d-11de-830c-f3023f12d8ac
Diffstat (limited to 'pica-registrar')
-rw-r--r--pica-registrar/PICA_registrar.cpp49
1 files changed, 48 insertions, 1 deletions
diff --git a/pica-registrar/PICA_registrar.cpp b/pica-registrar/PICA_registrar.cpp
index aea4e90..03c41c9 100644
--- a/pica-registrar/PICA_registrar.cpp
+++ b/pica-registrar/PICA_registrar.cpp
@@ -10,7 +10,7 @@
#include <unistd.h>
#include <sys/errno.h>
#include <sys/stat.h>
-
+#include <time.h>
#include <cstring>
#include <cstdlib>
@@ -24,10 +24,20 @@ using namespace std;
#define READ_BUF_SIZE 4096
#define WRITE_BUF_SIZE 8192
+#define BAN_THRESHOLD_SECS 60
+
char read_buf[READ_BUF_SIZE];
char write_buf[WRITE_BUF_SIZE];
+struct ban_info
+{
+ unsigned int reg_count;
+ time_t last_reg;
+};
+
+static std::map<in_addr_t, struct ban_info> banmap;
+
unsigned int current_id = 30000;
@@ -135,6 +145,35 @@ if (bs < cert_size)
return 0;
}
+//check if we should ban this IP
+int IP_ban(struct sockaddr_in *a)
+{
+ time_t time_now =time(NULL);
+
+ if (banmap[a->sin_addr.s_addr].reg_count >=3 && (time_now - banmap[a->sin_addr.s_addr].last_reg ) < BAN_THRESHOLD_SECS)
+ {
+ banmap[a->sin_addr.s_addr].reg_count++;
+ printf("IP %.16s temporarily banned\n", inet_ntoa(a->sin_addr));
+ return 1;
+ }
+
+return 0;
+}
+
+//add successfully registered client to ban info
+void baninfo_update(struct sockaddr_in *a)
+{
+ time_t time_now =time(NULL);
+
+ if ((time_now - banmap[a->sin_addr.s_addr].last_reg ) > BAN_THRESHOLD_SECS)
+ banmap[a->sin_addr.s_addr].reg_count = 0;
+
+
+ banmap[a->sin_addr.s_addr].reg_count++;
+
+ banmap[a->sin_addr.s_addr].last_reg = time_now;
+}
+
int main(int argc, char *argv[])
{
int s, client_socket, ret, pos, disconnect_flag, bytes_read, cert_size;
@@ -163,6 +202,12 @@ while (1)
if (client_socket >= 0)
{
+
+ if (IP_ban(&sc))
+ {
+ close(client_socket);
+ continue;
+ }
disconnect_flag = read_CSR(client_socket, &bytes_read);
@@ -202,6 +247,8 @@ while (1)
current_id++;
+ baninfo_update(&sc);
+
freeres_1:
remove(cert_filename.c_str());