summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorGluzskiy Alexandr <sss@sss.chaoslab.ru>2013-02-15 20:53:16 +0200
committerGluzskiy Alexandr <sss@sss.chaoslab.ru>2013-02-15 20:53:16 +0200
commit4a2dd17aa0601fffd42f2ec1c92c6a1b79f648d3 (patch)
tree810c02c1cdd244aebdfebdba888a2a70158ab138 /server
parenteda5eaf4a1be590b9e4905f322b3e0923f65d312 (diff)
work on client started (services retrieving implemented)
server services packet handling implemented
Diffstat (limited to 'server')
-rw-r--r--server/server.cpp7
-rw-r--r--server/service.cpp45
-rw-r--r--server/service.h2
-rw-r--r--server/session.cpp3
4 files changed, 47 insertions, 10 deletions
diff --git a/server/server.cpp b/server/server.cpp
index 7a13fe6..a44b764 100644
--- a/server/server.cpp
+++ b/server/server.cpp
@@ -24,9 +24,12 @@ io_service_(io_service), acceptor_(io_service, tcp::endpoint(boost::asio::ip::ad
{
context_.set_options(boost::asio::ssl::context::default_workarounds | boost::asio::ssl::context::no_sslv2);
context_.set_password_callback(boost::bind(&server::get_password, this));
- context_.use_certificate_chain_file("/etc/restarter_server/serv.crt");
+/* context_.use_certificate_chain_file("/etc/restarter_server/serv.crt");
context_.use_rsa_private_key_file("/etc/restarter_server/serv.key", boost::asio::ssl::context::pem);
- context_.load_verify_file("/etc/restarter_server/ca.crt");
+ context_.load_verify_file("/etc/restarter_server/ca.crt"); */
+ context_.use_certificate_chain_file("./serv.crt");
+ context_.use_rsa_private_key_file("./serv.key", boost::asio::ssl::context::pem);
+ context_.load_verify_file("./ca.crt");
context_.set_verify_mode(boost::asio::ssl::verify_peer | boost::asio::ssl::verify_client_once);
start_accept();
}
diff --git a/server/service.cpp b/server/service.cpp
index b00406f..541f935 100644
--- a/server/service.cpp
+++ b/server/service.cpp
@@ -31,13 +31,13 @@ bool service_info::command::operator==(const std::string &command)
return command == this->command;
}
-void handle_data(session *s, proto::packet &p)
+bool handle_data(session *s, proto::packet &p)
{
using namespace proto;
if(!p.is_good())
- {
- delete s;
- }
+ return false;
+ if(!p.is_client_packet())
+ return false;
switch(p.get_type())
{
case TYPE_AUTH:
@@ -47,15 +47,37 @@ void handle_data(session *s, proto::packet &p)
packet *r = packet::serv_make_status_packet(TYPE_AUTH, STATUS_FAILURE);
s->write_w_close(r->raw());
delete r;
- return;
+ return false;
}
else
{
packet *r = packet::serv_make_status_packet(TYPE_AUTH, STATUS_SUCCESS);
s->write_w_response(r->raw());
delete r;
- return;
+ return true;
+ }
+ }
+ break;
+ case TYPE_SERVICES:
+ { //TODO: rewrite
+ std::list<service_s> svcs;
+ for(std::list<service_info>::iterator i = installed_services.begin(), end = installed_services.end(); i != end; ++i)
+ {
+ service_s s;
+ s.service = i->name;
+ for(std::list<service_info::command>::iterator ii = i->predefined.begin(), eend = i->predefined.end(); ii != eend; ++ii)
+ {
+ service_s::cmd c;
+ c.command = ii->command;
+ c.description = ii->description;
+ s.cmds.push_back(c);
+ }
+ svcs.push_back(s);
}
+ packet *r = packet::serv_make_services_packet(svcs);
+ s->write_w_response(r->raw());
+ delete r;
+ return true;
}
break;
case TYPE_COMMAND:
@@ -86,6 +108,7 @@ void handle_data(session *s, proto::packet &p)
packet *p = packet::serv_make_command_reply_packet(str, STATUS_SUCCESS);
s->write_w_response(p->raw());
delete p;
+ return true;
}
break;
case RET_FLOAT_PTR:
@@ -98,6 +121,7 @@ void handle_data(session *s, proto::packet &p)
s->write_w_response(p->raw());
delete p;
delete ret;
+ return true;
}
break;
case RET_INT_PTR:
@@ -110,6 +134,7 @@ void handle_data(session *s, proto::packet &p)
s->write_w_response(p->raw());
delete p;
delete ret;
+ return true;
}
break;
case RET_NONE:
@@ -119,6 +144,7 @@ void handle_data(session *s, proto::packet &p)
packet *p = packet::serv_make_status_packet(TYPE_COMMAND, STATUS_SUCCESS);
s->write_w_response(p->raw());
delete p;
+ return true;
}
break;
case RET_STD_STRING_PTR:
@@ -129,6 +155,7 @@ void handle_data(session *s, proto::packet &p)
s->write_w_response(p->raw());
delete p;
delete str;
+ return true;
}
break;
case RET_VOID_PTR:
@@ -176,6 +203,7 @@ void handle_data(session *s, proto::packet &p)
delete [] data;
s->write_w_response(p->raw());
delete p;
+ return true;
}
break;
case RET_FLOAT_PTR:
@@ -187,6 +215,7 @@ void handle_data(session *s, proto::packet &p)
s->write_w_response(p->raw());
delete p;
delete ret;
+ return true;
}
break;
case RET_INT_PTR:
@@ -198,6 +227,7 @@ void handle_data(session *s, proto::packet &p)
s->write_w_response(p->raw());
delete p;
delete ret;
+ return true;
}
break;
case RET_NONE:
@@ -206,6 +236,7 @@ void handle_data(session *s, proto::packet &p)
packet *p = packet::serv_make_status_packet(TYPE_AUTH, STATUS_SUCCESS);
s->write_w_response(p->raw());
delete p;
+ return true;
}
break;
case RET_STD_STRING_PTR:
@@ -215,6 +246,7 @@ void handle_data(session *s, proto::packet &p)
s->write_w_response(p->raw());
delete p;
delete str;
+ return true;
}
break;
case RET_VOID_PTR:
@@ -228,6 +260,7 @@ void handle_data(session *s, proto::packet &p)
}
break;
}
+ return false;
}
};
diff --git a/server/service.h b/server/service.h
index 2ba9ee6..bb01554 100644
--- a/server/service.h
+++ b/server/service.h
@@ -22,7 +22,7 @@
namespace service {
extern std::list<service_info> installed_services;
- void handle_data(session *s, proto::packet &p);
+ bool handle_data(session *s, proto::packet &p);
};
#endif
diff --git a/server/session.cpp b/server/session.cpp
index bb6ffd4..f86e7f1 100644
--- a/server/session.cpp
+++ b/server/session.cpp
@@ -43,7 +43,8 @@ void session::handle_read(const boost::system::error_code& error, size_t bytes_t
delete [] recv_data;
packet p(v);
v.clear();
- handle_data(this, p);
+ if(!handle_data(this, p))
+ delete this;
}
}