diff options
| author | me_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac> | 2012-07-24 22:56:51 +0000 |
|---|---|---|
| committer | me_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac> | 2012-07-24 22:56:51 +0000 |
| commit | 9d70c13411d4544f346dd3462c0f94a7a7ff3450 (patch) | |
| tree | 5ba220ab4a74f66643d18cc04778c85f413e1aab /pica-registrar | |
| parent | c7323aafac1769cb809da3f1d7ddd05383ace641 (diff) | |
| download | pica-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.cpp | 49 |
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()); |
