Improvements

Code improvements.
Added new method: 'sanitizeBWitem' to check a string before adding it to
the relative warn/black list.
This commit is contained in:
Valentino Orlandi 2022-10-10 21:10:58 +02:00
parent f5a39ca3fa
commit 837f896c55
Signed by: elB4RTO
GPG key ID: 1719E976DB2D4E71
2 changed files with 76 additions and 22 deletions

View file

@ -12,6 +12,7 @@
#include "modules/craplog/modules/donuts.h" #include "modules/craplog/modules/donuts.h"
#include "modules/craplog/modules/store.h" #include "modules/craplog/modules/store.h"
#include <QUrl>
#include <QPainter> #include <QPainter>
#include <filesystem> #include <filesystem>
@ -152,24 +153,26 @@ void Craplog::setBlacklist( const int& web_server_id, const int& log_field_id, c
{ {
this->blacklists.at( web_server_id ).at( log_field_id ).list.clear(); this->blacklists.at( web_server_id ).at( log_field_id ).list.clear();
for ( const std::string& item : new_list ) { for ( const std::string& item : new_list ) {
this->blacklists.at( web_server_id ).at( log_field_id ).list.push_back( item ); this->blacklistAdd( web_server_id, log_field_id, item );
} }
} }
void Craplog::setWarnlist( const int& web_server_id, const int& log_field_id, const std::vector<std::string>& new_list ) void Craplog::setWarnlist( const int& web_server_id, const int& log_field_id, const std::vector<std::string>& new_list )
{ {
this->warnlists.at( web_server_id ).at( log_field_id ).list.clear(); this->warnlists.at( web_server_id ).at( log_field_id ).list.clear();
for ( const std::string& item : new_list ) { for ( const std::string& item : new_list ) {
this->warnlists.at( web_server_id ).at( log_field_id ).list.push_back( item ); this->warnlistAdd( web_server_id, log_field_id, item );
} }
} }
void Craplog::blacklistAdd( const int& web_server_id, const int& log_field_id, const std::string& new_item ) void Craplog::blacklistAdd( const int& web_server_id, const int& log_field_id, const std::string& new_item )
{ {
this->blacklists.at( web_server_id ).at( log_field_id ).list.push_back( new_item ); this->blacklists.at( web_server_id ).at( log_field_id ).list.push_back(
this->sanitizeBWitem( log_field_id, new_item ) );
} }
void Craplog::warnlistAdd( const int& web_server_id, const int& log_field_id, const std::string& new_item ) void Craplog::warnlistAdd( const int& web_server_id, const int& log_field_id, const std::string& new_item )
{ {
this->warnlists.at( web_server_id ).at( log_field_id ).list.push_back( new_item ); this->warnlists.at( web_server_id ).at( log_field_id ).list.push_back(
this->sanitizeBWitem( log_field_id, new_item ) );
} }
void Craplog::blacklistRemove( const int& web_server_id, const int& log_field_id, const std::string& item ) void Craplog::blacklistRemove( const int& web_server_id, const int& log_field_id, const std::string& item )
@ -197,7 +200,7 @@ void Craplog::warnlistRemove( const int& web_server_id, const int& log_field_id,
list.pop_back(); list.pop_back();
} }
int Craplog::blacklistMoveUp( const int& web_server_id, const int& log_field_id, const std::string& item ) const int Craplog::blacklistMoveUp( const int& web_server_id, const int& log_field_id, const std::string& item )
{ {
int i; int i;
auto& list = this->blacklists.at( web_server_id ).at( log_field_id ).list; auto& list = this->blacklists.at( web_server_id ).at( log_field_id ).list;
@ -211,7 +214,7 @@ int Craplog::blacklistMoveUp( const int& web_server_id, const int& log_field_id,
} }
return i; return i;
} }
int Craplog::warnlistMoveUp( const int& web_server_id, const int& log_field_id, const std::string& item ) const int Craplog::warnlistMoveUp( const int& web_server_id, const int& log_field_id, const std::string& item )
{ {
int i; int i;
auto& list = this->warnlists.at( web_server_id ).at( log_field_id ).list; auto& list = this->warnlists.at( web_server_id ).at( log_field_id ).list;
@ -226,7 +229,7 @@ int Craplog::warnlistMoveUp( const int& web_server_id, const int& log_field_id,
return i; return i;
} }
int Craplog::blacklistMoveDown( const int& web_server_id, const int& log_field_id, const std::string& item ) const int Craplog::blacklistMoveDown( const int& web_server_id, const int& log_field_id, const std::string& item )
{ {
int i; int i;
auto& list = this->blacklists.at( web_server_id ).at( log_field_id ).list; auto& list = this->blacklists.at( web_server_id ).at( log_field_id ).list;
@ -240,7 +243,7 @@ int Craplog::blacklistMoveDown( const int& web_server_id, const int& log_field_i
} }
return i; return i;
} }
int Craplog::warnlistMoveDown( const int& web_server_id, const int& log_field_id, const std::string& item ) const int Craplog::warnlistMoveDown( const int& web_server_id, const int& log_field_id, const std::string& item )
{ {
int i; int i;
auto& list = this->warnlists.at( web_server_id ).at( log_field_id ).list; auto& list = this->warnlists.at( web_server_id ).at( log_field_id ).list;
@ -255,6 +258,41 @@ int Craplog::warnlistMoveDown( const int& web_server_id, const int& log_field_id
return i; return i;
} }
const std::string Craplog::sanitizeBWitem( const int& log_field_id, const std::string& new_item )
{
std::string sanitized_item;
switch ( log_field_id ) {
case 11:
sanitized_item = StringOps::strip( new_item );
if ( ! StringOps::isAlphabetic( sanitized_item ) ) {
// only letters allowed
throw BWlistException("Invalid Method");
}
sanitized_item = StringOps::toUpper( new_item );
break;
case 12:
sanitized_item = QUrl::toPercentEncoding(
QString::fromStdString( new_item ),
"/#&?=+").toStdString();
break;
case 20:
sanitized_item = StringOps::strip( new_item );
if ( ! StringOps::isIP( sanitized_item ) ) {
// only IPv4/IPv6 allowed
throw BWlistException("Invalid Client");
}
break;
case 21:
sanitized_item = StringOps::replace( new_item, "\"", "\\\"" );
break;
default:
// shouldn't be here
throw GenericException("Unexpected LogField ID: "+std::to_string(log_field_id));
break;
}
return sanitized_item;
}
///////////////// /////////////////
//// FORMATS //// //// FORMATS ////
@ -271,45 +309,57 @@ const FormatOps::LogsFormat& Craplog::getLogsFormat(const int& web_server_id )
} }
// set the logs format // set the logs format
void Craplog::setApacheLogFormat( const std::string& format_string ) const bool Craplog::setApacheLogFormat( const std::string& format_string )
{ {
// apache // apache
bool success = true;
try { try {
this->logs_formats.at( this->APACHE_ID ) = this->logs_formats.at( this->APACHE_ID ) =
this->formatOps.processApacheFormatString( format_string ); this->formatOps.processApacheFormatString( format_string );
this->logs_format_strings.at( this->APACHE_ID ) = format_string; this->logs_format_strings.at( this->APACHE_ID ) = format_string;
} catch ( LogFormatException& e ) { } catch ( LogFormatException& e ) {
success = false;
DialogSec::errInvalidLogFormatString( e.what() ); DialogSec::errInvalidLogFormatString( e.what() );
} catch (...) { } catch (...) {
success = false;
DialogSec::errGeneric( DialogSec::tr("An error occured while parsing the format string"), true ); DialogSec::errGeneric( DialogSec::tr("An error occured while parsing the format string"), true );
} }
return success;
} }
void Craplog::setNginxLogFormat( const std::string& format_string ) const bool Craplog::setNginxLogFormat( const std::string& format_string )
{ {
// nginx // nginx
bool success = true;
try { try {
this->logs_formats.at( this->NGINX_ID ) = this->logs_formats.at( this->NGINX_ID ) =
this->formatOps.processNginxFormatString( format_string ); this->formatOps.processNginxFormatString( format_string );
this->logs_format_strings.at( this->NGINX_ID ) = format_string; this->logs_format_strings.at( this->NGINX_ID ) = format_string;
} catch ( LogFormatException& e ) { } catch ( LogFormatException& e ) {
success = false;
DialogSec::errInvalidLogFormatString( e.what() ); DialogSec::errInvalidLogFormatString( e.what() );
} catch (...) { } catch (...) {
success = false;
DialogSec::errGeneric( DialogSec::tr("An error occured while parsing the format string"), true ); DialogSec::errGeneric( DialogSec::tr("An error occured while parsing the format string"), true );
} }
return success;
} }
void Craplog::setIisLogFormat( const std::string& format_string, const int& log_module ) const bool Craplog::setIisLogFormat( const std::string& format_string, const int& log_module )
{ {
// iis // iis
bool success = true;
try { try {
this->logs_formats.at( this->IIS_ID ) = this->logs_formats.at( this->IIS_ID ) =
this->formatOps.processIisFormatString( format_string, log_module ); this->formatOps.processIisFormatString( format_string, log_module );
this->logs_format_strings.at( this->IIS_ID ) = format_string; this->logs_format_strings.at( this->IIS_ID ) = format_string;
this->changeIisLogsBaseNames( log_module ); this->changeIisLogsBaseNames( log_module );
} catch ( LogFormatException& e ) { } catch ( LogFormatException& e ) {
success = false;
DialogSec::errInvalidLogFormatString( e.what() ); DialogSec::errInvalidLogFormatString( e.what() );
} catch (...) { } catch (...) {
success = false;
DialogSec::errGeneric( DialogSec::tr("An error occured while parsing the format string"), true ); DialogSec::errGeneric( DialogSec::tr("An error occured while parsing the format string"), true );
} }
return success;
} }
const QString Craplog::getLogsFormatSample( const int& web_server_id ) const QString Craplog::getLogsFormatSample( const int& web_server_id )
@ -466,7 +516,7 @@ void Craplog::scanLogsDir()
// read 32 random lines // read 32 random lines
IOutils::randomLines( path, content, 32 ); IOutils::randomLines( path, content, 32 );
} catch (GenericException& e) { } catch ( GenericException& e ) {
// failed closing gzip file pointer // failed closing gzip file pointer
DialogSec::errGeneric( e.what() ); DialogSec::errGeneric( e.what() );
continue; continue;
@ -499,7 +549,7 @@ void Craplog::scanLogsDir()
std::string hash; std::string hash;
try { try {
hash = this->hashOps.digestFile( path ); hash = this->hashOps.digestFile( path );
} catch (GenericException& e) { } catch ( GenericException& e ) {
// failed to digest // failed to digest
DialogSec::errGeneric( e.what() ); DialogSec::errGeneric( e.what() );
continue; continue;
@ -742,7 +792,7 @@ void Craplog::run()
this->used_files_hashes.clear(); this->used_files_hashes.clear();
// only catch generic, leave others un-catched // only catch generic, leave others un-catched
} catch (GenericException& e) { } catch ( GenericException& e ) {
DialogSec::errGeneric( e.what() ); DialogSec::errGeneric( e.what() );
this->proceed = false;; this->proceed = false;;
} }
@ -871,7 +921,7 @@ void Craplog::joinLogLines()
// try as gzip compressed archive first // try as gzip compressed archive first
GZutils::readFile( file.path, aux ); GZutils::readFile( file.path, aux );
} catch (const GenericException& e) { } catch ( const GenericException& e ) {
// failed closing file pointer // failed closing file pointer
throw e; throw e;
@ -888,7 +938,7 @@ void Craplog::joinLogLines()
} }
// re-catched in run() // re-catched in run()
} catch (const GenericException) { } catch ( const GenericException ) {
// failed closing gzip file pointer // failed closing gzip file pointer
throw GenericException( QString("%1:\n%2").arg( throw GenericException( QString("%1:\n%2").arg(
DialogSec::tr("An error accured while reading the gzipped file"), DialogSec::tr("An error accured while reading the gzipped file"),

View file

@ -29,9 +29,10 @@ public:
setHashesDatabasePath( const std::string& path ); setHashesDatabasePath( const std::string& path );
// logs formats web server specific settings // logs formats web server specific settings
void setApacheLogFormat( const std::string& format_string ); const bool
void setNginxLogFormat( const std::string& format_string ); setApacheLogFormat( const std::string& format_string ),
void setIisLogFormat( const std::string& format_string, const int& log_module ); setNginxLogFormat( const std::string& format_string ),
setIisLogFormat( const std::string& format_string, const int& log_module );
const std::string& getLogsFormatString( const int& web_server_id ); const std::string& getLogsFormatString( const int& web_server_id );
const FormatOps::LogsFormat& getLogsFormat( const int& web_server_id ); const FormatOps::LogsFormat& getLogsFormat( const int& web_server_id );
const QString getLogsFormatSample( const int& web_server_id ); const QString getLogsFormatSample( const int& web_server_id );
@ -78,8 +79,9 @@ public:
bool used; bool used;
std::vector<std::string> list; std::vector<std::string> list;
}; };
const bool& isBlacklistUsed( const int& web_server_id, const int& log_field_id ), const bool
& isWarnlistUsed( const int& web_server_id, const int& log_field_id ); &isBlacklistUsed( const int& web_server_id, const int& log_field_id ),
&isWarnlistUsed( const int& web_server_id, const int& log_field_id );
void setBlacklistUsed( const int& web_server_id, const int& log_field_id, const bool& used ), void setBlacklistUsed( const int& web_server_id, const int& log_field_id, const bool& used ),
setWarnlistUsed( const int& web_server_id, const int& log_field_id, const bool& used ); setWarnlistUsed( const int& web_server_id, const int& log_field_id, const bool& used );
const std::vector<std::string> const std::vector<std::string>
@ -91,10 +93,12 @@ public:
warnlistAdd( const int& web_server_id, const int& log_field_id, const std::string& new_item ), warnlistAdd( const int& web_server_id, const int& log_field_id, const std::string& new_item ),
blacklistRemove( const int& web_server_id, const int& log_field_id, const std::string& new_item ), blacklistRemove( const int& web_server_id, const int& log_field_id, const std::string& new_item ),
warnlistRemove( const int& web_server_id, const int& log_field_id, const std::string& item ); warnlistRemove( const int& web_server_id, const int& log_field_id, const std::string& item );
int blacklistMoveUp( const int& web_server_id, const int& log_field_id, const std::string& item ), const int
blacklistMoveUp( const int& web_server_id, const int& log_field_id, const std::string& item ),
warnlistMoveUp( const int& web_server_id, const int& log_field_id, const std::string& item ), warnlistMoveUp( const int& web_server_id, const int& log_field_id, const std::string& item ),
blacklistMoveDown( const int& web_server_id, const int& log_field_id, const std::string& item ), blacklistMoveDown( const int& web_server_id, const int& log_field_id, const std::string& item ),
warnlistMoveDown( const int& web_server_id, const int& log_field_id, const std::string& item ); warnlistMoveDown( const int& web_server_id, const int& log_field_id, const std::string& item );
const std::string sanitizeBWitem( const int& log_field_id, const std::string& new_item );
// job related // job related
const bool& editedDatabase(); const bool& editedDatabase();