diff options
author | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2011-11-06 22:48:26 +0200 |
---|---|---|
committer | Gluzskiy Alexandr <sss@sss.chaoslab.ru> | 2011-11-06 22:48:26 +0200 |
commit | b95963f3fb9a3da39312898d836d71481e917d51 (patch) | |
tree | 2f6d7b41aad4d3371879c0d2fcf4626559e37861 | |
parent | f95edb6b7eaf3148f72fc9b69e3974f58ebcae70 (diff) |
modified: server/server/config.cpp
modified: server/server/config.h
modified: server/server/main.cpp
-rw-r--r-- | server/server/config.cpp | 9 | ||||
-rw-r--r-- | server/server/config.h | 2 | ||||
-rw-r--r-- | server/server/main.cpp | 83 |
3 files changed, 93 insertions, 1 deletions
diff --git a/server/server/config.cpp b/server/server/config.cpp index 7c85daf..3ee15a8 100644 --- a/server/server/config.cpp +++ b/server/server/config.cpp @@ -216,3 +216,12 @@ const std::string& config::dos_log_path() { return vars.dos_log_path; } +std::list<proxy_entry> *config::get_proxy_list() +{ + return &proxy_list; +} +std::list<static_proxy_entry> *config::get_static_proxy_list() +{ + return &static_proxy_list; +} + diff --git a/server/server/config.h b/server/server/config.h index 8886239..62a75af 100644 --- a/server/server/config.h +++ b/server/server/config.h @@ -52,6 +52,8 @@ public: const std::string& bind_ip(); const std::string& log_path(); const std::string& dos_log_path(); + std::list<proxy_entry> *get_proxy_list(); + std::list<static_proxy_entry> *get_static_proxy_list(); private: struct cfg_data { diff --git a/server/server/main.cpp b/server/server/main.cpp index a85efd6..2c171ce 100644 --- a/server/server/main.cpp +++ b/server/server/main.cpp @@ -154,7 +154,7 @@ void session::proto_parser(std::vector<byte>& data) ++it; switch(*it) { - case 0x01: //request type 1 + case 0x01: //config request { if(canceled) { @@ -193,6 +193,87 @@ void session::proto_parser(std::vector<byte>& data) } } break; + case 0x02: //proxy list request + { + if(canceled) + { + delete this; + break; + } + logger->lock(); + *logger<< time_str() << ": recieved request type 1 "<<remote_ip << " session " << this_sid <<"\n"; + logger->unlock(); + if(!blacklisted) + { + logger->lock(); + *logger<< time_str() << ": request type 1 from "<<remote_ip<< " session " << this_sid << " are permited \n"; + logger->unlock(); + std::vector<byte> data; + data.push_back(0x13); + data.push_back(0x13); + data.push_back(0x02); + for(std::list<proxy_entry>::iterator it = cfg->get_proxy_list()->begin(), end = cfg->get_proxy_list()->end(); it != end; ++it) + { + if(!it->login.empty() && !it->password.empty()) + { + for(int i = 0; i < it->login.size(); ++ i) + data.push_back(it->login[i]); + data.push_back(':'); + for(int i = 0; i < it->password.size(); ++ i) + data.push_back(it->password[i]); + data.push_back('@'); + } + for(int i = 0; i < it->host.size(); ++ i) + data.push_back(it->host[i]); + data.push_back(':'); + { + char port[8]; + int len = strlen(port); + snprintf(port, 8, "%d", it->port); + for(int i = 0; i < len; ++i) + data.push_back(port[i]); + } + data.push_back(' '); + data.push_back('"'); + for(int i = 0; i < it->country.size(); ++ i) + data.push_back(it->country[i]); + data.push_back('"'); + data.push_back(' '); + data.push_back('"'); + if(!it->state.empty()) + { + for(int i = 0; i < it->state.size(); ++ i) + data.push_back(it->state[i]); + } + else + data.push_back('-'); + data.push_back('"'); + data.push_back(' '); + data.push_back('"'); + for(int i = 0; i < it->city.size(); ++ i) + data.push_back(it->city[i]); + data.push_back('"'); + data.push_back(';'); + } + data.push_back(0x14); + data.push_back(0x14); + write_w_close(data); + } + else + { + logger->lock(); + *logger<< time_str() << ": request type 1 from "<<remote_ip << " session " << this_sid <<" are denied \n"; + logger->unlock(); + std::vector<byte> data; + data.push_back(0x13); + data.push_back(0x13); + data.push_back(0x66); + data.push_back(0x14); + data.push_back(0x14); + write_w_close(data); + } + } + break; default: break; } |