summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorGluzskiy Alexandr <sss@sss.chaoslab.ru>2011-11-06 22:48:26 +0200
committerGluzskiy Alexandr <sss@sss.chaoslab.ru>2011-11-06 22:48:26 +0200
commitb95963f3fb9a3da39312898d836d71481e917d51 (patch)
tree2f6d7b41aad4d3371879c0d2fcf4626559e37861 /server
parentf95edb6b7eaf3148f72fc9b69e3974f58ebcae70 (diff)
modified: server/server/config.cpp
modified: server/server/config.h modified: server/server/main.cpp
Diffstat (limited to 'server')
-rw-r--r--server/server/config.cpp9
-rw-r--r--server/server/config.h2
-rw-r--r--server/server/main.cpp83
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;
}