Improvements

Added new Configs related methods: 'readConfigs', 'writeConfigs',
'geometryToString', 'geometryFromString', 'list2string', 'string2list'
and 'updateUiLanguage'.
Added new Database configs related methods.
Code improvements.
This commit is contained in:
Valentino Orlandi 2022-08-09 21:45:58 +02:00
parent 2a29461672
commit b09d058be4
Signed by: elB4RTO
GPG Key ID: 1719E976DB2D4E71
2 changed files with 324 additions and 17 deletions

View File

@ -90,9 +90,9 @@ MainWindow::MainWindow( QWidget *parent )
////////////////////////
//// INITIALIZATION ////
// sqlite databases paths
this->db_stats_path = "collection.db";//"~/.craplog/collection.db"; !!! RESTORE
this->db_hashes_path = "hashes.db";//"~/.craplog/hashes.db"; !!! RESTORE
this->crapview.setDbPath( this->db_stats_path );
this->db_data_path = "collection.db";//"~/.craplog/collection.db"; !!! RESTORE !!!
this->db_hashes_path = "hashes.db";//"~/.craplog/hashes.db"; !!! RESTORE !!!
this->crapview.setDbPath( this->db_data_path );
// WebServers for the LogsList
this->allowed_web_servers.emplace( this->APACHE_ID, true );
this->allowed_web_servers.emplace( this->NGINX_ID, true );
@ -101,9 +101,10 @@ MainWindow::MainWindow( QWidget *parent )
/////////////////
//// CONFIGS ////
this->craplog.setDialogLevel( 1 ); // !!! REPLACE WITH CONFIGURATION VALUE !!!
// set user-definet tabs indexes => this->ui->StatsTabs->widget( 0 );
this->readConfigs():
if ( this->language != "en" ) {
this->updateUiLanguage();
}
///////////////////
@ -296,6 +297,7 @@ MainWindow::~MainWindow()
void MainWindow::closeEvent (QCloseEvent *event)
{
// save actual configurations
this->writeConfigs();
// save tabs positions => this->ui->CrapTabs->tabText( 0 );
// => this->ui->CrapTabs->tabText( 0 );
@ -304,8 +306,202 @@ void MainWindow::closeEvent (QCloseEvent *event)
}
////////////////////////
//// CONFIGURATIONS ////
////////////////////////
void MainWindow::readConfigs()
{
}
void MainWindow::writeConfigs()
{
bool proceed = true;
// check the file first
if ( IOutils::exists( this->configs_path ) == true ) {
if ( IOutils::checkFile( this->configs_path ) == true ) {
if ( IOutils::checkFile( this->configs_path, false, true ) == false ) {
// file not writable
proceed = false;
// !!! PUT A DIALOG MESSAGE HERE !!!
}
} else {
// the given path desn't point to a file
proceed = false;
// !!! PUT A DIALOG MESSAGE HERE !!!
}
} else {
// file does not exists, check if at least the folder exists
int index;
if ( this->OS == 1 ) {
index = this->configs_path.find_last_of( '/' );
} else {
index = this->configs_path.find_last_of( '\\' );
}
if ( index < 0 || index >= this->configs_path.size() ) {
// not a valid path
proceed = false;
// !!! PUT A DIALOG MESSAGE HERE !!!
}
std::string base_path = this->configs_path.substr( 0, index );
if ( IOutils::exists( this->configs_path ) == true ) {
if ( IOutils::checkDir( base_path ) == true ) {
if ( IOutils::checkDir( base_path, false, true ) == false ) {
// directory not writable
proceed = false;
// !!! PUT A DIALOG MESSAGE HERE !!!
}
} else {
// not a directory
proceed = false;
// !!! PUT A DIALOG MESSAGE HERE !!!
}
} else {
// the given path does not exist
proceed = false;
// !!! PUT A DIALOG MESSAGE HERE !!!
}
}
if ( proceed == true ) {
//// USER INTERFACE ////
std::string configs = "[UI]";
configs += "\nLanguage=" + this->language;
configs += "\nRememberGeometry=" + this->b2s.at( this->remember_window );
configs += "\nGeometry=" + this->geometryToString();
configs += "\nWindowTheme=" + std::to_string( this->window_theme_id );
configs += "\nChartsTheme=" + std::to_string( this->charts_theme_id );
configs += "\nMainDialogLevel=" + std::to_string( this->dialogs_Level );
configs += "\nDatabaseDataPath=" + this->db_data_path;
configs += "\nDatabaseHashesPath=" + this->db_hashes_path;
//// TEXT BROWSER ////
configs += "\n\n[TextBrowser]";
configs += "\nFont=" + std::to_string( this->ui->box_ConfTextBrowser_Font->currentIndex() );
configs += "\nWideLines=" + this->b2s.at( this->TB.getWideLinesUsage() );
configs += "\nColorScheme=" + std::to_string( this->TB.getColorSchemeID() );
//// CRAPLOG ////
configs += "\n\n[Craplog]";
configs += "\nCraplogDialogLevel=" + std::to_string( this->craplog.getDialogsLevel() );
configs += "\nHideUsedFiles=" + this->b2s.at( this->hide_used_files );
configs += "\nWarningSize=" + std::to_string( this->craplog.getWarningSize() );
//// APACHE2 ////
configs += "\n\n[Apache2]";
configs += "\nApacheLogsPath=" + this->craplog.getLogsPath( this->APACHE_ID );
configs += "\nApacheLogsFormat=" + this->craplog.getLogsFormatString( this->APACHE_ID );
configs += "\nApacheWarnlistMethod=" + this->list2string( this->craplog.getWarnlist( this->APACHE_ID, 11 ) );
configs += "\nApacheWarnlistURI=" + this->list2string( this->craplog.getWarnlist( this->APACHE_ID, 12 ) );
configs += "\nApacheWarnlistClient=" + this->list2string( this->craplog.getWarnlist( this->APACHE_ID, 20 ) );
configs += "\nApacheWarnlistUserAgent=" + this->list2string( this->craplog.getWarnlist( this->APACHE_ID, 21 ), true );
configs += "\nApacheBlacklistClient=" + this->list2string( this->craplog.getBlacklist( this->APACHE_ID, 20 ) );
//// NGINX ////
configs += "\n\n[Nginx]";
configs += "\nNginxLogsPath=" + this->craplog.getLogsPath( this->NGINX_ID );
configs += "\nNginxLogsFormat=" + this->craplog.getLogsFormatString( this->NGINX_ID );
configs += "\nNginxWarnlistMethod=" + this->list2string( this->craplog.getWarnlist( this->NGINX_ID, 11 ) );
configs += "\nNginxWarnlistURI=" + this->list2string( this->craplog.getWarnlist( this->NGINX_ID, 12 ) );
configs += "\nNginxWarnlistClient=" + this->list2string( this->craplog.getWarnlist( this->NGINX_ID, 20 ) );
configs += "\nNginxWarnlistUserAgent=" + this->list2string( this->craplog.getWarnlist( this->NGINX_ID, 21 ), true );
configs += "\nNginxBlacklistClient=" + this->list2string( this->craplog.getBlacklist( this->NGINX_ID, 20 ) );
//// IIS ////
configs += "\n\n[IIS]";
configs += "\nIisLogsPath=" + this->craplog.getLogsPath( this->IIS_ID );
configs += "\nIisLogsFormat=" + this->craplog.getLogsFormatString( this->IIS_ID );
configs += "\nIisWarnlistMethod=" + this->list2string( this->craplog.getWarnlist( this->IIS_ID, 11 ) );
configs += "\nIisWarnlistURI=" + this->list2string( this->craplog.getWarnlist( this->IIS_ID, 12 ) );
configs += "\nIisWarnlistClient=" + this->list2string( this->craplog.getWarnlist( this->IIS_ID, 20 ) );
configs += "\nIisWarnlistUserAgent=" + this->list2string( this->craplog.getWarnlist( this->IIS_ID, 21 ), true );
configs += "\nIisBlacklistClient=" + this->list2string( this->craplog.getBlacklist( this->IIS_ID, 20 ) );
//// CRAPVIEW ////
configs += "\n\n[Crapview]";
configs += "\nCrapviewDialogLevel=" + std::to_string( this->crapview.getDialogsLevel() );
// write on file
try {
IOutils::writeOnFile( this->configs_path, configs );
} catch (const std::ios_base::failure& err) {
// failed writing
// !!! PUT A DIALOG MESSAGE HERE !!!
} catch (...) {
// something failed
// !!! PUT A DIALOG MESSAGE HERE !!!
}
}
}
const std::string MainWindow::geometryToString()
{
QRect geometry = this->geometry();
std::string string = "";
string += std::to_string( geometry.x() );
string += ",";
string += std::to_string( geometry.y() );
string += ",";
string += std::to_string( geometry.width() );
string += ",";
string += std::to_string( geometry.height() );
string += ",";
string += this->b2s.at( this->isMaximized() );
return string;
}
void MainWindow::geometryFromString( const std::string& geometry )
{
std::vector<std::string> aux;
StringOps::splitrip( aux, geometry, "," );
QRect new_geometry;
new_geometry.setRect( std::stoi(aux.at(0)), std::stoi(aux.at(1)), std::stoi(aux.at(2)), std::stoi(aux.at(3)) );
this->setGeometry( new_geometry );
if ( aux.at(4) == "true" ) {
this->showMaximized();
}
}
const std::string MainWindow::list2string( const std::vector<std::string>& list, const bool& user_agent )
{
int i, max=list.size()-1;
std::string string;
if ( user_agent == true ) {
for ( const std::string& str : list ) {
string += StringOps::replace( str, " ", "%@#" );
if ( i < max ) {
string.push_back( ' ' );
i++;
}
}
} else {
for ( const std::string& str : list ) {
string += str;
if ( i < max ) {
string.push_back( ' ' );
i++;
}
}
}
return string;
}
const std::vector<std::string> MainWindow::string2list( const std::string& string, const bool& user_agent )
{
std::vector<std::string> list, aux;
StringOps::splitrip( aux, string, " " );
if ( user_agent == true ) {
for ( const std::string& str : list ) {
list.push_back( StringOps::replace( str, " ", "%@#" ) );
}
} else {
for ( const std::string& str : list ) {
list.push_back( str );
}
}
return list;
}
//////////////////////////
//// INTEGRITY CHECKS ////
//////////////////////////
void MainWindow::wait_ActiveWindow()
{
if ( this->isActiveWindow() == false ) {
@ -327,11 +523,11 @@ void MainWindow::makeInitialChecks()
if ( ok == true ) {
// statistics' database
if ( CheckSec::checkStatsDatabase( this->db_stats_path ) == false ) {
if ( CheckSec::checkStatsDatabase( this->db_data_path ) == false ) {
// checks failed, abort
ok = false;
} else {
this->craplog.setStatsDatabasePath( this->db_stats_path );
this->craplog.setStatsDatabasePath( this->db_data_path );
// used-files' hashes' database
if ( CheckSec::checkHashesDatabase( this->db_hashes_path ) == false ) {
// checks failed, abort
@ -463,6 +659,15 @@ const QString MainWindow::printableTime( const int& secs_ )
}
//////////////////
//// LANGUAGE ////
//////////////////
void updateUiLanguage()
{
}
//////////////
//// LOGS ////
//////////////
@ -1640,7 +1845,7 @@ void MainWindow::on_box_ConfTextBrowser_Font_currentIndexChanged(int index)
font = this->FONTS.at( "script" );
break;
default:
throw ("Unexpected Font index: "[index]);
throw GenericException( "Unexpected Font index: "+std::to_string(index) );
}
this->TB.setFont( font );
this->TB.setFontFamily( this->ui->box_ConfTextBrowser_Font->currentText() );
@ -1744,6 +1949,71 @@ void MainWindow::refreshChartsPreview()
}
///////////////////
//// DATABASES ////
// data collection
void MainWindow::on_inLine_ConfDatabases_Data_Path_textChanged(const QString &arg1)
{
std::string path = StringOps::strip( arg1.toStdString() );
if ( IOutils::checkDir( path ) == true ) {
this->ui->icon_ConfDatabases_Data_Wrong->setVisible( false );
this->ui->button_ConfDatabases_Data_Save->setEnabled( true );
} else {
this->ui->icon_ConfDatabases_Data_Wrong->setVisible( true );
this->ui->button_ConfDatabases_Data_Save->setEnabled( false );
}
this->ui->inLine_ConfDatabases_Data_Path->setText( QString::fromStdString( path ) );
}
void MainWindow::on_inLine_ConfDatabases_Data_Path_returnPressed()
{
this->on_button_ConfDatabases_Data_Save_clicked();
}
void MainWindow::on_button_ConfDatabases_Data_Save_clicked()
{
if ( this->ui->icon_ConfDatabases_Data_Wrong->isVisible() == false ) {
// set the paths
std::string path = StringOps::strip( this->ui->inLine_ConfDatabases_Data_Path->text().toStdString() );
if ( StringOps::endsWith( path, "/" ) ) {
path = StringOps::rstrip( path, "/" );
}
this->db_data_path = path;
this->craplog.setStatsDatabasePath( this->db_data_path );
}
this->ui->button_ConfDatabases_Data_Save->setEnabled( false );
}
// usef files hashes
void MainWindow::on_inLine_ConfDatabases_Hashes_Path_textChanged(const QString &arg1)
{
std::string path = StringOps::strip( arg1.toStdString() );
if ( IOutils::checkDir( path ) == true ) {
this->ui->icon_ConfDatabases_Hashes_Wrong->setVisible( false );
this->ui->button_ConfDatabases_Hashes_Save->setEnabled( true );
} else {
this->ui->icon_ConfDatabases_Hashes_Wrong->setVisible( true );
this->ui->button_ConfDatabases_Hashes_Save->setEnabled( false );
}
this->ui->inLine_ConfDatabases_Hashes_Path->setText( QString::fromStdString( path ) );
}
void MainWindow::on_inLine_ConfDatabases_Hashes_Path_returnPressed()
{
this->on_button_ConfDatabases_Hashes_Save_clicked();
}
void MainWindow::on_button_ConfDatabases_Hashes_Save_clicked()
{
if ( this->ui->icon_ConfDatabases_Hashes_Wrong->isVisible() == false ) {
// set the paths
std::string path = StringOps::strip( this->ui->inLine_ConfDatabases_Hashes_Path->text().toStdString() );
if ( StringOps::endsWith( path, "/" ) ) {
path = StringOps::rstrip( path, "/" );
}
this->db_hashes_path = path;
this->craplog.setHashesDatabasePath( this->db_hashes_path );
}
this->ui->button_ConfDatabases_Hashes_Save->setEnabled( false );
}
//////////////
//// LOGS ////
//////////////
@ -2785,4 +3055,3 @@ void MainWindow::on_button_ConfIis_Blacklist_Down_clicked()
}

View File

@ -142,7 +142,7 @@ private slots:
void on_button_StatsDay_Draw_clicked();
//// RELATIONSL ////
//// RELATIONAL ////
void on_box_StatsRelat_WebServer_currentIndexChanged(int index);
@ -375,15 +375,52 @@ private slots:
void on_button_ConfIis_Blacklist_Down_clicked();
void on_inLine_ConfDatabases_Data_Path_textChanged(const QString &arg1);
void on_inLine_ConfDatabases_Data_Path_returnPressed();
void on_button_ConfDatabases_Data_Save_clicked();
void on_inLine_ConfDatabases_Hashes_Path_textChanged(const QString &arg1);
void on_inLine_ConfDatabases_Hashes_Path_returnPressed();
void on_button_ConfDatabases_Hashes_Save_clicked();
private:
Ui::MainWindow *ui;
// quantoty of informational dialogs to display
int dialogs_Level = 1; // 0: essential, 1: usefull, 2: explanatory
// web servers ID constants
const unsigned int APACHE_ID=11, NGINX_ID=12, IIS_ID=13;
// operating system
// 1: unix, 2:windows
unsigned int OS;
////////////////////////
//// CONFIGURATIONS ////
////////////////////////
std::string configs_path;
void readConfigs();
void writeConfigs();
// string to bool and vice versa
const std::unordered_map<std::string, bool> s2b = { {"true",true}, {"false",false} };
const std::unordered_map<bool, std::string> b2s = { {true,"true"}, {false,"false"} };
// language
std::string language = "en";
void updateUiLanguage();
// window geometry
const std::string geometryToString();
void geometryFromString( const std::string& geometry );
// quantoty of informational dialogs to display
int dialogs_Level = 1; // 0: essential, 1: usefull, 2: explanatory
// list to string and vice versa
const std::string list2string( const std::vector<std::string>& list, const bool& user_agent=false );
const std::vector<std::string> string2list( const std::string& string, const bool& user_agent=false );
////////////////
//// CHECKS ////
void makeInitialChecks();
//////////////////
@ -422,9 +459,10 @@ private:
printableSpeed( const int& bytes, const int& secs ),
printableTime( const int& seconds );
//////////////////
//// DATABASE ////
std::string db_stats_path,
///////////////////
//// DATABASES ////
///////////////////
std::string db_data_path,
db_hashes_path;