From 5696968f2577a3c2e4c2646d735bdcb9dc191d8f Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Sat, 3 Feb 2018 22:16:00 -0500 Subject: [PATCH 1/2] Working on improving the validator --- install/database-validation.php | 393 +++++++++++++++++++------------- 1 file changed, 235 insertions(+), 158 deletions(-) diff --git a/install/database-validation.php b/install/database-validation.php index cce19ef6..8f47a9c9 100644 --- a/install/database-validation.php +++ b/install/database-validation.php @@ -5,6 +5,59 @@ require(HESK_PATH . 'install/install_functions.inc.php'); require(HESK_PATH . 'hesk_settings.inc.php'); hesk_dbConnect(); + +/* +We have four possible validation scenarios: + +1. Fresh install - the user has never installed Mods for HESK before. Nothing to validate. +2. Installed a really old version - we don't have a previous version to start from. +3. Installed a recent version, but before migrations began - just pull the version # and use the dictionary below. +4. Migration number present in the settings table. Take that number and run with it. + */ + +$tableSql = hesk_dbQuery("SHOW TABLES LIKE '" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings'"); +$startingValidationNumber = 1; +if (hesk_dbNumRows($tableSql) > 0) { + // They have installed at LEAST to version 1.6.0. Just pull the version number OR migration number + $migrationNumberSql = hesk_dbQuery("SELECT `Value` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` WHERE `Key` = 'migrationNumber'"); + if ($migrationRow = hesk_dbFetchAssoc($migrationNumberSql)) { + $startingValidationNumber = intval($migrationRow['Value']) + 1; + } else { + $versionSql = hesk_dbQuery("SELECT `Value` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` WHERE `Key` = 'modsForHeskVersion'"); + $versionRow = hesk_dbFetchAssoc($versionSql); + + $migration_map = array( + // Pre-1.4.0 to 1.5.0 did not have a settings table + '1.6.0' => 22, '1.6.1' => 23, '1.7.0' => 27, '2.0.0' => 37, '2.0.1' => 38, '2.1.0' => 39, '2.1.1' => 42, + '2.2.0' => 47, '2.2.1' => 48, '2.3.0' => 68, '2.3.1' => 69, '2.3.2' => 70, '2.4.0' => 86, '2.4.1' => 87, + '2.4.2' => 88, '2.5.0' => 98, '2.5.1' => 99, '2.5.2' => 100, '2.5.3' => 101, '2.5.4' => 102, '2.5.5' => 103, + '2.6.0' => 121, '2.6.1' => 122, '2.6.2' => 125, '2.6.3' => 126, '2.6.4' => 127, '3.0.0 beta 1' => 130, + '3.0.0 RC 1' => 131, '3.0.0' => 132, '3.0.1' => 133, '3.0.2' => 135, '3.0.3' => 136, '3.0.4' => 137, + '3.0.5' => 138, '3.0.6' => 139, '3.0.7' => 140, '3.1.0' => 153, '3.1.1' => 154 + ); + $startingValidationNumber = $migration_map[$versionRow['Value']]; + } +} else { + // migration # => sql for checking + $versionChecks = array( + // 1.5.0 -> users.active + 14 => "SHOW COLUMNS FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "users` LIKE 'active'", + // 1.4.1 -> denied_emails + 11 => "SHOW TABLES LIKE '" . hesk_dbEscape($hesk_settings['db_pfix']) . "denied_emails'", + // 1.4.0 -> denied ips + 9 => "SHOW TABLES LIKE '" . hesk_dbEscape($hesk_settings['db_pfix']) . "denied_ips'", + // Pre-1.4.0 but still something -> statuses + 7 => "SHOW TABLES LIKE '" . hesk_dbEscape($hesk_settings['db_pfix']) . "statuses'" + ); + + foreach ($versionChecks as $migrationNumber => $sql) { + $rs = hesk_dbQuery($sql); + if (hesk_dbNumRows($rs) > 0) { + $startingValidationNumber = $migrationNumber; + break; + } + } +} ?> @@ -61,155 +114,157 @@ hesk_dbConnect(); $('#all-good').show()"; } else { echo ""; @@ -222,36 +277,50 @@ hesk_dbConnect(); 0; + if ($startingValidationNumber < $minimumValidationNumber) { + $checks = 'SKIPPED'; + } else { + $res = run_check("SELECT 1 FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` WHERE `Key` = '{$setting_name}'"); + $checks = hesk_dbNumRows($res) > 0; + } - output_result('Setting Exists: ' . $setting_name, $all_good); + output_result('Setting Exists: ' . $setting_name, $checks); - return $all_good !== false; + return $checks !== false; } -function run_table_check($table_name) { - return run_column_check($table_name, '1'); +function run_table_check($table_name, $minimumValidationNumber) { + + return run_column_check($table_name, '1', $minimumValidationNumber); } -function run_column_check($table_name, $column_name) { - global $hesk_settings; +function run_column_check($table_name, $column_name, $minimumValidationNumber) { + global $hesk_settings, $startingValidationNumber; if ($column_name == '1') { - $all_good = run_check('SELECT ' . $column_name . ' FROM `' . $hesk_settings['db_pfix'] . $table_name . '` LIMIT 1'); + if ($startingValidationNumber < $minimumValidationNumber) { + $checks = 'SKIPPED'; + } else { + $checks = run_check('SELECT ' . $column_name . ' FROM `' . $hesk_settings['db_pfix'] . $table_name . '` LIMIT 1'); + } output_result('Table Exists: ' . $table_name, - $all_good); + $checks); } else { - $all_good = run_check('SELECT `' . $column_name . '` FROM `' . $hesk_settings['db_pfix'] . $table_name . '` LIMIT 1'); + if ($startingValidationNumber < $minimumValidationNumber) { + $checks = 'SKIPPED'; + } else { + $checks = run_check('SELECT `' . $column_name . '` FROM `' . $hesk_settings['db_pfix'] . $table_name . '` LIMIT 1'); + } + output_result('Column Exists: ' . $table_name . '.' . $column_name, - $all_good); + $checks); } - return $all_good !== false; + return $checks !== false; } function run_check($sql) { @@ -263,23 +332,31 @@ function run_check($sql) { } $hesk_last_query = $sql; - return @mysqli_query($hesk_db_link, $sql); + return @mysqli_query($hesk_db_link, $sql) ? 'PASS' : 'FAIL'; } else { if (!$hesk_db_link && !hesk_dbConnect()) { return false; } $hesk_last_query = $sql; - return $res = @mysql_query($sql, $hesk_db_link); + return $res = @mysql_query($sql, $hesk_db_link) ? 'PASS' : 'FAIL'; } } -function output_result($change_title, $success) { - $css_color = 'success'; - $text = ' Success'; - if (!$success) { - $css_color = 'danger'; - $text = ' Failure'; +function output_result($change_title, $status) { + switch ($status) { + case 'PASS': + $css_color = 'success'; + $text = ' Success'; + break; + case 'FAIL': + $css_color = 'danger'; + $text = ' Failure'; + break; + case 'SKIPPED': + $css_color = 'default'; + $text = ' Skipped'; + break; } $formatted_text = sprintf('%s%s', $change_title, $css_color, $text); From 22ecc4804efe51bd3f188d5384579603bbc3a4e6 Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Sun, 4 Feb 2018 21:16:18 -0500 Subject: [PATCH 2/2] Improve the validator --- install/database-validation.php | 158 +++++++++++++++++++++----------- install/index.php | 2 +- 2 files changed, 105 insertions(+), 55 deletions(-) diff --git a/install/database-validation.php b/install/database-validation.php index 8f47a9c9..d90aa816 100644 --- a/install/database-validation.php +++ b/install/database-validation.php @@ -21,7 +21,7 @@ if (hesk_dbNumRows($tableSql) > 0) { // They have installed at LEAST to version 1.6.0. Just pull the version number OR migration number $migrationNumberSql = hesk_dbQuery("SELECT `Value` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` WHERE `Key` = 'migrationNumber'"); if ($migrationRow = hesk_dbFetchAssoc($migrationNumberSql)) { - $startingValidationNumber = intval($migrationRow['Value']) + 1; + $startingValidationNumber = intval($migrationRow['Value']); } else { $versionSql = hesk_dbQuery("SELECT `Value` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` WHERE `Key` = 'modsForHeskVersion'"); $versionRow = hesk_dbFetchAssoc($versionSql); @@ -79,12 +79,11 @@ if (hesk_dbNumRows($tableSql) > 0) {
+

Results

@@ -219,56 +226,87 @@ if (hesk_dbNumRows($tableSql) > 0) { $validations[] = run_column_check('categories', 'usage', 112); $validations[] = run_column_check('users', 'notify_overdue_unassigned', 113); $validations[] = run_column_check('users', 'default_calendar_view', 114); + $validations[] = run_setting_check('enable_calendar', 115); + $validations[] = run_setting_check('first_day_of_week', 116); + $validations[] = run_setting_check('default_calendar_view', 117); output_header_row('2.6.2'); - $validations[] = run_column_check('stage_tickets', 'due_date'); - $validations[] = run_column_check('stage_tickets', 'overdue_email_sent'); + $validations[] = run_column_check('stage_tickets', 'due_date', 122); + $validations[] = run_column_check('stage_tickets', 'overdue_email_sent', 123); output_header_row('3.1.0'); - $validations[] = run_column_check('categories', 'background_color'); - $validations[] = run_column_check('categories', 'foreground_color'); - $validations[] = run_column_check('categories', 'display_border_outline'); - $validations[] = run_column_check('logging', 'stack_trace'); - $validations[] = run_table_check('custom_nav_element'); - $validations[] = run_column_check('custom_nav_element', 'id'); - $validations[] = run_column_check('custom_nav_element', 'image_url'); - $validations[] = run_column_check('custom_nav_element', 'font_icon'); - $validations[] = run_column_check('custom_nav_element', 'place'); - $validations[] = run_column_check('custom_nav_element', 'url'); - $validations[] = run_column_check('custom_nav_element', 'sort'); - $validations[] = run_table_check('custom_nav_element_to_text'); - $validations[] = run_column_check('custom_nav_element_to_text', 'id'); - $validations[] = run_column_check('custom_nav_element_to_text', 'nav_element_id'); - $validations[] = run_column_check('custom_nav_element_to_text', 'language'); - $validations[] = run_column_check('custom_nav_element_to_text', 'text'); - $validations[] = run_column_check('custom_nav_element_to_text', 'subtext'); - $validations[] = run_setting_check('admin_navbar_background'); - $validations[] = run_setting_check('admin_navbar_background_hover'); - $validations[] = run_setting_check('admin_navbar_text'); - $validations[] = run_setting_check('admin_navbar_text_hover'); - $validations[] = run_setting_check('admin_navbar_brand_background'); - $validations[] = run_setting_check('admin_navbar_brand_background_hover'); - $validations[] = run_setting_check('admin_navbar_brand_text'); - $validations[] = run_setting_check('admin_navbar_brand_text_hover'); - $validations[] = run_setting_check('admin_sidebar_background'); - $validations[] = run_setting_check('admin_sidebar_background_hover'); - $validations[] = run_setting_check('admin_sidebar_text'); - $validations[] = run_setting_check('admin_sidebar_text_hover'); - $validations[] = run_setting_check('admin_sidebar_font_weight'); - $validations[] = run_setting_check('admin_sidebar_header_background'); - $validations[] = run_setting_check('admin_sidebar_header_text'); + $validations[] = run_column_check('logging', 'stack_trace', 140); + $validations[] = run_column_check('categories', 'background_color', 145); + $validations[] = run_column_check('categories', 'foreground_color', 143); + $validations[] = run_column_check('categories', 'display_border_outline', 144); + $validations[] = run_table_check('custom_nav_element', 141); + $validations[] = run_column_check('custom_nav_element', 'id', 141); + $validations[] = run_column_check('custom_nav_element', 'image_url', 141); + $validations[] = run_column_check('custom_nav_element', 'font_icon', 141); + $validations[] = run_column_check('custom_nav_element', 'place', 141); + $validations[] = run_column_check('custom_nav_element', 'url', 141); + $validations[] = run_column_check('custom_nav_element', 'sort', 141); + $validations[] = run_table_check('custom_nav_element_to_text', 142); + $validations[] = run_column_check('custom_nav_element_to_text', 'id', 142); + $validations[] = run_column_check('custom_nav_element_to_text', 'nav_element_id', 142); + $validations[] = run_column_check('custom_nav_element_to_text', 'language', 142); + $validations[] = run_column_check('custom_nav_element_to_text', 'text', 142); + $validations[] = run_column_check('custom_nav_element_to_text', 'subtext', 142); + $validations[] = run_setting_check('admin_navbar_background', 151); + $validations[] = run_setting_check('admin_navbar_background_hover', 151); + $validations[] = run_setting_check('admin_navbar_text', 151); + $validations[] = run_setting_check('admin_navbar_text_hover', 151); + $validations[] = run_setting_check('admin_navbar_brand_background', 151); + $validations[] = run_setting_check('admin_navbar_brand_background_hover', 151); + $validations[] = run_setting_check('admin_navbar_brand_text', 151); + $validations[] = run_setting_check('admin_navbar_brand_text_hover', 151); + $validations[] = run_setting_check('admin_sidebar_background', 151); + $validations[] = run_setting_check('admin_sidebar_background_hover', 151); + $validations[] = run_setting_check('admin_sidebar_text', 151); + $validations[] = run_setting_check('admin_sidebar_text_hover', 151); + $validations[] = run_setting_check('admin_sidebar_font_weight', 151); + $validations[] = run_setting_check('admin_sidebar_header_background', 151); + $validations[] = run_setting_check('admin_sidebar_header_text', 151); + $validations[] = run_setting_check('login_background_type', 146); + $validations[] = run_setting_check('login_background', 147); + $validations[] = run_setting_check('login_box_header', 148); + $validations[] = run_setting_check('login_box_header_image', 149); + $validations[] = run_setting_check('api_url_rewrite', 150); output_header_row('3.2.0'); - $validations[] = run_table_check('audit_trail'); - $validations[] = run_table_check('audit_trail_to_replacement_values'); - $validations[] = run_column_check('categories', 'mfh_description'); - $validations[] = run_column_check('custom_fields', 'mfh_description'); - $validations[] = run_setting_check('migrationNumber'); + $validations[] = run_table_check('audit_trail', 156); + $validations[] = run_table_check('audit_trail_to_replacement_values', 157); + $validations[] = run_column_check('categories', 'mfh_description', 154); + $validations[] = run_column_check('custom_fields', 'mfh_description', 155); + $validations[] = run_setting_check('migrationNumber', 158); output_header_row('3.3.0'); - $validations[] = run_table_check('mfh_calendar_business_hours'); + $validations[] = run_table_check('mfh_service_message_to_location', 164); + $validations[] = run_column_check('mfh_service_message_to_location', 'service_message_id', 164); + $validations[] = run_column_check('mfh_service_message_to_location', 'location', 164); + $validations[] = run_column_check('service_messages', 'mfh_language', 166); + $validations[] = run_table_check('mfh_calendar_business_hours', 167); + $validations[] = run_setting_check('calendar_show_start_time', 169); + $validations[] = run_setting_check('calendar_show_start_time', 999); - if ($checks) { + $passed = false; + $failed = false; + $skipped = false; + foreach ($validations as $validation) { + if ($validation === 'SKIPPED') { + $skipped = true; + } elseif ($validation === 'FAIL') { + $failed = true; + } else if ($validation === 'PASS') { + $passed = true; + } + } + + if ($passed && !$failed) { echo ""; - } else { + } elseif ($failed) { echo ""; } + + if ($skipped) { + echo ""; + } ?> @@ -283,13 +321,13 @@ function run_setting_check($setting_name, $minimumValidationNumber) { if ($startingValidationNumber < $minimumValidationNumber) { $checks = 'SKIPPED'; } else { - $res = run_check("SELECT 1 FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` WHERE `Key` = '{$setting_name}'"); - $checks = hesk_dbNumRows($res) > 0; + $res = run_check("SELECT 1 FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` WHERE `Key` = '{$setting_name}'", false); + $checks = hesk_dbNumRows($res) > 0 ? 'PASS' : 'FAIL'; } output_result('Setting Exists: ' . $setting_name, $checks); - return $checks !== false; + return $checks; } function run_table_check($table_name, $minimumValidationNumber) { @@ -320,10 +358,10 @@ function run_column_check($table_name, $column_name, $minimumValidationNumber) { $checks); } - return $checks !== false; + return $checks; } -function run_check($sql) { +function run_check($sql, $returnString = true) { global $hesk_last_query; global $hesk_db_link; if (function_exists('mysqli_connect')) { @@ -332,14 +370,23 @@ function run_check($sql) { } $hesk_last_query = $sql; - return @mysqli_query($hesk_db_link, $sql) ? 'PASS' : 'FAIL'; + if ($returnString) { + return @mysqli_query($hesk_db_link, $sql) ? 'PASS' : 'FAIL'; + } else { + return @mysqli_query($hesk_db_link, $sql); + } + } else { if (!$hesk_db_link && !hesk_dbConnect()) { return false; } $hesk_last_query = $sql; - return $res = @mysql_query($sql, $hesk_db_link) ? 'PASS' : 'FAIL'; + if ($returnString) { + return $res = @mysql_query($sql, $hesk_db_link) ? 'PASS' : 'FAIL'; + } else { + return $res = @mysql_query($sql, $hesk_db_link); + } } } @@ -355,8 +402,11 @@ function output_result($change_title, $status) { break; case 'SKIPPED': $css_color = 'default'; - $text = ' Skipped'; + $text = ' Skipped'; break; + default: + $css_color = 'danger'; + $text = 'WTF?! ' . $status; } $formatted_text = sprintf('%s%s', $change_title, $css_color, $text); diff --git a/install/index.php b/install/index.php index a669070e..699e5c9b 100644 --- a/install/index.php +++ b/install/index.php @@ -100,7 +100,7 @@ if (HESK_NEW_VERSION != $hesk_settings['hesk_version']) {
-

You need to be running HESK 2.7.3 to install Mods for HESK. You currently have HESK .

+

You need to be running HESK to install Mods for HESK. You currently have HESK .