memory leaks fixing
This commit is contained in:
parent
b8659268cc
commit
3387aa7ca1
@ -7,7 +7,6 @@ SOURCES += \
|
|||||||
main.cpp \
|
main.cpp \
|
||||||
conexion.cpp \
|
conexion.cpp \
|
||||||
conexion_ssl.cpp \
|
conexion_ssl.cpp \
|
||||||
thread_selector.cpp \
|
|
||||||
config_reader.cpp \
|
config_reader.cpp \
|
||||||
tests.cpp \
|
tests.cpp \
|
||||||
data_acces.cpp \
|
data_acces.cpp \
|
||||||
@ -19,7 +18,6 @@ SOURCES += \
|
|||||||
HEADERS += \
|
HEADERS += \
|
||||||
conexion.h \
|
conexion.h \
|
||||||
conexion_ssl.h \
|
conexion_ssl.h \
|
||||||
thread_selector.h \
|
|
||||||
config_reader.h \
|
config_reader.h \
|
||||||
tests.h \
|
tests.h \
|
||||||
data_acces.h \
|
data_acces.h \
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE QtCreatorProject>
|
<!DOCTYPE QtCreatorProject>
|
||||||
<!-- Written by QtCreator 4.8.2, 2020-05-27T13:14:37. -->
|
<!-- Written by QtCreator 4.8.2, 2020-05-31T02:21:12. -->
|
||||||
<qtcreator>
|
<qtcreator>
|
||||||
<data>
|
<data>
|
||||||
<variable>EnvironmentId</variable>
|
<variable>EnvironmentId</variable>
|
||||||
|
@ -56,7 +56,6 @@ void conexion::start_server(){
|
|||||||
int client = accept(sock, (struct sockaddr*)&addr, &len);
|
int client = accept(sock, (struct sockaddr*)&addr, &len);
|
||||||
std::thread t_client(conexion_client , client);
|
std::thread t_client(conexion_client , client);
|
||||||
t_client.detach();
|
t_client.detach();
|
||||||
//cont++;
|
|
||||||
}
|
}
|
||||||
close(sock);
|
close(sock);
|
||||||
}
|
}
|
||||||
@ -70,8 +69,13 @@ void conexion_client(int client){
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}else{
|
}else{
|
||||||
session_manager* session = new session_manager(client);
|
session_manager* session = new session_manager(client);
|
||||||
while(!session->validate_pass());
|
bool enter=session->validate_pass();
|
||||||
|
while(!enter){
|
||||||
|
enter=session->validate_pass();
|
||||||
|
}
|
||||||
|
if(enter){
|
||||||
session->start_dialog();
|
session->start_dialog();
|
||||||
|
}
|
||||||
delete (session);
|
delete (session);
|
||||||
close(client);
|
close(client);
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,6 @@ void conexion_ssl::start_server(){
|
|||||||
perror("bad port in config file");
|
perror("bad port in config file");
|
||||||
}
|
}
|
||||||
sock = this->create_socket(atoi(port.data()));
|
sock = this->create_socket(atoi(port.data()));
|
||||||
/* Handle connections */
|
|
||||||
SSL_CTX *ctx;
|
SSL_CTX *ctx;
|
||||||
|
|
||||||
init_openssl();
|
init_openssl();
|
||||||
@ -37,8 +36,6 @@ void conexion_ssl::start_server(){
|
|||||||
|
|
||||||
this->configure_context(ctx);
|
this->configure_context(ctx);
|
||||||
|
|
||||||
//std::thread *hilos=new thread[50];
|
|
||||||
//int cont=0;
|
|
||||||
while(1) {
|
while(1) {
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
uint len = sizeof(addr);
|
uint len = sizeof(addr);
|
||||||
@ -46,7 +43,6 @@ void conexion_ssl::start_server(){
|
|||||||
int client = accept(sock, (struct sockaddr*)&addr, &len);
|
int client = accept(sock, (struct sockaddr*)&addr, &len);
|
||||||
std::thread t_client(conexion_client,ctx , client);
|
std::thread t_client(conexion_client,ctx , client);
|
||||||
t_client.detach();
|
t_client.detach();
|
||||||
//cont++;
|
|
||||||
}
|
}
|
||||||
close(sock);
|
close(sock);
|
||||||
SSL_CTX_free(ctx);
|
SSL_CTX_free(ctx);
|
||||||
@ -107,8 +103,6 @@ void conexion_ssl::configure_context(SSL_CTX *ctx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void conexion_client(SSL_CTX *ctx,int client){
|
void conexion_client(SSL_CTX *ctx,int client){
|
||||||
char buf [256];
|
|
||||||
|
|
||||||
if (client < 0) {
|
if (client < 0) {
|
||||||
perror("Unable to accept");
|
perror("Unable to accept");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
@ -122,9 +116,13 @@ void conexion_client(SSL_CTX *ctx,int client){
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
session_manager* session = new session_manager_ssl(ssl);
|
session_manager* session = new session_manager_ssl(ssl);
|
||||||
while(!session->validate_pass());
|
bool enter=session->validate_pass();
|
||||||
|
while(!enter){
|
||||||
|
enter=session->validate_pass();
|
||||||
|
}
|
||||||
|
if(enter){
|
||||||
session->start_dialog();
|
session->start_dialog();
|
||||||
//SSL_write(ssl,std::to_string(la->execute()).data() , sizeof (int));
|
}
|
||||||
delete (session);
|
delete (session);
|
||||||
}
|
}
|
||||||
SSL_shutdown(ssl);
|
SSL_shutdown(ssl);
|
||||||
|
@ -1,6 +1,18 @@
|
|||||||
#include "data_acces.h"
|
#include "data_acces.h"
|
||||||
|
#include <openssl/sha.h>
|
||||||
|
#include <openssl/evp.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
data_acces::data_acces()
|
data_acces::data_acces()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* data_acces::get_hash(char *data){
|
||||||
|
unsigned char hash[SHA512_DIGEST_LENGTH];
|
||||||
|
SHA512(reinterpret_cast<unsigned const char*>(data), strlen(data), hash);
|
||||||
|
unsigned char* encodedData= new unsigned char[200];
|
||||||
|
EVP_EncodeBlock(encodedData, hash, sizeof (hash));
|
||||||
|
return reinterpret_cast<char*>(encodedData);
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -17,6 +17,6 @@ public:
|
|||||||
virtual bool get_package_exists(std::string package)=0;
|
virtual bool get_package_exists(std::string package)=0;
|
||||||
virtual void create_user(std::string user, std::string pass, bool admin)=0;
|
virtual void create_user(std::string user, std::string pass, bool admin)=0;
|
||||||
virtual void remove_user(std::string user)=0;
|
virtual void remove_user(std::string user)=0;
|
||||||
|
static char* get_hash(char *data);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DATA_ACCES_H
|
#endif // DATA_ACCES_H
|
||||||
|
4
main.cpp
4
main.cpp
@ -5,11 +5,15 @@
|
|||||||
#include "conexion_ssl.h"
|
#include "conexion_ssl.h"
|
||||||
#include "config_reader.h"
|
#include "config_reader.h"
|
||||||
#include "tests.h"
|
#include "tests.h"
|
||||||
|
#include "msql_acces.h"
|
||||||
|
|
||||||
#define file_config "config"
|
#define file_config "config"
|
||||||
CPPUNIT_TEST_SUITE_REGISTRATION( test_basic );
|
CPPUNIT_TEST_SUITE_REGISTRATION( test_basic );
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
//msql_acces data;
|
||||||
|
//data.create_user("otro", "otro", true);
|
||||||
|
|
||||||
//inicio de los tests
|
//inicio de los tests
|
||||||
CPPUNIT_NS::TestResult testresult;
|
CPPUNIT_NS::TestResult testresult;
|
||||||
CPPUNIT_NS::TestResultCollector collectedresults;
|
CPPUNIT_NS::TestResultCollector collectedresults;
|
||||||
|
@ -20,6 +20,7 @@ std::string msql_acces::get_passwd(std::string username){
|
|||||||
while(res->next())
|
while(res->next())
|
||||||
ret = res->getString("passwd");
|
ret = res->getString("passwd");
|
||||||
delete res;
|
delete res;
|
||||||
|
delete pstmt;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,6 +32,7 @@ bool msql_acces::get_admin(std::string username){
|
|||||||
while(res->next())
|
while(res->next())
|
||||||
ret = res->getBoolean("admin");
|
ret = res->getBoolean("admin");
|
||||||
delete res;
|
delete res;
|
||||||
|
delete pstmt;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,6 +57,7 @@ std::list<std::string> msql_acces::get_pinfo(){
|
|||||||
ret.push_back(aux);
|
ret.push_back(aux);
|
||||||
}
|
}
|
||||||
delete res;
|
delete res;
|
||||||
|
delete pstmt;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,6 +79,7 @@ std::list<std::string> msql_acces::get_uinfo(){
|
|||||||
ret.push_back(aux);
|
ret.push_back(aux);
|
||||||
}
|
}
|
||||||
delete res;
|
delete res;
|
||||||
|
delete pstmt;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,6 +89,7 @@ void msql_acces::write_install(std::string package, std::string user){
|
|||||||
pstmt->setString(1,package);
|
pstmt->setString(1,package);
|
||||||
pstmt->setString(2,user);
|
pstmt->setString(2,user);
|
||||||
pstmt->executeUpdate();
|
pstmt->executeUpdate();
|
||||||
|
delete pstmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
void msql_acces::write_remove(std::string package){
|
void msql_acces::write_remove(std::string package){
|
||||||
@ -92,6 +97,7 @@ void msql_acces::write_remove(std::string package){
|
|||||||
con->prepareStatement("delete from packages where name=?");
|
con->prepareStatement("delete from packages where name=?");
|
||||||
pstmt->setString(1,package);
|
pstmt->setString(1,package);
|
||||||
pstmt->executeUpdate();
|
pstmt->executeUpdate();
|
||||||
|
delete pstmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool msql_acces::get_package_exists(std::string package){
|
bool msql_acces::get_package_exists(std::string package){
|
||||||
@ -99,22 +105,20 @@ bool msql_acces::get_package_exists(std::string package){
|
|||||||
pstmt->setString(1,package);
|
pstmt->setString(1,package);
|
||||||
sql::ResultSet *res = pstmt->executeQuery();
|
sql::ResultSet *res = pstmt->executeQuery();
|
||||||
int ret=0;
|
int ret=0;
|
||||||
while(res->next())
|
while(res->next()){
|
||||||
ret = res->getInt(1);
|
ret = res->getInt(1);
|
||||||
|
}
|
||||||
|
delete pstmt;
|
||||||
return ret>0;
|
return ret>0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void msql_acces::create_user(std::string user, std::string pass, bool admin){
|
void msql_acces::create_user(std::string user, std::string pass, bool admin){
|
||||||
sql::PreparedStatement *pstmt = con->prepareStatement("insert into users(username, passwd, admin) values(?, ?, ?)");
|
sql::PreparedStatement *pstmt = con->prepareStatement("insert into users(username, passwd, admin) values(?, ?, ?)");
|
||||||
unsigned char hash[SHA512_DIGEST_LENGTH];
|
|
||||||
SHA512(reinterpret_cast<unsigned const char*>(pass.data()), strlen(pass.data()), hash);
|
|
||||||
unsigned char encodedData[200];
|
|
||||||
EVP_EncodeBlock(encodedData, hash, sizeof (hash));
|
|
||||||
pstmt->setString(1,user);
|
pstmt->setString(1,user);
|
||||||
pstmt->setString(2,std::string(reinterpret_cast<char*>(encodedData)));
|
pstmt->setString(2,std::string(data_acces::get_hash(&pass[0])));
|
||||||
pstmt->setBoolean(3,admin);
|
pstmt->setBoolean(3,admin);
|
||||||
pstmt->executeQuery();
|
pstmt->executeQuery();
|
||||||
|
delete pstmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
void msql_acces::remove_user(std::string user){
|
void msql_acces::remove_user(std::string user){
|
||||||
@ -122,4 +126,5 @@ void msql_acces::remove_user(std::string user){
|
|||||||
con->prepareStatement("delete from users where username=?");
|
con->prepareStatement("delete from users where username=?");
|
||||||
pstmt->setString(1,user);
|
pstmt->setString(1,user);
|
||||||
pstmt->executeUpdate();
|
pstmt->executeUpdate();
|
||||||
|
delete pstmt;
|
||||||
}
|
}
|
||||||
|
@ -19,12 +19,8 @@ bool session_manager::validate_pass(){
|
|||||||
this->read_data(buffer, 256);
|
this->read_data(buffer, 256);
|
||||||
std::string user=buffer;
|
std::string user=buffer;
|
||||||
this->read_data(buffer, 256);
|
this->read_data(buffer, 256);
|
||||||
// std::string pass=buffer;
|
std::string pass=std::string(data_acces::get_hash(buffer));
|
||||||
unsigned char hash[SHA512_DIGEST_LENGTH];
|
delete[] (buffer);
|
||||||
SHA512(reinterpret_cast<unsigned const char*>(buffer), strlen(buffer), hash);
|
|
||||||
unsigned char encodedData[200];
|
|
||||||
EVP_EncodeBlock(encodedData, hash, sizeof (hash));
|
|
||||||
std::string pass=std::string(reinterpret_cast<char*>(encodedData));
|
|
||||||
if(this->data->get_passwd(user)==pass){
|
if(this->data->get_passwd(user)==pass){
|
||||||
this->write_data("pass");
|
this->write_data("pass");
|
||||||
if(this->data->get_admin(user)){
|
if(this->data->get_admin(user)){
|
||||||
@ -62,6 +58,7 @@ void session_manager::start_dialog(){
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
delete[] (buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
int session_manager::execute(){
|
int session_manager::execute(){
|
||||||
@ -75,11 +72,13 @@ int session_manager::execute(){
|
|||||||
this->read_data(use_conf,256);
|
this->read_data(use_conf,256);
|
||||||
conf.change_uses(use_conf);
|
conf.change_uses(use_conf);
|
||||||
}else if(strcmp(use_conf,"n")!=0){
|
}else if(strcmp(use_conf,"n")!=0){
|
||||||
|
delete[] (n_package);
|
||||||
perror("fail in protocol comunication");
|
perror("fail in protocol comunication");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
delete [] (use_conf);
|
delete [] (use_conf);
|
||||||
std::string result = this->appli_command("--ask", n_package);
|
std::string result = this->appli_command("--ask", n_package);
|
||||||
|
delete[] (n_package);
|
||||||
if(result=="err"){
|
if(result=="err"){
|
||||||
return -1;
|
return -1;
|
||||||
}else{
|
}else{
|
||||||
@ -94,6 +93,7 @@ int session_manager::remove(){
|
|||||||
char* n_package = new char[256];
|
char* n_package = new char[256];
|
||||||
this->read_data(n_package, 256);
|
this->read_data(n_package, 256);
|
||||||
std::string result = this->appli_command("--unmerge",n_package);
|
std::string result = this->appli_command("--unmerge",n_package);
|
||||||
|
delete[] (n_package);
|
||||||
if(result=="err"){
|
if(result=="err"){
|
||||||
return -1;
|
return -1;
|
||||||
}else{
|
}else{
|
||||||
@ -121,10 +121,8 @@ std::string session_manager::appli_command(char comand[], char* n_package){
|
|||||||
if(status>0){
|
if(status>0){
|
||||||
this->write_data("ok");
|
this->write_data("ok");
|
||||||
ret = n_package;
|
ret = n_package;
|
||||||
delete[] (n_package);
|
|
||||||
}else{
|
}else{
|
||||||
this->write_data("bad");
|
this->write_data("bad");
|
||||||
delete[] (n_package);
|
|
||||||
ret = "err";
|
ret = "err";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -167,6 +165,7 @@ void session_manager::remove_user(){
|
|||||||
this->read_data(buffer,256);
|
this->read_data(buffer,256);
|
||||||
this->read_data(buffer,256);
|
this->read_data(buffer,256);
|
||||||
this->data->remove_user(std::string(buffer));
|
this->data->remove_user(std::string(buffer));
|
||||||
|
delete[] (buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
int session_manager::read_data(char* input, int size){
|
int session_manager::read_data(char* input, int size){
|
||||||
|
27
tests.cpp
27
tests.cpp
@ -1,10 +1,15 @@
|
|||||||
#include "tests.h"
|
#include "tests.h"
|
||||||
|
#include "msql_acces.h"
|
||||||
|
#include <openssl/evp.h>
|
||||||
|
#include <openssl/sha.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
void test_basic::setUp(){
|
void test_basic::setUp(){
|
||||||
this->conf=new config_reader("config");
|
this->conf=new config_reader("config");
|
||||||
|
this->data=new msql_acces();
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_basic::testInitial(){
|
void test_basic::test_initial(){
|
||||||
std::string res;
|
std::string res;
|
||||||
CPPUNIT_ASSERT(true==this->conf->get_param("port",res));
|
CPPUNIT_ASSERT(true==this->conf->get_param("port",res));
|
||||||
CPPUNIT_ASSERT("4433"==res);
|
CPPUNIT_ASSERT("4433"==res);
|
||||||
@ -20,3 +25,23 @@ void test_basic::pass_tests(){
|
|||||||
testrunner.addTest (CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest ());
|
testrunner.addTest (CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest ());
|
||||||
testrunner.run(testresult);
|
testrunner.run(testresult);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_basic::hash_test(){
|
||||||
|
CPPUNIT_ASSERT(strcmp(data_acces::get_hash("test1")
|
||||||
|
,data_acces::get_hash("test1"))==0);
|
||||||
|
CPPUNIT_ASSERT(strcmp(data_acces::get_hash("test1")
|
||||||
|
,data_acces::get_hash("test2"))!=0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_basic::msql_loggin_test(){
|
||||||
|
std::string pass = this->data->get_passwd("test");
|
||||||
|
CPPUNIT_ASSERT(pass==std::string(data_acces::get_hash("ok")));
|
||||||
|
CPPUNIT_ASSERT(pass!=std::string(data_acces::get_hash("fail")));
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_basic::msql_package_test(){
|
||||||
|
data->write_install("p1","test");
|
||||||
|
CPPUNIT_ASSERT(data->get_package_exists("p1"));
|
||||||
|
data->write_remove("p1");
|
||||||
|
CPPUNIT_ASSERT(!data->get_package_exists("p1"));
|
||||||
|
}
|
||||||
|
12
tests.h
12
tests.h
@ -12,17 +12,25 @@
|
|||||||
#include <cppunit/CompilerOutputter.h>
|
#include <cppunit/CompilerOutputter.h>
|
||||||
#include <cppunit/XmlOutputter.h>
|
#include <cppunit/XmlOutputter.h>
|
||||||
#include "config_reader.h"
|
#include "config_reader.h"
|
||||||
|
#include "data_acces.h"
|
||||||
using namespace CppUnit;
|
using namespace CppUnit;
|
||||||
|
|
||||||
class test_basic : public CppUnit::TestFixture{
|
class test_basic : public CppUnit::TestFixture{
|
||||||
CPPUNIT_TEST_SUITE(test_basic);
|
CPPUNIT_TEST_SUITE(test_basic);
|
||||||
CPPUNIT_TEST(testInitial);
|
CPPUNIT_TEST(test_initial);
|
||||||
|
CPPUNIT_TEST(hash_test);
|
||||||
|
CPPUNIT_TEST(msql_loggin_test);
|
||||||
|
CPPUNIT_TEST(msql_package_test);
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
public:
|
public:
|
||||||
void setUp(void);
|
void setUp(void);
|
||||||
void pass_tests();
|
void pass_tests();
|
||||||
private:
|
private:
|
||||||
void testInitial(void);
|
void test_initial();
|
||||||
|
void hash_test();
|
||||||
|
void msql_loggin_test();
|
||||||
|
void msql_package_test();
|
||||||
config_reader *conf;
|
config_reader *conf;
|
||||||
|
data_acces *data;
|
||||||
};
|
};
|
||||||
#endif // TESTS_H
|
#endif // TESTS_H
|
||||||
|
Loading…
Reference in New Issue
Block a user