Removed Craplog's module StoreOps

Worker handles all this stuff
This commit is contained in:
Valentino Orlandi 2023-01-27 02:37:05 +01:00
parent d744f346fb
commit ca1bb8d91d
Signed by: elB4RTO
GPG Key ID: 1719E976DB2D4E71
2 changed files with 0 additions and 317 deletions

View File

@ -1,290 +0,0 @@
#include "store.h"
#include "modules/dialogs.h"
#include "modules/exceptions.h"
#include "utilities/strings.h"
#include <QVariant>
StoreOps::StoreOps()
{
}
bool StoreOps::storeData( QSqlDatabase& db, Craplog& craplog, const std::vector<std::unordered_map<int, std::string>>& data )
{
bool successful = true;
int wsID = craplog.getCurrentWSID();
QString db_name;
{
std::string db_path = craplog.getStatsDatabasePath();
db_name.append( QString::fromStdString( db_path.substr( db_path.find_last_of( '/' ) + 1 ) ) );
}
// get blacklist/warnlist items
bool check_bl_cli,
check_wl_cli, check_wl_ua, check_wl_met, check_wl_req;
check_bl_cli = craplog.isBlacklistUsed( wsID, 20 );
check_wl_met = craplog.isWarnlistUsed( wsID, 11 );
check_wl_req = craplog.isWarnlistUsed( wsID, 12 );
check_wl_cli = craplog.isWarnlistUsed( wsID, 20 );
check_wl_ua = craplog.isWarnlistUsed( wsID, 21 );
std::vector<std::string> bl_cli_list, wl_cli_list, wl_ua_list, wl_met_list, wl_req_list;
if ( check_bl_cli ) {
bl_cli_list = craplog.getBlacklist( wsID, 20 );
}
if ( check_wl_met ) {
wl_met_list = craplog.getWarnlist( wsID, 11 );
}
if ( check_wl_req ) {
wl_req_list = craplog.getWarnlist( wsID, 12 );
}
if ( check_wl_cli ) {
wl_cli_list = craplog.getWarnlist( wsID, 20 );
}
if ( check_wl_ua ) {
wl_ua_list = craplog.getWarnlist( wsID, 21 );
}
// prepare the database related studd
QString table;
switch ( wsID ) {
case 11:
table = "apache";
break;
case 12:
table = "nginx";
break;
case 13:
table = "iis";
break;
default:
// wrong WebServerID, but should be unreachable because of the previous operations
throw WebServerException( "Unexpected WebServerID: " + std::to_string(wsID) );
}
int perf_size;
bool skip = false,
warning = false;
QSqlQuery query = QSqlQuery( db );
// parse every row of data
for ( const std::unordered_map<int, std::string>& row : data ) {
// break if failed
if ( ! successful ) { break; }
// check blacklisted clients
if ( check_bl_cli ) {
if ( row.find( 20 ) != row.end() ) {
// this row do contains this row item, check if they match
const std::string& target = row.at( 20 );
for ( const auto& item : bl_cli_list ) {
if ( StringOps::startsWith( target, item ) ) {
// match found! skip this line
skip = true;
break;
}
}
}
}
if ( skip ) {
// append every field to ignored size
int blacklisted_size = 0;
for ( const auto& [ id, str ] : row ) {
blacklisted_size += str.size();
}
craplog.sumBlacklistededSize( blacklisted_size );
skip = false;
continue;
}
// check warnlisted clients
if ( check_wl_cli ) {
if ( row.find( 20 ) != row.end() ) {
// this row do contains this row item, check if they match
const std::string& target = row.at( 20 );
for ( const auto& item : wl_cli_list ) {
if ( StringOps::startsWith( target, item ) ) {
// match found! put a warning on this line
warning = true;
craplog.sumWarningsSize( item.size() );
break;
}
}
}
}
// check warnlisted user-agents
if ( check_wl_ua && !warning ) {
if ( row.find( 21 ) != row.end() ) {
// this row do contains this row item, check if they match
const std::string& target = row.at( 21 );
for ( const auto& item : wl_ua_list ) {
if ( StringOps::startsWith( target, item ) ) {
// match found! skip this line
warning = true;
craplog.sumWarningsSize( item.size() );
break;
}
}
}
}
// check warnlisted methods
if ( check_wl_met && !warning ) {
if ( row.find( 11 ) != row.end() ) {
// this row do contains this row item, check if they match
const std::string& target = row.at( 11 );
for ( const auto& item : wl_met_list ) {
if ( item == target ) {
// match found! skip this line
warning = true;
craplog.sumWarningsSize( item.size() );
break;
}
}
}
}
// check warnlisted requests urls
if ( check_wl_req && !warning ) {
if ( row.find( 12 ) != row.end() ) {
// this row do contains this row item, check if they match
const std::string& target = row.at( 12 );
for ( const auto& item : wl_req_list ) {
if ( StringOps::startsWith( target, item ) ) {
// match found! skip this line
warning = true;
craplog.sumWarningsSize( item.size() );
break;
}
}
}
}
// initialize the SQL statement
QString query_stmt;
query_stmt = "INSERT INTO \""+table+"\" (\"warning\", \"year\", \"month\", \"day\", \"hour\", \"minute\", \"second\", \"protocol\", \"method\", \"uri\", \"query\", \"response\", \"time_taken\", \"bytes_sent\", \"bytes_received\", \"referrer\", \"client\", \"user_agent\", \"cookie\") "\
"VALUES (";
// complete and execute the statement, binding NULL if not found
perf_size = 0;
// warning
if ( row.find( 99 ) == row.end() ) {
// no value found in the collection, bind NULL
query_stmt += "0";
} else {
// value found, bind it
perf_size ++;
if ( ! warning ) {
query_stmt += "0";
} else {
query_stmt += "1";
warning = false;
}
}
// date and time
for ( int i=1; i<7; i++ ) {
query_stmt += ", ";
if ( row.find( i ) == row.end() ) {
// no value found in the collection, bind NULL
query_stmt += "NULL";
} else {
// value found, bind it
perf_size += row.at( i ).size();
query_stmt += QString::fromStdString( row.at( i ) ).replace("'","''");
}
}
// request
for ( int i=10; i<14; i++ ) {
query_stmt += ", ";
if ( row.find( i ) == row.end() ) {
// no value found in the collection, bind NULL
query_stmt += "NULL";
} else {
// value found, bind it
perf_size += row.at( i ).size();
query_stmt += QString("'%1'").arg( QString::fromStdString( row.at( i ) ).replace("'","''") );
}
}
for ( int i=14; i<18; i++ ) {
query_stmt += ", ";
if ( row.find( i ) == row.end() ) {
// no value found in the collection, bind NULL
query_stmt += "NULL";
} else {
// value found, bind it
perf_size += row.at( i ).size();
query_stmt += QString::fromStdString( row.at( i ) ).replace("'","''");
}
}
// client data and referrer
for ( int i : std::vector<int>({18,20,21,22}) ) {
query_stmt += ", ";
if ( row.find( i ) == row.end() ) {
// no value found in the collection, bind NULL
query_stmt += "NULL";
} else {
// value found, bind it
if ( i == 21 && wsID == 13 ) {
// iis logs the user-agent using '+' instead of ' ' (spaces)
QString str = QString::fromStdString( row.at( i ) ).replace("+"," ");
perf_size += str.size();
query_stmt += QString("'%1'").arg( str.replace("'","''") );
} else {
perf_size += row.at( i ).size();
query_stmt += QString("'%1'").arg( QString::fromStdString( row.at( i ) ).replace("'","''") );
}
}
}
// encode the statement
query_stmt += ");";
if ( ! query.prepare( query_stmt ) ) {
// error opening database
successful = false;
QString query_msg="", err_msg="";
if ( craplog.getDialogsLevel() > 0 ) {
query_msg = "query.prepare()";
if ( craplog.getDialogsLevel() == 2 ) {
err_msg = query.lastError().text();
}
}
DialogSec::errDatabaseFailedExecuting( db_name, query_msg, err_msg );
}
// sum stored data size for the perfs
//craplog.sumPerfSize( perf_size );
// finalize this statement
if ( ! query.exec() ) {
// error finalizing step
successful = false;
QString query_msg="", err_msg="";
if ( craplog.getDialogsLevel() > 0 ) {
query_msg = "query.exec()";
if ( craplog.getDialogsLevel() == 2 ) {
err_msg = query.lastError().text();
}
}
DialogSec::errDatabaseFailedExecuting( db_name, query_msg, err_msg );
break;
}
// reset the statement to prepare for the next one
query.finish();
}
return successful;
}

View File

@ -1,27 +0,0 @@
#ifndef STORE_H
#define STORE_H
#include "modules/craplog/craplog.h"
//! StoreOps
/*!
Operations to store logs data
*/
class StoreOps
{
public:
explicit StoreOps();
//! Stores the data collection in the logs Collection database
/*!
\param db A database instance, already initizlized
\param craplog The Craplog instance
\param data The logs data collection
\return Whether the operation has been successful or not
\throw WebServerException
*/
static bool storeData( QSqlDatabase& db, Craplog& craplog, const std::vector<std::unordered_map<int, std::string>>& data );
};
#endif // STORE_H