diff options
author | Alex Borisov <borisov.alexandr@rambler.ru> | 2011-10-23 04:12:00 +0300 |
---|---|---|
committer | Alex Borisov <borisov.alexandr@rambler.ru> | 2011-10-23 04:12:00 +0300 |
commit | 1f9964403d3cb448b7e866d8adcb5560f9c46c33 (patch) | |
tree | 1a7e7095e18c907c0c4964a9c677794903197ef1 /server | |
parent | 21ad7eac963bc329395fa893300fb5c8f721fd77 (diff) | |
parent | 6bd0f7454e62bc27ec8390610cdacb3962e1e658 (diff) |
Merge branch 'master' of ssh://sss.chaoslab.ru//home/private_git/proxy_ui
Diffstat (limited to 'server')
-rw-r--r-- | server/server/config_example | 17 | ||||
-rw-r--r-- | server/server/main.cpp | 139 | ||||
-rw-r--r-- | server/server/main.h | 26 |
3 files changed, 56 insertions, 126 deletions
diff --git a/server/server/config_example b/server/server/config_example deleted file mode 100644 index 712ef6b..0000000 --- a/server/server/config_example +++ /dev/null @@ -1,17 +0,0 @@ -BanTime=60; //minutes -ConnListCheckInterval=30; //seconds -ConnectionCount=30; //conection limit for ban -ConnectionTimeOut=60; //conection limit for ban -DosConnectionCount=200; //conections before adding to dos list -MainAccountInvalidLoginCount=10; //invalid logins to ban -SubAccountInvalidLoginCount=3; //subaccount invalid logins to disconnect -LSServerPort=80; //port for ls server http connection -LSServerHost=chat1.aionlegend.ru; //ls server host -BindAddress=0.0.0.0; //ip address to listen on, 0.0.0.0 - any -LogPath=/var/aion_otp; //auth system log file path, use /dev/null for disable -DosLogPath=/var/log/aion_otp_dos; // log path for dos ip list -Debug=0; //debug log - -//options name are case sensitive -//no spaces allowed in options -//; - end line character
\ No newline at end of file diff --git a/server/server/main.cpp b/server/server/main.cpp index c7e69f7..a85efd6 100644 --- a/server/server/main.cpp +++ b/server/server/main.cpp @@ -12,8 +12,6 @@ config *cfg; session::session(boost::asio::io_service& io_service, boost::asio::ssl::context& context, server *serv) : socket_(io_service, context), io_service_(io_service) { this_sid = get_random(8); - recv_data_[0] = 0; - snd_data_[0] = 0; server_ = serv; blacklisted = canceled = false; } @@ -92,7 +90,7 @@ void session::handle_handshake(const boost::system::error_code& error) logger->unlock(); } if (!error) - socket_.async_read_some(boost::asio::buffer(recv_data_, max_length), boost::bind(&session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); + socket_.async_read_some(boost::asio::buffer(recv_data_, 1024), boost::bind(&session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); else delete this; } @@ -105,9 +103,16 @@ void session::handle_write(const boost::system::error_code& error, size_t bytes_ logger->unlock(); } if(!error) - socket_.async_read_some(boost::asio::buffer(recv_data_, max_length), boost::bind(&session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); + { + recv_data_ = new byte[64]; + socket_.async_read_some(boost::asio::buffer(recv_data_, 64), boost::bind(&session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); + delete [] snd_data_; + } else + { + delete [] snd_data_; delete this; + } } void session::handle_write_close(const boost::system::error_code& error, size_t bytes_transferred) { @@ -117,6 +122,7 @@ void session::handle_write(const boost::system::error_code& error, size_t bytes_ *logger << time_str() << ": following write error occured: " << error.message() << " for client " << remote_ip << " session " << this_sid << "\n"; logger->unlock(); } + delete [] snd_data_; delete this; } void session::handle_auth_server_reply(const boost::system::error_code& error, size_t bytes_transferred) @@ -142,106 +148,52 @@ void session::proto_parser(std::vector<byte>& data) if(begin != data.end()) { std::vector<byte> local_data(begin, end); - std::vector<byte>::iterator it = std::find(local_data.begin(), local_data.end(), data_type_begin); + std::vector<byte>::iterator it = begin + 2; if(it != local_data.end()) { ++it; switch(*it) { - case 0xa0: //login request + case 0x01: //request type 1 { + if(canceled) + { + delete this; + break; + } logger->lock(); - *logger<< time_str() << ": recieved login request from "<<remote_ip << " session " << this_sid <<"\n"; + *logger<< time_str() << ": recieved request type 1 "<<remote_ip << " session " << this_sid <<"\n"; logger->unlock(); - //fill snd_data_ if(!blacklisted) { logger->lock(); - *logger<< time_str() << ": login request from "<<remote_ip<< " session " << this_sid << " are permited \n"; + *logger<< time_str() << ": request type 1 from "<<remote_ip<< " session " << this_sid << " are permited \n"; logger->unlock(); - std::vector<byte>::iterator p1 = std::search(local_data.begin(), local_data.end(), delim, delim + 2); - if(p1 != local_data.end()) - { - p1 +=2; - std::vector<byte>::iterator p2 = std::find(local_data.begin(), local_data.end(),data_c_end); - if(p2 == local_data.end()) - delete this; - std::vector<byte> tmp_vec(p1, p2); - if(tmp_vec[0] < proto_version) - { - logger->lock(); - *logger<< time_str() << ": old client version, login denied " << remote_ip <<" session " << this_sid << "\n"; - logger->unlock(); - const unsigned char buf [] = {0x83, 0x83, 0xDA, 0xB0, 0xDB, 0xAA, 0xAB, 0x15, 0x15, 0xAC, 0x84, 0x84}; //login not permited - memset(snd_data_, 0, 1024); - for(int i = 0; i < sizeof(buf); i++) - snd_data_[i] = buf[i]; - socket_.async_write_some(boost::asio::buffer(snd_data_, max_length), boost::bind(&session::handle_write_close, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); - } - else - { - const unsigned char buf [] = {0x83, 0x83, 0xDA, 0xB0, 0xDB, 0xAA, 0xAB, 0x13, 0x13, 0xAC, 0x84, 0x84}; //login permited - memset(snd_data_, 0, 1024); - for(int i = 0; i < sizeof(buf); i++) - snd_data_[i] = buf[i]; - socket_.async_write_some(boost::asio::buffer(snd_data_, max_length), boost::bind(&session::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); - } - } - else - { - logger->lock(); - *logger<< time_str() << ": WARNING old client version, allowed old clients for now " << remote_ip <<" session " << this_sid << "\n"; - logger->unlock(); - const unsigned char buf [] = {0x83, 0x83, 0xDA, 0xB0, 0xDB, 0xAA, 0xAB, 0x13, 0x13, 0xAC, 0x84, 0x84}; //login permited - memset(snd_data_, 0, 1024); - for(int i = 0; i < sizeof(buf); i++) - snd_data_[i] = buf[i]; - socket_.async_write_some(boost::asio::buffer(snd_data_, max_length), boost::bind(&session::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); - } + std::vector<byte> data; + data.push_back(0x13); + data.push_back(0x13); + data.push_back(0x01); + //TODO: add data here + data.push_back(0x14); + data.push_back(0x14); + write_w_close(data); } else { logger->lock(); - *logger<< time_str() << ": login request from "<<remote_ip << " session " << this_sid <<" are denied \n"; + *logger<< time_str() << ": request type 1 from "<<remote_ip << " session " << this_sid <<" are denied \n"; logger->unlock(); - const unsigned char buf [] = {0x83, 0x83, 0xDA, 0xB0, 0xDB, 0xAA, 0xAB, 0x66, 0x66, 0xAC, 0x84, 0x84}; //login denied - memset(snd_data_, 0, 1024); - for(int i = 0; i < sizeof(buf); i++) - snd_data_[i] = buf[i]; - socket_.async_write_some(boost::asio::buffer(snd_data_, max_length), boost::bind(&session::handle_write_close, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); - } - } - break; - case 0xa1: //main acc login request - { - logger->lock(); - *logger<< time_str() << ": recieved main account login info from " << remote_ip <<" session " << this_sid << "\n"; - logger->unlock(); - delete this; - } - break; - case 0xa2: //subacc login request - { - if(canceled) - { - delete this; - break; - } - delete this; - } - break; - case 0xa3: - { - if(canceled) - { - delete this; - break; + 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); } - delete this; } break; default: - socket_.async_read_some(boost::asio::buffer(recv_data_, max_length), boost::bind(&session::handle_read, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); break; } } @@ -256,7 +208,8 @@ void session::set_sid(std::string _sid) } void session::write_w_close(std::vector<byte>& data) { - memset(snd_data_, 0, 1024); + snd_data_ = new byte[data.size() + 1]; + memset(snd_data_, 0, data.size() + 1); for(int i = 0; i < data.size(); i++) snd_data_[i] = data[i]; if(cfg->debug()) @@ -265,12 +218,13 @@ void session::write_w_close(std::vector<byte>& data) *logger<< time_str() << ": Requested data write with socket close for " << remote_ip << " session " << this_sid << "\n"; logger->unlock(); } - socket_.async_write_some(boost::asio::buffer(snd_data_, max_length), boost::bind(&session::handle_write_close, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); + socket_.async_write_some(boost::asio::buffer(snd_data_, data.size() + 1), boost::bind(&session::handle_write_close, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); } void session::write_w_response(std::vector<byte>& data) { - memset(snd_data_, 0, 1024); + snd_data_ = new byte[data.size()+1]; + memset(snd_data_, 0, data.size()+1); for(int i = 0; i < data.size(); i++) snd_data_[i] = data[i]; if(cfg->debug()) @@ -279,12 +233,13 @@ void session::write_w_response(std::vector<byte>& data) *logger<< time_str() << ": Requested data write with response for " << remote_ip << " session " << this_sid << "\n"; logger->unlock(); } - socket_.async_write_some(boost::asio::buffer(snd_data_, max_length), boost::bind(&session::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); + socket_.async_write_some(boost::asio::buffer(snd_data_, data.size()+1), boost::bind(&session::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); } void session::write_wo_response(std::vector<byte>& data) { - memset(snd_data_, 0, 1024); + snd_data_ = new byte[data.size()+1]; + memset(snd_data_, 0, data.size()+1); for(int i = 0; i < data.size(); i++) snd_data_[i] = data[i]; if(cfg->debug()) @@ -293,13 +248,13 @@ void session::write_wo_response(std::vector<byte>& data) *logger<< time_str() << ": Requested data write with out response for " << remote_ip << " session " << this_sid << "\n"; logger->unlock(); } - socket_.async_write_some(boost::asio::buffer(snd_data_, max_length), boost::bind(&session::handle_operation, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); + socket_.async_write_some(boost::asio::buffer(snd_data_, data.size() +1), boost::bind(&session::handle_operation, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); } void session::handle_operation(const boost::system::error_code& error, size_t bytes_transferred) { - + delete [] snd_data_; } void session::handle_read(const boost::system::error_code& error, size_t bytes_transferred) @@ -321,9 +276,13 @@ void session::handle_read(const boost::system::error_code& error, size_t bytes_t } std::vector<byte> copy(recv_data_, recv_data_ + bytes_transferred); proto_parser(copy); + delete [] recv_data_; } else + { + delete [] recv_data_; delete this; + } } catch (std::exception& e) { diff --git a/server/server/main.h b/server/server/main.h index 655aeff..c7eb853 100644 --- a/server/server/main.h +++ b/server/server/main.h @@ -7,21 +7,10 @@ typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket; using boost::asio::ip::tcp; typedef unsigned char byte; -const byte proto_version = 0x01; +const byte proto_version = 0x02; -const byte data_begin [] = {0x83, 0x83}; -const byte data_end [] = {0x84, 0x84}; -const byte data_type_begin = 0xda; -const byte data_type_end = 0xdb; -const byte _eq = 0xaa; -const byte data_c_begin = 0xab; -const byte delim [] = {0xaa, 0xab}; -const byte data_c_delim = 0xad; -const byte data_c_end = 0xac; -const byte sid_begin = 0xca; -const byte sid_end = 0xcb; -const byte reply_success [] = {0x13, 0x13}; -const byte reply_failure [] = {0x66, 0x66}; +const byte data_begin [] = {0x13, 0x13}; +const byte data_end [] = {0x14, 0x14}; class session; class server; @@ -53,9 +42,8 @@ public: void handle_read(const boost::system::error_code& error, size_t bytes_transferred); private: ssl_socket socket_; - enum { max_length = 2048 }; - unsigned char recv_data_[max_length]; - unsigned char snd_data_[max_length]; + unsigned char *recv_data_; + unsigned char *snd_data_; boost::asio::io_service& io_service_; std::string sid, remote_ip, this_sid; server *server_; @@ -80,11 +68,11 @@ struct conn_count } const bool operator==(const conn_count& c) { - return this->ip == c.ip; + return ip == c.ip; } const bool operator==(const std::string& c) { - return this->ip == c; + return ip == c; } }; |