summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Borisov <b0ric.alex@gmail.com>2012-03-24 00:29:12 +0200
committerAlex Borisov <b0ric.alex@gmail.com>2012-03-24 00:29:12 +0200
commitb606632400d491b864eeb36464eb9fab63136ac8 (patch)
tree9db3a581073d7bae82c6b87ce40d47c8aee4af89
parentdb10b50c84a4aaf5014e0f164b3f4f79ca222429 (diff)
parent8b0b635491dd318baab5d93575eed9cda2b3c9fd (diff)
Merge branch 'master' of ssh://sss.chaoslab.ru/home/private_git/proxy_ui
-rwxr-xr-xserver/server/config.cpp120
-rwxr-xr-xserver/server/config.h52
-rwxr-xr-xserver/server/main.cpp437
-rw-r--r--server/server/main.h20
-rw-r--r--server/server/speedtest.cpp28
5 files changed, 364 insertions, 293 deletions
diff --git a/server/server/config.cpp b/server/server/config.cpp
index 4d9f960..6d945d3 100755
--- a/server/server/config.cpp
+++ b/server/server/config.cpp
@@ -1,5 +1,7 @@
#include "headers.h"
+extern logtofile *logger;
+
void reload_config_thread_func(config *cfg, boost::mutex *m)
{
while(!boost::this_thread::interruption_requested())
@@ -7,30 +9,38 @@ void reload_config_thread_func(config *cfg, boost::mutex *m)
boost::this_thread::sleep(boost::posix_time::seconds(cfg->config_reload_interval()));
if(boost::this_thread::interruption_requested())
return;
+ m->lock();
cfg->load_vars();
cfg->load_cvars();
- m->lock();
cfg->load_proxy_list();
cfg->load_static_proxy_list();
- m->unlock();
cfg->load_firewall_list();
cfg->load_deleted_list();
cfg->load_upload_list();
cfg->load_servers_list();
+ m->unlock();
}
}
-void speed_test_thread_func(int check_interval, std::list<config::proxy_entry>* proxy_list, std::list<config::static_proxy_entry> *static_proxy_list, const std::string& test_url, boost::mutex *m)
+void speed_test_thread_func(config *cfg, int check_interval, std::list<config::proxy_entry>* proxy_list, std::list<config::static_proxy_entry> *static_proxy_list, const std::string& test_url, boost::mutex *m)
{
while(!boost::this_thread::interruption_requested())
{
m->lock();
-// logtofile *l = new logtofile(std::string(boost::filesystem::initial_path().string() + "/proxy_test_info").c_str());
for(std::list<config::static_proxy_entry>::iterator i = static_proxy_list->begin(), end = static_proxy_list->end(); i != end; ++i)
{
speedtest t(test_url);
- //*l<<i->host<<" "<<(int)t.test(&(*i))<<"\n";
- t.test(&(*i));
+ int sp = (int)t.test(&(*i));
+ if(cfg->log_speed())
+ {
+ char port[10];
+ snprintf(port, 9, "%d", i->port);
+ while(!logger)
+ boost::this_thread::sleep(boost::posix_time::milliseconds(200));
+ logger->lock();
+ *logger << time_str() << ": "<<i->host<<":"<<port<<"\tspeed: "<<sp<<"b/s\n";
+ logger->unlock();
+ }
boost::this_thread::sleep(boost::posix_time::seconds(1));
}
/* for(std::list<config::proxy_entry>::iterator i = proxy_list->begin(), end = proxy_list->end(); i != end; ++i)
@@ -61,6 +71,7 @@ void config::load_vars()
vars.conn_time = get_int(cfg_str, "ConnectionTimeOut=", 60);
vars.dos_conn_count = get_int(cfg_str, "DosConnectionCount=", 100);
vars.debug = get_int(cfg_str, "Debug=", 0);
+ vars.log_speed = get_int(cfg_str, "LogSpeed=", 0);
vars.bind_ip = get_string(cfg_str, "BindAddress=", "0.0.0.0");
vars.log_path = get_string(cfg_str, "LogPath=", "");
vars.dos_log_path = get_string(cfg_str, "DosLogPath=", "");
@@ -75,17 +86,24 @@ void config::load_cvars()
{
std::ifstream config;
config.open(cli_config_path.c_str(), std::fstream::in);
- if(config.is_open())
+ if(!config.is_open())
+ return;
+ if(!cvars.empty())
+ cvars.clear();
+ std::string cfg_str((std::istreambuf_iterator<char>(config)), std::istreambuf_iterator<char>());
+ config.close();
+ if(!cfg_str.empty())
{
- std::string cfg_str((std::istreambuf_iterator<char>(config)), std::istreambuf_iterator<char>());
- config.close();
- cvars.config_update_interval = get_int(cfg_str, "config_update_interval=", 300);
- cvars.client_update_interval = get_int(cfg_str, "client_update_interval=", 60000);
- cvars.welcome_msg = get_string(cfg_str, "welcome_msg=", "");
- cvars.cfg_downloaded_msg = get_string(cfg_str, "config_downloaded_msg=", "");
- cvars.top_text = get_string(cfg_str, "top_panel_text=", "");
- cvars.bottom_text = get_string(cfg_str, "bottom_panel_text=", "");
- cvars.speed_visibility = get_int(cfg_str, "speed_visibility=", 1);
+ std::string::size_type p1 = 0, p2 = 0, l = 1;
+ if(cfg_str.find("\r\n") != std::string::npos)
+ l = 2;
+ p2 = cfg_str.find(';');
+ while(p2 != std::string::npos)
+ {
+ cvars.push_back(cfg_str.substr(p1, p2-p1));
+ p1 = p2+l+1;
+ p2 = cfg_str.find(';', p1);
+ }
}
}
@@ -113,7 +131,7 @@ config::config(const char *pth): cfg_reload_thr(NULL), speed_test_thr(NULL)
load_upload_list();
load_servers_list();
cfg_reload_thr = new boost::thread(boost::bind(reload_config_thread_func, this, &lists_mutex));
- speed_test_thr = new boost::thread(boost::bind(speed_test_thread_func, vars.proxy_check_interval, &proxy_list, &static_proxy_list, vars.speed_test_file_url, &lists_mutex));
+ speed_test_thr = new boost::thread(boost::bind(speed_test_thread_func, this, vars.proxy_check_interval, &proxy_list, &static_proxy_list, vars.speed_test_file_url, &lists_mutex));
}
const int config::get_int(const std::string& data, const char* var, int default_)
{
@@ -155,12 +173,14 @@ void config::load_servers_list(char* pth)
}
else
config.open(pth, std::fstream::in);
+ if(!config.is_open())
+ return;
+ if(!servers_list.empty())
+ servers_list.clear();
std::string cfg_str((std::istreambuf_iterator<char>(config)), std::istreambuf_iterator<char>());
config.close();
if(!cfg_str.empty())
{
- if(!servers_list.empty())
- servers_list.clear();
std::string::size_type p1 = 0, p2 = 0, l = 1;
if(cfg_str.find("\r\n") != std::string::npos)
l = 2;
@@ -196,12 +216,14 @@ void config::load_upload_list(char *pth)
}
else
config.open(pth, std::fstream::in);
+ if(!config.is_open())
+ return;
+ if(!upload_list.empty())
+ upload_list.clear();
std::string cfg_str((std::istreambuf_iterator<char>(config)), std::istreambuf_iterator<char>());
config.close();
if(!cfg_str.empty())
{
- if(!upload_list.empty())
- upload_list.clear();
std::string::size_type p1 = 0, p2 = 0, l = 1;
if(cfg_str.find("\r\n") != std::string::npos)
l = 2;
@@ -258,12 +280,14 @@ void config::load_proxy_list(char *pth)
}
else
config.open(pth, std::fstream::in);
+ if(!config.is_open())
+ return;
+ if(!proxy_list.empty())
+ proxy_list.clear();
std::string cfg_str((std::istreambuf_iterator<char>(config)), std::istreambuf_iterator<char>());
config.close();
if(!cfg_str.empty())
{
- if(!proxy_list.empty())
- proxy_list.clear();
std::string::size_type p1 = 0, p2 = 0, l = 1;
if(cfg_str.rfind("\r\n") != std::string::npos)
l = 2;
@@ -343,12 +367,14 @@ void config::load_static_proxy_list(char *pth)
}
else
config.open(pth, std::fstream::in);
+ if(!config.is_open())
+ return;
+ if(!static_proxy_list.empty())
+ static_proxy_list.clear();
std::string cfg_str((std::istreambuf_iterator<char>(config)), std::istreambuf_iterator<char>());
config.close();
if(!cfg_str.empty())
{
- if(!static_proxy_list.empty())
- static_proxy_list.clear();
std::string::size_type p1 = 0, p2 = 0, l = 1;
if(cfg_str.rfind("\r\n") != std::string::npos)
l = 2;
@@ -422,12 +448,14 @@ void config::load_firewall_list(char* pth)
}
else
config.open(pth, std::fstream::in);
+ if(!config.is_open())
+ return;
+ if(!firewall_list.empty())
+ firewall_list.clear();
std::string cfg_str((std::istreambuf_iterator<char>(config)), std::istreambuf_iterator<char>());
config.close();
if(!cfg_str.empty())
{
- if(!firewall_list.empty())
- firewall_list.clear();
std::string::size_type p1 = 0, p2 = 0, l = 1;
// if(cfg_str.find("\r\n") != std::string::npos)
// l = 2;
@@ -455,12 +483,14 @@ void config::load_deleted_list(char* pth)
}
else
config.open(pth, std::fstream::in);
+ if(!config.is_open())
+ return;
+ if(!deleted_list.empty())
+ deleted_list.clear();
std::string cfg_str((std::istreambuf_iterator<char>(config)), std::istreambuf_iterator<char>());
config.close();
if(!cfg_str.empty())
{
- if(!deleted_list.empty())
- deleted_list.clear();
std::string::size_type p1 = 0, p2 = 0, l = 1;
if(cfg_str.find("\r\n") != std::string::npos)
l = 2;
@@ -539,40 +569,16 @@ bool config::ignore_ssl_errors()
return vars.ignore_ssl_errors;
}
-const int config::c_cfg_upd_int()
+bool config::log_speed()
{
- return cvars.config_update_interval;
+ return vars.log_speed;
}
-const int config::c_cli_upd_int()
+std::list<std::string>* config::cli_cfg()
{
- return cvars.client_update_interval;
+ return &cvars;
}
-bool config::c_speed_visibility()
-{
- return cvars.speed_visibility;
-}
-
-const std::string& config::c_welcome_msg()
-{
- return cvars.welcome_msg;
-}
-
-const std::string& config::c_cfg_download_msg()
-{
- return cvars.cfg_downloaded_msg;
-}
-
-const std::string& config::c_top_text()
-{
- return cvars.top_text;
-}
-
-const std::string& config::c_bottom_text()
-{
- return cvars.bottom_text;
-}
const std::string& config::speed_test_file_url()
{
return vars.speed_test_file_url;
diff --git a/server/server/config.h b/server/server/config.h
index 5f2ea40..4afa63d 100755
--- a/server/server/config.h
+++ b/server/server/config.h
@@ -37,9 +37,7 @@ public:
struct static_proxy_entry : public proxy_entry_base
{
- int port, position;
- size_t speed;
- std::list<size_t> speed_list;
+ int position;
std::string label;
static_proxy_entry(): position(0)
{}
@@ -120,13 +118,7 @@ public:
const int check_interval();
const int debug();
const int dos_conn_count();
- const int c_cfg_upd_int();
- const int c_cli_upd_int();
- bool c_speed_visibility();
- const std::string& c_welcome_msg();
- const std::string& c_cfg_download_msg();
- const std::string& c_top_text();
- const std::string& c_bottom_text();
+ std::list<std::string>* cli_cfg();
void load_vars();
void load_cvars();
void load_proxy_list(char* pth = NULL);
@@ -136,6 +128,7 @@ public:
void load_deleted_list(char* pth = NULL);
void load_servers_list(char* pth = NULL);
bool ignore_ssl_errors();
+ bool log_speed();
const std::string& bind_ip();
const std::string& log_path();
const std::string& proxifier_path();
@@ -147,46 +140,27 @@ public:
std::list<std::string> *get_deleted_list();
std::list<upload_entry> *get_upload_list();
std::list<conn_server> *get_server_list();
+ boost::mutex &get_lists_mutex()
+ {
+ return lists_mutex;
+ }
private:
struct cfg_data
{
- int ban_time, conn_count, check_interval, debug, dos_conn_count, conn_time, config_reload_interval, proxy_check_interval;
- bool ignore_ssl_errors;
+ int ban_time, conn_count, check_interval, dos_conn_count, conn_time, config_reload_interval, proxy_check_interval;
+ bool ignore_ssl_errors, log_speed, debug;
std::string log_path, bind_ip, dos_log_path, speed_test_file_url;
- cfg_data()
- {
- ignore_ssl_errors = false;
- ban_time = conn_time = 60;
- config_reload_interval = 600;
- proxy_check_interval = 3600;
- conn_count = 30;
- check_interval = 30;
- debug = 0;
- dos_conn_count = 200;
- bind_ip = "0.0.0.0";
- speed_test_file_url = "http://localhost/speed.test";
- }
- };
- struct cli_cfg_data
- {
- int config_update_interval, client_update_interval;
- std::string welcome_msg, cfg_downloaded_msg, top_text, bottom_text;
- bool speed_visibility;
- cli_cfg_data()
- {
- config_update_interval = 300;
- client_update_interval = 60000;
- speed_visibility = false;
- }
+ cfg_data(): ban_time(60), check_interval(30), dos_conn_count(200), conn_time(60), config_reload_interval(600), proxy_check_interval(3600),
+ ignore_ssl_errors(false), log_speed(false), debug(false)
+ {}
};
std::string config_path, cli_config_path;
const int get_int(const std::string& data, const char* var, int default_);
const std::string get_string(const std::string& data, const char* var, const std::string& default_);
cfg_data vars;
- cli_cfg_data cvars;
std::list<proxy_entry> proxy_list;
std::list<static_proxy_entry> static_proxy_list;
- std::list<std::string> firewall_list, deleted_list;
+ std::list<std::string> firewall_list, deleted_list, cvars;
std::list<upload_entry> upload_list;
std::list<conn_server> servers_list;
boost::thread *cfg_reload_thr, *speed_test_thr;
diff --git a/server/server/main.cpp b/server/server/main.cpp
index 2fc1b18..38ee904 100755
--- a/server/server/main.cpp
+++ b/server/server/main.cpp
@@ -4,14 +4,11 @@
-logtofile *logger, *dos_logger;
-config *cfg;
-
-
+logtofile *logger = NULL, *dos_logger = NULL;
//session
-session::session(boost::asio::io_service& io_service, boost::asio::ssl::context& context, server *serv) : socket_(io_service, context), io_service_(io_service)
+session::session(boost::asio::io_service& io_service, boost::asio::ssl::context& context, server *serv) : socket_(io_service, context), io_service_(io_service), lists_mutex(serv->get_lists_mutex()), cfg(serv->get_config())
{
this_sid = get_random(8);
server_ = serv;
@@ -44,9 +41,12 @@ session::~session()
killer->interrupt();
delete killer;
}
- logger->lock();
- *logger << time_str() << ": Connection with ip "<< remote_ip << " session " << this_sid << " closed\n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger << time_str() << ": Connection with ip "<< remote_ip << " session " << this_sid << " closed\n";
+ logger->unlock();
+ }
critical_mutex.unlock();
}
@@ -59,9 +59,12 @@ void session::start()
{
remote_ip = socket_.lowest_layer().remote_endpoint().address().to_string();
killer = new boost::thread(boost::bind(session::cancel_thread, this, cfg->conn_time()));
- logger->lock();
- *logger << time_str() << ": New incomming connection from "<< remote_ip << " session " << this_sid << "\n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger << time_str() << ": New incomming connection from "<< remote_ip << " session " << this_sid << "\n";
+ logger->unlock();
+ }
std::list<std::string>* blacklist = server_->get_blacklist();
std::list<conn_count>* list = server_->get_connections_list();
if(!blacklist->empty())
@@ -71,9 +74,12 @@ void session::start()
{
if(*i == remote_ip)
{
- logger->lock();
- *logger << time_str() << ": session " << this_sid << " ip " << remote_ip << " is in blacklist\n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger << time_str() << ": session " << this_sid << " ip " << remote_ip << " is in blacklist\n";
+ logger->unlock();
+ }
blacklisted = true;
break;
}
@@ -172,18 +178,25 @@ void session::proto_parser(std::vector<byte>& data)
delete this;
break;
}
- logger->lock();
- *logger<< time_str() << ": recieved config request from "<<remote_ip << " session " << this_sid <<"\n";
- logger->unlock();
- if(!blacklisted)
+ if(cfg->debug())
{
logger->lock();
- *logger<< time_str() << ": config request from "<<remote_ip<< " session " << this_sid << " are permited \n";
+ *logger<< time_str() << ": recieved config request from "<<remote_ip << " session " << this_sid <<"\n";
logger->unlock();
+ }
+ if(!blacklisted)
+ {
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": config request 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(0x01);
+ lists_mutex.lock();
if(!cfg->get_server_list()->empty())
{
for(std::list<config::conn_server>::iterator i = cfg->get_server_list()->begin(), end = cfg->get_server_list()->end(); i != end; ++i)
@@ -209,87 +222,30 @@ void session::proto_parser(std::vector<byte>& data)
data.push_back('\n');
}
}
- std::string s = "config_update_interval=";
- for(int i = 0; i < s.size(); ++i)
- data.push_back(s[i]);
- char buf[10];
- snprintf(buf, 9, "%d", cfg->c_cfg_upd_int());
- int len = strlen(buf);
- for(int i = 0; i < len; ++i)
- data.push_back(buf[i]);
- data.push_back(';');
- data.push_back('\r');
- data.push_back('\n');
- s = "client_update_interval=";
- for(int i = 0; i < s.size(); ++i)
- data.push_back(s[i]);
- snprintf(buf, 9, "%d", cfg->c_cli_upd_int());
- len = strlen(buf);
- for(int i = 0; i < len; ++i)
- data.push_back(buf[i]);
- data.push_back(';');
- data.push_back('\r');
- data.push_back('\n');
- if(!cfg->c_welcome_msg().empty())
+ if(!cfg->cli_cfg()->empty())
{
- s = "welcome_msg=";
- for(int i = 0; i < s.size(); ++i)
- data.push_back(s[i]);
- for(int i = 0; i < cfg->c_welcome_msg().size(); ++i)
- data.push_back(cfg->c_welcome_msg()[i]);
- data.push_back(';');
- data.push_back('\r');
- data.push_back('\n');
- }
- if(!cfg->c_cfg_download_msg().empty())
- {
- s = "config_downloaded_msg=";
- for(int i = 0; i < s.size(); ++i)
- data.push_back(s[i]);
- for(int i = 0; i < cfg->c_cfg_download_msg().size(); ++i)
- data.push_back(cfg->c_cfg_download_msg()[i]);
- data.push_back(';');
- data.push_back('\r');
- data.push_back('\n');
- }
- if(!cfg->c_top_text().empty())
- {
- s = "top_panel_text=";
- for(int i = 0; i < s.size(); ++i)
- data.push_back(s[i]);
- for(int i = 0; i < cfg->c_top_text().size(); ++i)
- data.push_back(cfg->c_top_text()[i]);
- data.push_back(';');
- data.push_back('\r');
- data.push_back('\n');
- }
- if(!cfg->c_bottom_text().empty())
- {
- s = "bottom_panel_text=";
- for(int i = 0; i < s.size(); ++i)
- data.push_back(s[i]);
- for(int i = 0; i < cfg->c_bottom_text().size(); ++i)
- data.push_back(cfg->c_bottom_text()[i]);
- data.push_back(';');
- data.push_back('\r');
- data.push_back('\n');
+ for(std::list<std::string>::iterator i = cfg->cli_cfg()->begin(), end = cfg->cli_cfg()->end(); i != end; ++i)
+ {
+ for(int ii = 0; ii < i->size(); ++ii)
+ data.push_back((*i)[ii]);
+ data.push_back(';');
+ data.push_back('\r');
+ data.push_back('\n');
+ }
}
- s = "speed_visibility=";
- for(int i = 0; i < s.size(); ++i)
- data.push_back(s[i]);
- data.push_back(cfg->c_speed_visibility()?'1':'0');
- data.push_back(';');
- data.push_back('\r');
- data.push_back('\n');
+ lists_mutex.unlock();
data.push_back(0x14);
data.push_back(0x14);
write_w_response(data);
}
else
{
- logger->lock();
- *logger<< time_str() << ": config request from "<<remote_ip << " session " << this_sid <<" are denied \n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": config request from "<<remote_ip << " session " << this_sid <<" are denied \n";
+ logger->unlock();
+ }
std::vector<byte> data;
data.push_back(0x13);
data.push_back(0x13);
@@ -307,18 +263,25 @@ void session::proto_parser(std::vector<byte>& data)
delete this;
break;
}
- logger->lock();
- *logger<< time_str() << ": recieved proxy list request from "<<remote_ip << " session " << this_sid <<"\n";
- logger->unlock();
- if(!blacklisted)
+ if(cfg->debug())
{
logger->lock();
- *logger<< time_str() << ": proxy list request from "<<remote_ip<< " session " << this_sid << " are permited \n";
+ *logger<< time_str() << ": recieved proxy list request from "<<remote_ip << " session " << this_sid <<"\n";
logger->unlock();
+ }
+ if(!blacklisted)
+ {
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": proxy list request 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);
+ lists_mutex.lock();
for(std::list<config::proxy_entry>::iterator it = cfg->get_proxy_list()->begin(), end = cfg->get_proxy_list()->end(); it != end; ++it)
{
switch(it->type)
@@ -407,15 +370,19 @@ void session::proto_parser(std::vector<byte>& data)
data.push_back('"');
data.push_back(';');
}
+ lists_mutex.unlock();
data.push_back(0x14);
data.push_back(0x14);
write_w_response(data);
}
else
{
- logger->lock();
- *logger<< time_str() << ": proxy list request from "<<remote_ip << " session " << this_sid <<" are denied \n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": proxy list request from "<<remote_ip << " session " << this_sid <<" are denied \n";
+ logger->unlock();
+ }
std::vector<byte> data;
data.push_back(0x13);
data.push_back(0x13);
@@ -433,18 +400,25 @@ void session::proto_parser(std::vector<byte>& data)
delete this;
break;
}
- logger->lock();
- *logger<< time_str() << ": recieved static proxy list request from "<<remote_ip << " session " << this_sid <<"\n";
- logger->unlock();
- if(!blacklisted)
+ if(cfg->debug())
{
logger->lock();
- *logger<< time_str() << ": static proxy list request from "<<remote_ip<< " session " << this_sid << " are permited \n";
+ *logger<< time_str() << ": recieved static proxy list request from "<<remote_ip << " session " << this_sid <<"\n";
logger->unlock();
+ }
+ if(!blacklisted)
+ {
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": static proxy list request 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(0x03);
+ lists_mutex.lock();
for(std::list<config::static_proxy_entry>::iterator it = cfg->get_static_proxy_list()->begin(), end = cfg->get_static_proxy_list()->end(); it != end; ++it)
{
switch(it->type)
@@ -525,15 +499,19 @@ void session::proto_parser(std::vector<byte>& data)
//data.push_back('0'); //add speed here
data.push_back(';');
}
+ lists_mutex.unlock();
data.push_back(0x14);
data.push_back(0x14);
write_w_response(data);
}
else
{
- logger->lock();
- *logger<< time_str() << ": static proxy list request from "<<remote_ip << " session " << this_sid <<" are denied \n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": static proxy list request from "<<remote_ip << " session " << this_sid <<" are denied \n";
+ logger->unlock();
+ }
std::vector<byte> data;
data.push_back(0x13);
data.push_back(0x13);
@@ -551,18 +529,25 @@ void session::proto_parser(std::vector<byte>& data)
delete this;
break;
}
- logger->lock();
- *logger<< time_str() << ": recieved firewall list request from "<<remote_ip << " session " << this_sid <<"\n";
- logger->unlock();
- if(!blacklisted)
+ if(cfg->debug())
{
logger->lock();
- *logger<< time_str() << ": firewall list request from "<<remote_ip<< " session " << this_sid << " are permited \n";
+ *logger<< time_str() << ": recieved firewall list request from "<<remote_ip << " session " << this_sid <<"\n";
logger->unlock();
+ }
+ if(!blacklisted)
+ {
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": firewall list request 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(0x04);
+ lists_mutex.lock();
for(std::list<std::string>::iterator it = cfg->get_firewall_list()->begin(), end = cfg->get_firewall_list()->end(); it != end; ++it)
{
if(!(it->empty()))
@@ -570,15 +555,19 @@ void session::proto_parser(std::vector<byte>& data)
data.push_back((*it)[i]);
data.push_back(';');
}
+ lists_mutex.unlock();
data.push_back(0x14);
data.push_back(0x14);
write_w_response(data);
}
else
{
- logger->lock();
- *logger<< time_str() << ": firewall list request from "<<remote_ip << " session " << this_sid <<" are denied \n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": firewall list request from "<<remote_ip << " session " << this_sid <<" are denied \n";
+ logger->unlock();
+ }
std::vector<byte> data;
data.push_back(0x13);
data.push_back(0x13);
@@ -596,18 +585,25 @@ void session::proto_parser(std::vector<byte>& data)
delete this;
break;
}
- logger->lock();
- *logger<< time_str() << ": recieved existing files request from "<<remote_ip << " session " << this_sid <<"\n";
- logger->unlock();
- if(!blacklisted)
+ if(cfg->debug())
{
logger->lock();
- *logger<< time_str() << ": existing files request from "<<remote_ip<< " session " << this_sid << " are permited \n";
+ *logger<< time_str() << ": recieved existing files request from "<<remote_ip << " session " << this_sid <<"\n";
logger->unlock();
+ }
+ if(!blacklisted)
+ {
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": existing files request 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(0x05);
+ lists_mutex.lock();
for(std::list<config::upload_entry>::iterator it = cfg->get_upload_list()->begin(), end = cfg->get_upload_list()->end(); it != end; ++it)
{
/*if(!(it->source.empty()))
@@ -627,15 +623,19 @@ void session::proto_parser(std::vector<byte>& data)
data.push_back('0');
data.push_back(';');
}
+ lists_mutex.unlock();
data.push_back(0x14);
data.push_back(0x14);
write_w_response(data);
}
else
{
- logger->lock();
- *logger<< time_str() << ": existing files request from "<<remote_ip << " session " << this_sid <<" are denied \n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": existing files request from "<<remote_ip << " session " << this_sid <<" are denied \n";
+ logger->unlock();
+ }
std::vector<byte> data;
data.push_back(0x13);
data.push_back(0x13);
@@ -653,18 +653,25 @@ void session::proto_parser(std::vector<byte>& data)
delete this;
break;
}
- logger->lock();
- *logger<< time_str() << ": recieved files to del request from "<<remote_ip << " session " << this_sid <<"\n";
- logger->unlock();
- if(!blacklisted)
+ if(cfg->debug())
{
logger->lock();
- *logger<< time_str() << ": files to del request from "<<remote_ip<< " session " << this_sid << " are permited \n";
+ *logger<< time_str() << ": recieved files to del request from "<<remote_ip << " session " << this_sid <<"\n";
logger->unlock();
+ }
+ if(!blacklisted)
+ {
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": files to del request 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(0x06);
+ lists_mutex.lock();
for(std::list<std::string>::iterator it = cfg->get_deleted_list()->begin(), end = cfg->get_deleted_list()->end(); it != end; ++it)
{
if(!(it->empty()))
@@ -672,15 +679,19 @@ void session::proto_parser(std::vector<byte>& data)
data.push_back((*it)[i]);
data.push_back(';');
}
+ lists_mutex.unlock();
data.push_back(0x14);
data.push_back(0x14);
write_w_response(data);
}
else
{
- logger->lock();
- *logger<< time_str() << ": files to del request from "<<remote_ip << " session " << this_sid <<" are denied \n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": files to del request from "<<remote_ip << " session " << this_sid <<" are denied \n";
+ logger->unlock();
+ }
std::vector<byte> data;
data.push_back(0x13);
data.push_back(0x13);
@@ -698,14 +709,20 @@ void session::proto_parser(std::vector<byte>& data)
delete this;
break;
}
- logger->lock();
- *logger<< time_str() << ": recieved client version request from "<<remote_ip << " session " << this_sid <<"\n";
- logger->unlock();
- if(!blacklisted)
+ if(cfg->debug())
{
logger->lock();
- *logger<< time_str() << ": client version request from "<<remote_ip<< " session " << this_sid << " are permited \n";
+ *logger<< time_str() << ": recieved client version request from "<<remote_ip << " session " << this_sid <<"\n";
logger->unlock();
+ }
+ if(!blacklisted)
+ {
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": client version request from "<<remote_ip<< " session " << this_sid << " are permited \n";
+ logger->unlock();
+ }
std::vector<byte> data;
data.push_back(0x13);
data.push_back(0x13);
@@ -717,9 +734,12 @@ void session::proto_parser(std::vector<byte>& data)
}
else
{
- logger->lock();
- *logger<< time_str() << ": client version from "<<remote_ip << " session " << this_sid <<" are denied \n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": client version from "<<remote_ip << " session " << this_sid <<" are denied \n";
+ logger->unlock();
+ }
std::vector<byte> data;
data.push_back(0x13);
data.push_back(0x13);
@@ -737,14 +757,20 @@ void session::proto_parser(std::vector<byte>& data)
delete this;
break;
}
- logger->lock();
- *logger<< time_str() << ": recieved client binary request from "<<remote_ip << " session " << this_sid <<"\n";
- logger->unlock();
- if(!blacklisted)
+ if(cfg->debug())
{
logger->lock();
- *logger<< time_str() << ": client binary request from "<<remote_ip<< " session " << this_sid << " are permited \n";
+ *logger<< time_str() << ": recieved client binary request from "<<remote_ip << " session " << this_sid <<"\n";
logger->unlock();
+ }
+ if(!blacklisted)
+ {
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": client binary request from "<<remote_ip<< " session " << this_sid << " are permited \n";
+ logger->unlock();
+ }
std::ifstream file;
std::string source = boost::filesystem::initial_path().string();
source += "/client.exe";
@@ -773,9 +799,12 @@ void session::proto_parser(std::vector<byte>& data)
}
else
{
- logger->lock();
- *logger<< time_str() << ": failed to open file "<<source<<" , request from "<<remote_ip<< " session " << this_sid << "\n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": failed to open file "<<source<<" , request from "<<remote_ip<< " session " << this_sid << "\n";
+ logger->unlock();
+ }
break;
}
@@ -789,9 +818,12 @@ void session::proto_parser(std::vector<byte>& data)
}
else
{
- logger->lock();
- *logger<< time_str() << ": client binary request from "<<remote_ip << " session " << this_sid <<" are denied \n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": client binary request from "<<remote_ip << " session " << this_sid <<" are denied \n";
+ logger->unlock();
+ }
std::vector<byte> data;
data.push_back(0x13);
data.push_back(0x13);
@@ -809,14 +841,20 @@ void session::proto_parser(std::vector<byte>& data)
delete this;
break;
}
- logger->lock();
- *logger<< time_str() << ": recieved file upload request from "<<remote_ip << " session " << this_sid <<"\n";
- logger->unlock();
- if(!blacklisted)
+ if(cfg->debug())
{
logger->lock();
- *logger<< time_str() << ": file upload request from "<<remote_ip<< " session " << this_sid << " are permited \n";
+ *logger<< time_str() << ": recieved file upload request from "<<remote_ip << " session " << this_sid <<"\n";
logger->unlock();
+ }
+ if(!blacklisted)
+ {
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": file upload request from "<<remote_ip<< " session " << this_sid << " are permited \n";
+ logger->unlock();
+ }
it++;
std::string filename;
for(;;++it)
@@ -832,9 +870,12 @@ void session::proto_parser(std::vector<byte>& data)
std::list<config::upload_entry>::iterator uit = std::find(cfg->get_upload_list()->begin(), cfg->get_upload_list()->end(), config::s_i(filename, 1));
if(uit == cfg->get_upload_list()->end())
{
- logger->lock();
- *logger<< time_str() << ": file "<<filename << " not found in server upload_list, request from"<< remote_ip << " session " << this_sid <<"\n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": file "<<filename << " not found in server upload_list, request from"<< remote_ip << " session " << this_sid <<"\n";
+ logger->unlock();
+ }
break;
}
std::ifstream file;
@@ -863,9 +904,12 @@ void session::proto_parser(std::vector<byte>& data)
}
else
{
- logger->lock();
- *logger<< time_str() << ": failed to open file "<<uit->source<<" , request from "<<remote_ip<< " session " << this_sid << "\n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": failed to open file "<<uit->source<<" , request from "<<remote_ip<< " session " << this_sid << "\n";
+ logger->unlock();
+ }
break;
}
@@ -879,9 +923,12 @@ void session::proto_parser(std::vector<byte>& data)
}
else
{
- logger->lock();
- *logger<< time_str() << ": file upload request from "<<remote_ip << " session " << this_sid <<" are denied \n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger<< time_str() << ": file upload request from "<<remote_ip << " session " << this_sid <<" are denied \n";
+ logger->unlock();
+ }
std::vector<byte> data;
data.push_back(0x13);
data.push_back(0x13);
@@ -896,7 +943,6 @@ void session::proto_parser(std::vector<byte>& data)
break;
}
}
- //ok, our data found
}
}
}
@@ -985,14 +1031,18 @@ void session::handle_read(const boost::system::error_code& error, size_t bytes_t
}
catch (std::exception& e)
{
- logger->lock();
- *logger << time_str() << ": read handler exception: " << e.what() << "\n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger << time_str() << ": read handler exception: " << e.what() << "\n";
+ logger->unlock();
+ }
}
}
//server
-server::server(boost::asio::io_service& io_service, unsigned short port) : io_service_(io_service), acceptor_(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::address_v4::from_string(cfg->bind_ip()), port)), context_(io_service, boost::asio::ssl::context::sslv3_server)
+server::server(boost::asio::io_service& io_service, unsigned short port, config *c) : io_service_(io_service), acceptor_(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::address_v4::from_string(c->bind_ip()), port)),
+context_(io_service, boost::asio::ssl::context::sslv3_server), lists_mutex(c->get_lists_mutex()), cfg(c)
{
boost::system::error_code err;
std::string b_path = boost::filesystem::initial_path().string(), tmp_path;
@@ -1001,22 +1051,31 @@ server::server(boost::asio::io_service& io_service, unsigned short port) : io_se
tmp_path = b_path;
tmp_path.append("/ca.crt");
context_.load_verify_file(tmp_path, err);
- logger->lock();
- *logger << time_str()<<": Openning verify cert: " << tmp_path << " " << err.message()<<"\n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger << time_str()<<": Openning verify cert: " << tmp_path << " " << err.message()<<"\n";
+ logger->unlock();
+ }
tmp_path = b_path;
tmp_path.append("/server.crt");
context_.use_certificate_file(tmp_path, boost::asio::ssl::context::pem, err);
- logger->lock();
- *logger << time_str()<<": Openning server cert file: " << tmp_path << " " << err.message()<<"\n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger << time_str()<<": Openning server cert file: " << tmp_path << " " << err.message()<<"\n";
+ logger->unlock();
+ }
tmp_path.replace(tmp_path.length() - 3, 3, "key");
context_.use_private_key_file(tmp_path, boost::asio::ssl::context::pem, err);
- logger->lock();
- *logger << time_str()<<": Openning server key file: " << tmp_path << " " << err.message()<<"\n";
- logger->unlock();
- flood_chek = new boost::thread(boost::bind(flood_check_thread, &conns, &blacklist));
- blacklist_clean = new boost::thread(boost::bind(blacklist_clean_thread, &blacklist));
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger << time_str()<<": Openning server key file: " << tmp_path << " " << err.message()<<"\n";
+ logger->unlock();
+ }
+ flood_chek = new boost::thread(boost::bind(flood_check_thread, &conns, &blacklist, cfg));
+ blacklist_clean = new boost::thread(boost::bind(blacklist_clean_thread, &blacklist, cfg));
session* new_session = new session(io_service_, context_, this);
acceptor_.async_accept(new_session->socket(),
@@ -1057,7 +1116,7 @@ void server::connections_increment(std::string ip, const std::string& l_sid)
}
}
}
-void server::flood_check_thread(std::list<conn_count> *list, std::list<std::string> *blacklist) //sort and clean blacklist ?
+void server::flood_check_thread(std::list<conn_count> *list, std::list<std::string> *blacklist, config *cfg) //sort and clean blacklist ?
{
if(cfg->debug())
{
@@ -1112,7 +1171,7 @@ void server::flood_check_thread(std::list<conn_count> *list, std::list<std::stri
}
}
}
-void server::blacklist_clean_thread(std::list<std::string> *list)
+void server::blacklist_clean_thread(std::list<std::string> *list, config *cfg)
{
if(cfg->debug())
{
@@ -1210,6 +1269,7 @@ int main(int argc, char* argv[])
std::cout<<"succesfully started\n";
#endif
+ config *cfg = NULL;
if (!cfg_path.empty())
cfg = new config(cfg_path.c_str());
else
@@ -1233,15 +1293,18 @@ int main(int argc, char* argv[])
boost::asio::io_service io_service;
- server s(io_service, 13666);
+ server s(io_service, 13666, cfg);
io_service.run();
}
catch (std::exception& e)
{
- logger->lock();
- *logger << time_str() << ": main thread exception: " << e.what() << " (this is bad)\n";
- logger->unlock();
+ if(cfg->debug())
+ {
+ logger->lock();
+ *logger << time_str() << ": main thread exception: " << e.what() << " (this is bad)\n";
+ logger->unlock();
+ }
}
boost::this_thread::sleep(boost::posix_time::seconds(2));
}
diff --git a/server/server/main.h b/server/server/main.h
index 1ee3aca..0ebd349 100644
--- a/server/server/main.h
+++ b/server/server/main.h
@@ -15,6 +15,7 @@ const byte data_end [] = {0x14, 0x14};
class session;
class server;
+class config;
class session
{
@@ -58,7 +59,8 @@ private:
server *server_;
bool blacklisted, canceled;
boost::thread *killer;
- boost::mutex critical_mutex;
+ boost::mutex critical_mutex, &lists_mutex;
+ config *cfg;
};
struct conn_count
{
@@ -89,15 +91,23 @@ struct conn_count
class server
{
public:
- server(boost::asio::io_service& io_service, unsigned short port);
+ server(boost::asio::io_service& io_service, unsigned short port, config *cfg);
~server();
std::string get_password() const;
void handle_accept(session* new_session, const boost::system::error_code& error);
void connections_increment(std::string ip, const std::string& l_sid);
- static void flood_check_thread(std::list<conn_count> *list, std::list<std::string> *blacklist);
- static void blacklist_clean_thread(std::list<std::string> *list);
+ static void flood_check_thread(std::list<conn_count> *list, std::list<std::string> *blacklist, config *cfg);
+ static void blacklist_clean_thread(std::list<std::string> *list, config *cfg);
std::list<std::string>* get_blacklist();
std::list<conn_count>* get_connections_list();
+ boost::mutex &get_lists_mutex()
+ {
+ return lists_mutex;
+ }
+ config *get_config()
+ {
+ return cfg;
+ }
private:
boost::asio::io_service& io_service_;
boost::asio::ip::tcp::acceptor acceptor_;
@@ -105,6 +115,8 @@ private:
std::list<conn_count> conns;
std::list<std::string> blacklist;
boost::thread *flood_chek, *blacklist_clean;
+ boost::mutex &lists_mutex;
+ config *cfg;
};
#endif
diff --git a/server/server/speedtest.cpp b/server/server/speedtest.cpp
index 21fe21c..8303afc 100644
--- a/server/server/speedtest.cpp
+++ b/server/server/speedtest.cpp
@@ -40,10 +40,10 @@ size_t speedtest::test(config::proxy_entry_base *p)
curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_TRY); //maybe required for https proxy ?
break;
case config::SOCKS4:
- type = CURLPROXY_SOCKS4;
+ type = CURLPROXY_SOCKS4A;
break;
case config::SOCKS5:
- type = CURLPROXY_SOCKS5;
+ type = CURLPROXY_SOCKS5_HOSTNAME;
break;
}
curl_easy_setopt(curl, CURLOPT_PROXYTYPE, type);
@@ -51,12 +51,28 @@ size_t speedtest::test(config::proxy_entry_base *p)
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&chunk);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-speedtest/0.1");
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10);
+ //curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1); //require latest curl (.25)
- time_t start = time(0);
+ boost::posix_time::ptime _t = boost::posix_time::second_clock::local_time();
- CURLcode error = curl_easy_perform(curl);
+ CURLcode error = CURL_LAST;
+ for(int i = 0; error && (i < 3); i++)
+ {
+ if(i > 1)
+ {
+ if(type == CURLPROXY_SOCKS5_HOSTNAME)
+ curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
+ if(type == CURLPROXY_SOCKS4A)
+ curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4A);
+ }
+ error = curl_easy_perform(curl);
+ }
+
+ boost::posix_time::ptime _t2 = boost::posix_time::second_clock::local_time();
+
+ boost::posix_time::time_duration td = _t2 - _t;
- double t = time(0) - start;
+ double t = td.total_milliseconds();
curl_easy_cleanup(curl);
@@ -67,7 +83,7 @@ size_t speedtest::test(config::proxy_entry_base *p)
if(chunk.size)
{
if(t)
- speed = (double)chunk.size/t;
+ speed = (double)(chunk.size*1000)/t;
else
speed = chunk.size;
}