From 69f2cf4b4c064170250fc6a6c54f7f3e4dd50dc3 Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Tue, 26 Sep 2017 22:08:14 -0400 Subject: [PATCH 01/52] Working on an updated installer --- css/mods-for-hesk-new.css | 5 ++ install/background.jpg | Bin 0 -> 120473 bytes install/index.php | 78 +++++++++++++++++++++++++++--- install/install_functions.inc.php | 2 +- 4 files changed, 76 insertions(+), 9 deletions(-) create mode 100644 install/background.jpg diff --git a/css/mods-for-hesk-new.css b/css/mods-for-hesk-new.css index d1dec79a..ce36e59a 100644 --- a/css/mods-for-hesk-new.css +++ b/css/mods-for-hesk-new.css @@ -178,6 +178,11 @@ button.dropdown-submit { min-width: 350px; } +.installer-login-box { + width: 50%; + min-width: 350px; +} + .login-box-container { position: relative; } diff --git a/install/background.jpg b/install/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..60401312ea68f5c22d9730659f15c3c087c18503 GIT binary patch literal 120473 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≀618V0Z60x0Bfj_vuT;)f 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 SD+O2pl9j|n`w`%R82ukE5y!;< literal 0 HcmV?d00001 diff --git a/install/index.php b/install/index.php index 31b45f06..6bc4c0cc 100644 --- a/install/index.php +++ b/install/index.php @@ -1,10 +1,72 @@ + - - Install | Redirecting... - - - - + + Mods For HESK <?php echo MODS_FOR_HESK_NEW_VERSION; ?> Install / Upgrade + + + + + + + + + + + + + + + + +

+ + + diff --git a/install/install_functions.inc.php b/install/install_functions.inc.php index a498ab67..9606199e 100644 --- a/install/install_functions.inc.php +++ b/install/install_functions.inc.php @@ -16,7 +16,7 @@ if (!defined('IN_SCRIPT')) {die('Invalid attempt');} // We will be installing this HESK version: define('HESK_NEW_VERSION','2.7.3'); -define('MODS_FOR_HESK_NEW_VERSION','3.1.1'); +define('MODS_FOR_HESK_NEW_VERSION','3.2.0'); define('REQUIRE_PHP_VERSION','5.3.0'); define('REQUIRE_MYSQL_VERSION','5.0.7'); From 23fc8ef6d5b08943b5b805a1f2fa852771ea4d32 Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Wed, 27 Sep 2017 13:00:20 -0400 Subject: [PATCH 02/52] Landing page looks good, moved database-validation --- .../database-validation.php | 6 +++--- install/index.php | 18 ++++++++++++++++-- install/logo.png | Bin 0 -> 28524 bytes 3 files changed, 19 insertions(+), 5 deletions(-) rename install/{mods-for-hesk => }/database-validation.php (98%) create mode 100644 install/logo.png diff --git a/install/mods-for-hesk/database-validation.php b/install/database-validation.php similarity index 98% rename from install/mods-for-hesk/database-validation.php rename to install/database-validation.php index 22c34c98..7e3d462f 100644 --- a/install/mods-for-hesk/database-validation.php +++ b/install/database-validation.php @@ -1,6 +1,6 @@ Mods For HESK Database Validation - + - + @@ -40,11 +41,24 @@ hesk_dbConnect(); @@ -61,7 +75,7 @@ hesk_dbConnect();

Are you sure you want to uninstall Mods for HESK?

diff --git a/install/logo.png b/install/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5406b9ae535ba4855fe3a061c45bded9c736d93b GIT binary patch literal 28524 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 literal 0 HcmV?d00001 From 43264318c43baaac2bceb84a735617f7769ada8f Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Wed, 27 Sep 2017 22:01:34 -0400 Subject: [PATCH 03/52] Some progress --- install/index.php | 85 ++++++++++++++++++++++++++---------- install/js/install-script.js | 49 +++++++++++++++++++++ 2 files changed, 111 insertions(+), 23 deletions(-) create mode 100644 install/js/install-script.js diff --git a/install/index.php b/install/index.php index 6af0ef16..82784cb6 100644 --- a/install/index.php +++ b/install/index.php @@ -5,51 +5,90 @@ require(HESK_PATH . 'install/install_functions.inc.php'); require(HESK_PATH . 'hesk_settings.inc.php'); hesk_dbConnect(); + +/* +We have four possible installation scenarios: + +1. Fresh install - the user has never installed Mods for HESK before. Simply start at migration #0. +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. + */ ?> - Mods For HESK <?php echo MODS_FOR_HESK_NEW_VERSION; ?> Install / Upgrade - + Mods for HESK <?php echo MODS_FOR_HESK_NEW_VERSION; ?> Install / Upgrade + - - - - - + - - + - + \ No newline at end of file diff --git a/install/js/install-script.js b/install/js/install-script.js new file mode 100644 index 00000000..293fff3c --- /dev/null +++ b/install/js/install-script.js @@ -0,0 +1,49 @@ +var steps = [ + { + name: 'intro', + text: 'Thanks for choosing Mods for HESK', + callback: undefined + }, + { + name: 'db-confirm', + text: 'Confirm the information below', + callback: confirmDatabaseInformation + } +]; + +$(document).ready(function() { + var currentStep = 0; + + $('#next-button').click(function() { + goToStep(++currentStep); + }); + + $('#back-button').click(function() { + goToStep(--currentStep); + }); +}); + +function goToStep(step) { + $('[data-step]').hide(); + $('[data-step="' + steps[step].name + '"]').show(); + + if (step === 0) { + $('#tools-button').show(); + $('#back-button').hide(); + } else { + $('#tools-button').hide(); + $('#back-button').show(); + } + + if (step === steps.length - 1) { + $('#next-button').hide(); + } else { + $('#next-button').show(); + } + + $('#header-text').text(steps[step].text); +} + +function confirmDatabaseInformation() { + +} \ No newline at end of file From 8aac741b6fae9af88af207750859c431908c4ff9 Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Thu, 28 Sep 2017 08:17:45 -0400 Subject: [PATCH 04/52] Added logic to get the starting migration number --- install/index.php | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/install/index.php b/install/index.php index 82784cb6..e12bbe28 100644 --- a/install/index.php +++ b/install/index.php @@ -14,6 +14,42 @@ We have four possible installation scenarios: 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'"); +$startingMigrationNumber = 0; +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` = 'lastMigration'"); + if ($migrationRow = hesk_dbFetchAssoc($migrationNumberSql)) { + $startingMigrationNumber = $migrationRow['Value']; + } else { + $versionSql = hesk_dbQuery("SELECT `Value` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` WHERE `Key` = 'modsForHeskVersion'"); + $versionRow = hesk_dbFetchAssoc($versionSql); + + //TODO Actually map this + $startingMigrationNumber = $versionRow['Value']; + } +} else { + // migration # => sql for checking + $versionChecks = array( + // 1.5.0 -> users.active + 1 => "SHOW COLUMNS FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "users` LIKE 'active'", + // 1.4.1 -> denied_emails + 2 => "SHOW TABLES LIKE '" . hesk_dbEscape($hesk_settings['db_pfix']) . "denied_emails'", + // 1.4.0 -> denied ips + 3 => "SHOW TABLES LIKE '" . hesk_dbEscape($hesk_settings['db_pfix']) . "denied_ips'", + // Pre-1.4.0 but still something -> statuses + 4 => "SHOW TABLES LIKE '" . hesk_dbEscape($hesk_settings['db_pfix']) . "statuses'" + ); + + foreach ($versionChecks as $migrationNumber => $sql) { + $rs = hesk_dbQuery($sql); + if (hesk_dbNumRows($rs) > 0) { + $startingMigrationNumber = $migrationNumber; + break; + } + } +} ?> @@ -85,6 +121,9 @@ We have four possible installation scenarios: +
+

Here we'd actually be doing some things

+
From 8b0fe2cdaf143e8467ce50cc37a3fe2a79d29292 Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Thu, 28 Sep 2017 08:18:42 -0400 Subject: [PATCH 05/52] Start at -1 as the last installed migration # for new installs --- install/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/index.php b/install/index.php index e12bbe28..c527f8e1 100644 --- a/install/index.php +++ b/install/index.php @@ -16,7 +16,7 @@ We have four possible installation scenarios: */ $tableSql = hesk_dbQuery("SHOW TABLES LIKE '" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings'"); -$startingMigrationNumber = 0; +$startingMigrationNumber = -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` = 'lastMigration'"); From 5aeb90852bcdd9e12fe95516df87ef703e0788e9 Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Thu, 28 Sep 2017 13:04:22 -0400 Subject: [PATCH 06/52] Add progress bar for installer...still need to write the actual migrations --- install/index.php | 8 +++++++- install/js/install-script.js | 11 ++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/install/index.php b/install/index.php index c527f8e1..7e80de85 100644 --- a/install/index.php +++ b/install/index.php @@ -122,7 +122,13 @@ if (hesk_dbNumRows($tableSql) > 0) {
-

Here we'd actually be doing some things

+
+
+ 100% Complete + 100% +
+
diff --git a/install/js/install-script.js b/install/js/install-script.js index 293fff3c..13688100 100644 --- a/install/js/install-script.js +++ b/install/js/install-script.js @@ -7,7 +7,12 @@ var steps = [ { name: 'db-confirm', text: 'Confirm the information below', - callback: confirmDatabaseInformation + callback: undefined + }, + { + name: 'install-or-update', + text: 'Updating to the latest version...', + callback: undefined } ]; @@ -42,8 +47,4 @@ function goToStep(step) { } $('#header-text').text(steps[step].text); -} - -function confirmDatabaseInformation() { - } \ No newline at end of file From dbf9baca753ac335bb4ea389e952c064bb480b02 Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Fri, 29 Sep 2017 08:13:24 -0400 Subject: [PATCH 07/52] Getting started on the AJAX portion --- install/ajax/get-migration-ajax.php | 12 +++++++ install/index.php | 9 +++-- install/js/install-script.js | 54 ++++++++++++++++++++++++++++- install/migrations/core.php | 7 ++++ 4 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 install/ajax/get-migration-ajax.php create mode 100644 install/migrations/core.php diff --git a/install/ajax/get-migration-ajax.php b/install/ajax/get-migration-ajax.php new file mode 100644 index 00000000..5e49928c --- /dev/null +++ b/install/ajax/get-migration-ajax.php @@ -0,0 +1,12 @@ + key($allMigrations))); \ No newline at end of file diff --git a/install/index.php b/install/index.php index 7e80de85..47589f69 100644 --- a/install/index.php +++ b/install/index.php @@ -83,7 +83,7 @@ if (hesk_dbNumRows($tableSql) > 0) {
- + \ No newline at end of file diff --git a/install/js/install-script.js b/install/js/install-script.js index f80af6c6..2c93141b 100644 --- a/install/js/install-script.js +++ b/install/js/install-script.js @@ -113,9 +113,15 @@ function executeMigration(startingMigrationNumber, migrationNumber, latestMigrat executeMigration(startingMigrationNumber, newMigrationNumber, latestMigrationNumber, direction); } }, - error: function(data) { + error: function(response) { + try { + message = JSON.parse(response); + } catch (e) { + message = response.responseText; + } + $('#error-block').html("An error occurred! (Error Code: " + migrationNumber + ")
" + message).show(); updateProgressBar(migrationNumber, latestMigrationNumber, true, true); - console.error(data); + console.error(message); } }) } @@ -125,13 +131,14 @@ function updateProgressBar(migrationNumber, latestMigrationNumber, isError, isFi if (isError === true) { $progressBar.find('.progress-bar').removeClass('progress-bar-success') + .removeClass('active') .addClass('progress-bar-danger'); } else { var percentage = Math.round(migrationNumber / latestMigrationNumber * 100); $progressBar.find('.progress-bar').css('width', percentage + '%'); } - if (isFinished) { + if (isFinished && !isError) { goToStep(steps.length - 1); } } \ No newline at end of file From 78559de051f9697b8c9134b363dabd2a8a2511bd Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Sun, 15 Oct 2017 21:23:56 -0400 Subject: [PATCH 25/52] Trying to get downgrades working properly --- install/js/install-script.js | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/install/js/install-script.js b/install/js/install-script.js index 2c93141b..ef4e54c9 100644 --- a/install/js/install-script.js +++ b/install/js/install-script.js @@ -85,12 +85,12 @@ function installOrUpdate() { $('[data-step="install-or-update"] > .progress').show(); // Recursive call that will increment by 1 each time - executeMigration(startingMigrationNumber, startingMigrationNumber, data.lastMigrationNumber, 'up'); + executeMigration(startingMigrationNumber, data.lastMigrationNumber, 'up'); } }) } -function executeMigration(startingMigrationNumber, migrationNumber, latestMigrationNumber, direction) { +function executeMigration(migrationNumber, latestMigrationNumber, direction) { var heskPath = $('p#hesk-path').text(); $.ajax({ @@ -103,14 +103,14 @@ function executeMigration(startingMigrationNumber, migrationNumber, latestMigrat success: function(data) { console.log('migrationNumber: ' + migrationNumber); console.log('latestMigrationNumber: ' + latestMigrationNumber); - console.log(migrationNumber === latestMigrationNumber); - if (migrationNumber === latestMigrationNumber) { - updateProgressBar(migrationNumber, latestMigrationNumber, false, true); + console.info('---'); + if (migrationNumber === latestMigrationNumber || (migrationNumber === 1 && direction === 'down')) { + updateProgressBar(migrationNumber, latestMigrationNumber, direction === 'down', true); console.log('DONE'); } else { updateProgressBar(migrationNumber, latestMigrationNumber, false, false); var newMigrationNumber = direction === 'up' ? migrationNumber + 1 : migrationNumber - 1; - executeMigration(startingMigrationNumber, newMigrationNumber, latestMigrationNumber, direction); + executeMigration(newMigrationNumber, latestMigrationNumber, direction); } }, error: function(response) { @@ -131,8 +131,14 @@ function updateProgressBar(migrationNumber, latestMigrationNumber, isError, isFi if (isError === true) { $progressBar.find('.progress-bar').removeClass('progress-bar-success') - .removeClass('active') .addClass('progress-bar-danger'); + + if (isFinished) { + var $errorBlock = $('#error-block'); + $errorBlock.html($errorBlock.html() + '

Successfully reverted database to before the installation/update.'); + } else { + executeMigration(migrationNumber - 1, latestMigrationNumber, 'down', true); + } } else { var percentage = Math.round(migrationNumber / latestMigrationNumber * 100); $progressBar.find('.progress-bar').css('width', percentage + '%'); From f5907bf476041d9db90bd4697992f8db384a1e08 Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Mon, 16 Oct 2017 13:08:53 -0400 Subject: [PATCH 26/52] Some changes --- install/js/install-script.js | 14 ++++++++++---- install/js/migration-handler.js | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 install/js/migration-handler.js diff --git a/install/js/install-script.js b/install/js/install-script.js index ef4e54c9..b6515cb0 100644 --- a/install/js/install-script.js +++ b/install/js/install-script.js @@ -106,7 +106,7 @@ function executeMigration(migrationNumber, latestMigrationNumber, direction) { console.info('---'); if (migrationNumber === latestMigrationNumber || (migrationNumber === 1 && direction === 'down')) { updateProgressBar(migrationNumber, latestMigrationNumber, direction === 'down', true); - console.log('DONE'); + console.log('%c Success! ', 'color: white; background-color: green; font-size: 2em'); } else { updateProgressBar(migrationNumber, latestMigrationNumber, false, false); var newMigrationNumber = direction === 'up' ? migrationNumber + 1 : migrationNumber - 1; @@ -120,7 +120,15 @@ function executeMigration(migrationNumber, latestMigrationNumber, direction) { message = response.responseText; } $('#error-block').html("An error occurred! (Error Code: " + migrationNumber + ")
" + message).show(); - updateProgressBar(migrationNumber, latestMigrationNumber, true, true); + + updateProgressBar(migrationNumber, latestMigrationNumber, true, false); + + if (direction === 'up') { + // Revert! + executeMigration(migrationNumber - 1, 1, 'down'); + } else { + console.error("I even failed to roll back. Yikes! :'("); + } console.error(message); } }) @@ -136,8 +144,6 @@ function updateProgressBar(migrationNumber, latestMigrationNumber, isError, isFi if (isFinished) { var $errorBlock = $('#error-block'); $errorBlock.html($errorBlock.html() + '

Successfully reverted database to before the installation/update.'); - } else { - executeMigration(migrationNumber - 1, latestMigrationNumber, 'down', true); } } else { var percentage = Math.round(migrationNumber / latestMigrationNumber * 100); diff --git a/install/js/migration-handler.js b/install/js/migration-handler.js new file mode 100644 index 00000000..ba3793c6 --- /dev/null +++ b/install/js/migration-handler.js @@ -0,0 +1,14 @@ +function executeMigration(migrationNumber, direction, success, error) { + var heskPath = $('p#hesk-path').text(); + + $.ajax({ + url: heskPath + 'install/ajax/process-migration.php', + method: 'POST', + data: JSON.stringify({ + migrationNumber: migrationNumber, + direction: direction + }), + success: success(data), + error: error(data) + }) +} \ No newline at end of file From cae76032d137c81ccf706305416748909783a168 Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Mon, 16 Oct 2017 20:39:16 -0400 Subject: [PATCH 27/52] I *think* the rollback feature is working? --- install/js/install-script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/js/install-script.js b/install/js/install-script.js index b6515cb0..ae58bc7a 100644 --- a/install/js/install-script.js +++ b/install/js/install-script.js @@ -125,7 +125,7 @@ function executeMigration(migrationNumber, latestMigrationNumber, direction) { if (direction === 'up') { // Revert! - executeMigration(migrationNumber - 1, 1, 'down'); + executeMigration(migrationNumber - 1, latestMigrationNumber, 'down'); } else { console.error("I even failed to roll back. Yikes! :'("); } From d35cf4d35800845bbd91490ae6d3de69949092a1 Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Mon, 16 Oct 2017 22:02:04 -0400 Subject: [PATCH 28/52] Fix some migrations --- install/index.php | 2 +- install/js/install-script.js | 2 +- install/migrations/v200/MigrateIpAndEmailBans.php | 4 ++-- .../migrations/v230/MovePermissionsToHeskPrivilegesColumn.php | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/install/index.php b/install/index.php index 599dc49a..5be220f7 100644 --- a/install/index.php +++ b/install/index.php @@ -139,7 +139,7 @@ if (hesk_dbNumRows($tableSql) > 0) {
-
+
diff --git a/install/js/install-script.js b/install/js/install-script.js index ae58bc7a..8bf51617 100644 --- a/install/js/install-script.js +++ b/install/js/install-script.js @@ -119,7 +119,7 @@ function executeMigration(migrationNumber, latestMigrationNumber, direction) { } catch (e) { message = response.responseText; } - $('#error-block').html("An error occurred! (Error Code: " + migrationNumber + ")
" + message).show(); + $('#error-block').html("

An error occurred! (Error Code: " + migrationNumber + ")
" + message).show(); updateProgressBar(migrationNumber, latestMigrationNumber, true, false); diff --git a/install/migrations/v200/MigrateIpAndEmailBans.php b/install/migrations/v200/MigrateIpAndEmailBans.php index 5d2f1534..604b370a 100644 --- a/install/migrations/v200/MigrateIpAndEmailBans.php +++ b/install/migrations/v200/MigrateIpAndEmailBans.php @@ -7,14 +7,14 @@ class MigrateIpAndEmailBans extends \AbstractMigration { function up($hesk_settings) { // Insert the email bans - $emailBanRS = executeQuery("SELECT `Email` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "denied_emails`"); + $emailBanRS = $this->executeQuery("SELECT `Email` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "denied_emails`"); while ($row = hesk_dbFetchAssoc($emailBanRS)) { $this->executeQuery("INSERT INTO `" . hesk_dbEscape($hesk_settings['db_pfix']) . "banned_emails` (`email`, `banned_by`, `dt`) VALUES ('" . hesk_dbEscape($row['Email']) . "', 1, NOW())"); } // Insert the IP bans - $ipBanRS = executeQuery("SELECT `RangeStart`, `RangeEnd` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "denied_ips`"); + $ipBanRS = $this->executeQuery("SELECT `RangeStart`, `RangeEnd` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "denied_ips`"); while ($row = hesk_dbFetchAssoc($ipBanRS)) { $ipFrom = long2ip($row['RangeStart']); $ipTo = long2ip($row['RangeEnd']); diff --git a/install/migrations/v230/MovePermissionsToHeskPrivilegesColumn.php b/install/migrations/v230/MovePermissionsToHeskPrivilegesColumn.php index 9ace4515..f4a5a5b4 100644 --- a/install/migrations/v230/MovePermissionsToHeskPrivilegesColumn.php +++ b/install/migrations/v230/MovePermissionsToHeskPrivilegesColumn.php @@ -44,7 +44,7 @@ class MovePermissionsToHeskPrivilegesColumn extends \AbstractMigration { $this->executeQuery("ALTER TABLE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "users` ADD COLUMN `can_manage_settings` ENUM ('0', '1') NOT NULL DEFAULT '1'"); $this->executeQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "users` - SET `can_change_settings` = '0' + SET `can_manage_settings` = '0' WHERE `heskprivileges` NOT LIKE '%can_man_settings%'"); $this->executeQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "users` SET `can_change_notification_settings` = '0' From 8b7f0ace3ac4e0f792644edc0e06821cb4fe4282 Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Tue, 17 Oct 2017 21:48:58 -0400 Subject: [PATCH 29/52] Fixed error logger --- install/js/install-script.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/install/js/install-script.js b/install/js/install-script.js index 8bf51617..097fc242 100644 --- a/install/js/install-script.js +++ b/install/js/install-script.js @@ -119,7 +119,8 @@ function executeMigration(migrationNumber, latestMigrationNumber, direction) { } catch (e) { message = response.responseText; } - $('#error-block').html("

An error occurred! (Error Code: " + migrationNumber + ")
" + message).show(); + $errorBlock = $('#error-block'); + $errorBlock.html($errorBlock.html() + "

An error occurred! (Error Code: " + migrationNumber + ")
" + message).show(); updateProgressBar(migrationNumber, latestMigrationNumber, true, false); From 0df87dde57700eac62b8971e113abee3d90bdd9c Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Wed, 18 Oct 2017 13:02:48 -0400 Subject: [PATCH 30/52] Fix some migrations, add new ones to keep track of migration number --- install/database-validation.php | 5 + .../migrations/AbstractUpdatableMigration.php | 27 ++++ install/migrations/LegacyUpdateMigration.php | 19 +++ install/migrations/UpdateMigration.php | 10 +- install/migrations/core.php | 125 +++++++++--------- .../migrations/v200/MigrateIpAndEmailBans.php | 3 - .../v230/CreatePermissionTemplates.php | 3 +- .../v310/ConvertPresetToIndividualColors.php | 2 +- .../migrations/v320/AddMigrationSetting.php | 16 +++ 9 files changed, 140 insertions(+), 70 deletions(-) create mode 100644 install/migrations/AbstractUpdatableMigration.php create mode 100644 install/migrations/LegacyUpdateMigration.php create mode 100644 install/migrations/v320/AddMigrationSetting.php diff --git a/install/database-validation.php b/install/database-validation.php index 7e3d462f..e26c45cf 100644 --- a/install/database-validation.php +++ b/install/database-validation.php @@ -199,6 +199,11 @@ hesk_dbConnect(); $all_good = $all_good & run_setting_check('admin_sidebar_font_weight'); $all_good = $all_good & run_setting_check('admin_sidebar_header_background'); $all_good = $all_good & run_setting_check('admin_sidebar_header_text'); + output_header_row('3.2.0'); + $all_good &= run_table_check('audit_trail'); + $all_good &= run_table_check('audit_trail_to_replacement_values'); + $all_good &= run_column_check('categories', 'mfh_description'); + $all_good &= run_column_check('custom_fields', 'mfh_description'); if ($all_good) { echo ""; diff --git a/install/migrations/AbstractUpdatableMigration.php b/install/migrations/AbstractUpdatableMigration.php new file mode 100644 index 00000000..98311b79 --- /dev/null +++ b/install/migrations/AbstractUpdatableMigration.php @@ -0,0 +1,27 @@ +migrationNumber = $migrationNumber; + } + + function up($hesk_settings) { + $this->innerUp($hesk_settings); + + $this->executeQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` SET `Value` = " . intval($this->migrationNumber) . " + WHERE `Key` = 'migrationNumber'"); + } + + abstract function innerUp($hesk_settings); + + function down($hesk_settings) { + $this->innerDown($hesk_settings); + + $this->executeQuery("UPDATE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` SET `Value` = " . (intval($this->migrationNumber) - 1) . " + WHERE `Key` = 'migrationNumber'"); + } + + abstract function innerDown($hesk_settings); +} \ No newline at end of file diff --git a/install/migrations/LegacyUpdateMigration.php b/install/migrations/LegacyUpdateMigration.php new file mode 100644 index 00000000..ffbc9afb --- /dev/null +++ b/install/migrations/LegacyUpdateMigration.php @@ -0,0 +1,19 @@ +upVersion = $upVersion; + $this->downVersion = $downVersion; + } + + function up($hesk_settings) { + $this->updateVersion($this->upVersion, $hesk_settings); + } + + function down($hesk_settings) { + $this->updateVersion($this->downVersion, $hesk_settings); + } +} \ No newline at end of file diff --git a/install/migrations/UpdateMigration.php b/install/migrations/UpdateMigration.php index 89fc3a86..2a585e69 100644 --- a/install/migrations/UpdateMigration.php +++ b/install/migrations/UpdateMigration.php @@ -1,19 +1,21 @@ upVersion = $upVersion; $this->downVersion = $downVersion; } - function up($hesk_settings) { + function innerUp($hesk_settings) { $this->updateVersion($this->upVersion, $hesk_settings); } - function down($hesk_settings) { + function innerDown($hesk_settings) { $this->updateVersion($this->downVersion, $hesk_settings); } } \ No newline at end of file diff --git a/install/migrations/core.php b/install/migrations/core.php index 732d9726..8f9fa300 100644 --- a/install/migrations/core.php +++ b/install/migrations/core.php @@ -38,113 +38,116 @@ function getAllMigrations() { 14 => new \v160\CreateSettingsTable(), 15 => new \v160\InsertVersionRecord(), //1.6.1 - 16 => new UpdateMigration('1.6.1', '1.6.0'), + 16 => new LegacyUpdateMigration('1.6.1', '1.6.0'), //1.7.0 17 => new \v170\CreateVerifiedEmailsTable(), 18 => new \v170\CreatePendingVerificationEmailsTable(), 19 => new \v170\CreateStageTicketsTable(), - 20 => new UpdateMigration('1.7.0', '1.6.1'), + 20 => new LegacyUpdateMigration('1.7.0', '1.6.1'), //2.0.0 21 => new \v200\RemoveNoteIdFromAttachments(), 22 => new \v200\RemoveEditInfoFromNotes(), 23 => new \v200\RemoveDefaultNotifyCustomerEmailPreference(), 24 => new \v200\AddMissingKeyToTickets(), 25 => new \v200\MigrateIpAndEmailBans(), - 26 => new UpdateMigration('2.0.0', '1.7.0'), + 26 => new LegacyUpdateMigration('2.0.0', '1.7.0'), //2.0.1 - 27 => new UpdateMigration('2.0.1', '2.0.0'), + 27 => new LegacyUpdateMigration('2.0.1', '2.0.0'), //2.1.0 - 28 => new UpdateMigration('2.1.0', '2.0.1'), + 28 => new LegacyUpdateMigration('2.1.0', '2.0.1'), //2.1.1 29 => new \v211\FixStageTicketsTable(), - 30 => new UpdateMigration('2.1.1', '2.1.0'), + 30 => new LegacyUpdateMigration('2.1.1', '2.1.0'), //2.2.0 31 => new \v220\AddIsAutocloseOptionToStatuses(), 32 => new \v220\AddClosableColumnToStatuses(), - 33 => new UpdateMigration('2.2.0', '2.1.1'), + 33 => new LegacyUpdateMigration('2.2.0', '2.1.1'), //2.2.1 - 34 => new UpdateMigration('2.2.1', '2.2.0'), + 34 => new LegacyUpdateMigration('2.2.1', '2.2.0'), //2.3.0 35 => new \v230\AddIconToServiceMessages(), 36 => new \v230\ConsolidateStatusColumns(), 37 => new \v230\AddCoordinatesToTickets(), 38 => new \v230\AddCategoryManager(), 39 => new \v230\MovePermissionsToHeskPrivilegesColumn(), - 40 => new UpdateMigration('2.3.0', '2.2.1'), + 40 => new \v230\CreatePermissionTemplates(), + 41 => new LegacyUpdateMigration('2.3.0', '2.2.1'), //2.3.1 - 41 => new UpdateMigration('2.3.1', '2.3.0'), + 42 => new LegacyUpdateMigration('2.3.1', '2.3.0'), //2.3.2 - 42 => new UpdateMigration('2.3.2', '2.3.1'), + 43 => new LegacyUpdateMigration('2.3.2', '2.3.1'), //2.4.0 - 43 => new \v240\CreateQuickHelpSectionsTable(), - 44 => new \v240\CreateNewStatusNameTable(), - 45 => new \v240\AddDownloadCountToAttachments(), - 46 => new \v240\AddHtmlColumnToTickets(), - 47 => new UpdateMigration('2.4.0', '2.3.2'), + 44 => new \v240\CreateQuickHelpSectionsTable(), + 45 => new \v240\CreateNewStatusNameTable(), + 46 => new \v240\AddDownloadCountToAttachments(), + 47 => new \v240\AddHtmlColumnToTickets(), + 48 => new LegacyUpdateMigration('2.4.0', '2.3.2'), //2.4.1 - 48 => new UpdateMigration('2.4.1', '2.4.0'), + 49 => new LegacyUpdateMigration('2.4.1', '2.4.0'), //2.4.2 - 49 => new UpdateMigration('2.4.2', '2.4.1'), + 50 => new LegacyUpdateMigration('2.4.2', '2.4.1'), //2.5.0 - 50 => new \v250\MigrateSettingsToDatabase(), - 51 => new \v250\AddUserAgentAndScreenResToTickets(), - 52 => new \v250\AddNavbarTitleUrl(), - 53 => new UpdateMigration('2.5.0', '2.4.2'), + 51 => new \v250\MigrateSettingsToDatabase(), + 52 => new \v250\AddUserAgentAndScreenResToTickets(), + 53 => new \v250\AddNavbarTitleUrl(), + 54 => new LegacyUpdateMigration('2.5.0', '2.4.2'), //2.5.1 - 54 => new UpdateMigration('2.5.1', '2.5.0'), + 55 => new LegacyUpdateMigration('2.5.1', '2.5.0'), //2.5.2 - 55 => new UpdateMigration('2.5.2', '2.5.1'), + 56 => new LegacyUpdateMigration('2.5.2', '2.5.1'), //2.5.3 - 56 => new UpdateMigration('2.5.3', '2.5.2'), + 57 => new LegacyUpdateMigration('2.5.3', '2.5.2'), //2.5.4 - 57 => new UpdateMigration('2.5.4', '2.5.3'), + 58 => new LegacyUpdateMigration('2.5.4', '2.5.3'), //2.5.5 - 58 => new UpdateMigration('2.5.5', '2.5.4'), + 59 => new LegacyUpdateMigration('2.5.5', '2.5.4'), //2.6.0 - 59 => new \v260\AddApiTables(), - 60 => new \v260\AddLoggingTable(), - 61 => new \v260\AddTempAttachmentTable(), - 62 => new \v260\AddCalendarModule(), - 63 => new \v260\AddPrimaryKeyToSettings(), - 64 => new \v260\ConvertStatusPropertiesToInts(), - 65 => new UpdateMigration('2.6.0', '2.5.5'), + 60 => new \v260\AddApiTables(), + 61 => new \v260\AddLoggingTable(), + 62 => new \v260\AddTempAttachmentTable(), + 63 => new \v260\AddCalendarModule(), + 64 => new \v260\AddPrimaryKeyToSettings(), + 65 => new \v260\ConvertStatusPropertiesToInts(), + 66 => new LegacyUpdateMigration('2.6.0', '2.5.5'), //2.6.1 - 66 => new UpdateMigration('2.6.1', '2.6.0'), + 67 => new LegacyUpdateMigration('2.6.1', '2.6.0'), //2.6.2 - 67 => new \v262\AddMissingColumnsToStageTickets(), - 68 => new UpdateMigration('2.6.2', '2.6.1'), + 68 => new \v262\AddMissingColumnsToStageTickets(), + 69 => new LegacyUpdateMigration('2.6.2', '2.6.1'), //2.6.3 - 69 => new UpdateMigration('2.6.3', '2.6.2'), + 70 => new LegacyUpdateMigration('2.6.3', '2.6.2'), //2.6.4 - 70 => new UpdateMigration('2.6.4', '2.6.3'), + 71 => new LegacyUpdateMigration('2.6.4', '2.6.3'), //3.0.0 - 71 => new \v300\MigrateHeskCustomStatuses(), - 72 => new \v300\MigrateAutorefreshOption(), - 73 => new \v300\AddColorSchemeSetting(), - 74 => new UpdateMigration('3.0.0', '2.6.4'), + 72 => new \v300\MigrateHeskCustomStatuses(), + 73 => new \v300\MigrateAutorefreshOption(), + 74 => new \v300\AddColorSchemeSetting(), + 75 => new LegacyUpdateMigration('3.0.0', '2.6.4'), //3.0.1 - 75 => new UpdateMigration('3.0.1', '3.0.0'), + 76 => new LegacyUpdateMigration('3.0.1', '3.0.0'), //3.0.2 - 76 => new \v302\AddMissingCustomFields(), - 77 => new UpdateMigration('3.0.2', '3.0.1'), + 77 => new \v302\AddMissingCustomFields(), + 78 => new LegacyUpdateMigration('3.0.2', '3.0.1'), //3.0.3 - 3.0.7 - 78 => new UpdateMigration('3.0.3', '3.0.2'), - 79 => new UpdateMigration('3.0.4', '3.0.3'), - 80 => new UpdateMigration('3.0.5', '3.0.4'), - 81 => new UpdateMigration('3.0.6', '3.0.5'), - 82 => new UpdateMigration('3.0.7', '3.0.6'), + 79 => new LegacyUpdateMigration('3.0.3', '3.0.2'), + 80 => new LegacyUpdateMigration('3.0.4', '3.0.3'), + 81 => new LegacyUpdateMigration('3.0.5', '3.0.4'), + 82 => new LegacyUpdateMigration('3.0.6', '3.0.5'), + 83 => new LegacyUpdateMigration('3.0.7', '3.0.6'), //3.1.0 - 83 => new \v310\AddStackTraceToLogs(), - 84 => new \v310\AddCustomNavElements(), - 85 => new \v310\AddMoreColorOptionsToCategories(), - 86 => new \v310\AddNewLoginSettings(), - 87 => new \v310\AddApiUrlRewriteSetting(), - 88 => new \v310\ConvertPresetToIndividualColors(), - 89 => new UpdateMigration('3.1.0', '3.0.7'), + 84 => new \v310\AddStackTraceToLogs(), + 85 => new \v310\AddCustomNavElements(), + 86 => new \v310\AddMoreColorOptionsToCategories(), + 87 => new \v310\AddNewLoginSettings(), + 88 => new \v310\AddApiUrlRewriteSetting(), + 89 => new \v310\ConvertPresetToIndividualColors(), + 90 => new LegacyUpdateMigration('3.1.0', '3.0.7'), //3.1.1 - 90 => new UpdateMigration('3.1.1', '3.1.0'), + 91 => new LegacyUpdateMigration('3.1.1', '3.1.0'), //3.2.0 - 91 => new \v320\AddDescriptionToCategoriesAndCustomFields(), - 92 => new \v320\AddAuditTrail(), + 92 => new \v320\AddDescriptionToCategoriesAndCustomFields(), + 93 => new \v320\AddAuditTrail(), + 94 => new \v320\AddMigrationSetting(), + 95 => new UpdateMigration('3.2.0', '3.1.1', 95), ); } \ No newline at end of file diff --git a/install/migrations/v200/MigrateIpAndEmailBans.php b/install/migrations/v200/MigrateIpAndEmailBans.php index 604b370a..3174fe83 100644 --- a/install/migrations/v200/MigrateIpAndEmailBans.php +++ b/install/migrations/v200/MigrateIpAndEmailBans.php @@ -46,8 +46,5 @@ class MigrateIpAndEmailBans extends \AbstractMigration { while ($row = hesk_dbFetchAssoc($ips)) { $this->executeQuery("INSERT INTO `" . hesk_dbEscape($hesk_settings['db_pfix']) . "denied_ips` (`RangeStart`, `RangeEnd`) VALUES (" . $row['ip_from'] . ", " . $row['ip_to'] . ")"); } - - $this->executeQuery("DROP TABLE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "banned_ips`"); - $this->executeQuery("DROP TABLE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "banned_emails`"); } } \ No newline at end of file diff --git a/install/migrations/v230/CreatePermissionTemplates.php b/install/migrations/v230/CreatePermissionTemplates.php index bd7365ca..fad3cff9 100644 --- a/install/migrations/v230/CreatePermissionTemplates.php +++ b/install/migrations/v230/CreatePermissionTemplates.php @@ -19,6 +19,7 @@ class CreatePermissionTemplates extends \AbstractMigration { } function down($hesk_settings) { - // TODO: Implement down() method. + $this->executeQuery("ALTER TABLE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "users` DROP COLUMN `permission_template`"); + $this->executeQuery("DROP TABLE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "permission_templates`"); } } \ No newline at end of file diff --git a/install/migrations/v310/ConvertPresetToIndividualColors.php b/install/migrations/v310/ConvertPresetToIndividualColors.php index b3c0127b..c0d8461d 100644 --- a/install/migrations/v310/ConvertPresetToIndividualColors.php +++ b/install/migrations/v310/ConvertPresetToIndividualColors.php @@ -14,7 +14,7 @@ class ConvertPresetToIndividualColors extends \AbstractMigration { $theme = $theme_preset_row['Value']; } - $light_theme = preg_match('/.*-light/g', $theme); + $light_theme = preg_match_all('/.*-light/', $theme); $navbar = array( 'background' => '', 'text' => '#fff', diff --git a/install/migrations/v320/AddMigrationSetting.php b/install/migrations/v320/AddMigrationSetting.php new file mode 100644 index 00000000..72c9c0b3 --- /dev/null +++ b/install/migrations/v320/AddMigrationSetting.php @@ -0,0 +1,16 @@ +executeQuery("INSERT INTO `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` (`Key`, `Value`) + VALUES ('migrationNumber', '94')"); + } + + function down($hesk_settings) { + $this->executeQuery("DELETE FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` WHERE `Key` = 'migrationNumber'"); + } +} \ No newline at end of file From 60ac53fe94f96ed2ad1b2a200bdd3ddd6a2dc174 Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Wed, 18 Oct 2017 13:03:11 -0400 Subject: [PATCH 31/52] Change key --- install/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/index.php b/install/index.php index 5be220f7..e8bf76a0 100644 --- a/install/index.php +++ b/install/index.php @@ -19,7 +19,7 @@ $tableSql = hesk_dbQuery("SHOW TABLES LIKE '" . hesk_dbEscape($hesk_settings['db $startingMigrationNumber = 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` = 'lastMigration'"); + $migrationNumberSql = hesk_dbQuery("SELECT `Value` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "settings` WHERE `Key` = 'migrationNumber'"); if ($migrationRow = hesk_dbFetchAssoc($migrationNumberSql)) { $startingMigrationNumber = intval($migrationRow['Value']) + 1; } else { From 7aa7526a17ea20c56b13c678bb274b29ef044af0 Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Wed, 18 Oct 2017 22:00:00 -0400 Subject: [PATCH 32/52] Working on the uninstaller --- install/database-validation.php | 256 +++++++++--------- install/js/uninstall-script.js | 157 +++++++++++ install/mods-for-hesk/js/uninstall-scripts.js | 102 ------- .../mods-for-hesk/uninstallModsForHesk.php | 86 ------ install/uninstall.php | 177 ++++++++++++ 5 files changed, 463 insertions(+), 315 deletions(-) create mode 100644 install/js/uninstall-script.js delete mode 100644 install/mods-for-hesk/js/uninstall-scripts.js delete mode 100644 install/mods-for-hesk/uninstallModsForHesk.php create mode 100644 install/uninstall.php diff --git a/install/database-validation.php b/install/database-validation.php index e26c45cf..4eaf4c8a 100644 --- a/install/database-validation.php +++ b/install/database-validation.php @@ -31,7 +31,7 @@ hesk_dbConnect(); - - \ No newline at end of file diff --git a/install/js/uninstall-script.js b/install/js/uninstall-script.js index 5e088c8d..edb0b833 100644 --- a/install/js/uninstall-script.js +++ b/install/js/uninstall-script.js @@ -81,8 +81,8 @@ function uninstall() { success: function(data) { data = JSON.parse(data); - $('[data-step="install-or-update"] > #spinner').hide(); - $('[data-step="install-or-update"] > .progress').show(); + $('[data-step="uninstall"] > #spinner').hide(); + $('[data-step="uninstall"] > .progress').show(); // Recursive call that will increment by 1 each time executeMigration(startingMigrationNumber, 1, 'down'); @@ -104,8 +104,8 @@ function executeMigration(migrationNumber, latestMigrationNumber, direction) { console.log('migrationNumber: ' + migrationNumber); console.log('latestMigrationNumber: ' + latestMigrationNumber); console.info('---'); - if (migrationNumber === latestMigrationNumber || (migrationNumber === 1 && direction === 'down')) { - updateProgressBar(migrationNumber, latestMigrationNumber, direction === 'down', true); + if (migrationNumber === latestMigrationNumber) { + updateProgressBar(migrationNumber, latestMigrationNumber, false, true); console.log('%c Success! ', 'color: white; background-color: green; font-size: 2em'); } else { updateProgressBar(migrationNumber, latestMigrationNumber, false, false); @@ -124,12 +124,6 @@ function executeMigration(migrationNumber, latestMigrationNumber, direction) { updateProgressBar(migrationNumber, latestMigrationNumber, true, false); - if (direction === 'up') { - // Revert! - executeMigration(migrationNumber - 1, latestMigrationNumber, 'down'); - } else { - console.error("I even failed to roll back. Yikes! :'("); - } console.error(message); } }) diff --git a/install/uninstall.php b/install/uninstall.php index 7fd08339..0ba8272b 100644 --- a/install/uninstall.php +++ b/install/uninstall.php @@ -146,32 +146,15 @@ if (hesk_dbNumRows($tableSql) > 0) {
+ +    Back to installer +
Next   
- - \ No newline at end of file From 109a4fa25feb962e18d48aeb98ae1b2990582702 Mon Sep 17 00:00:00 2001 From: Mike Koch Date: Fri, 20 Oct 2017 13:07:01 -0400 Subject: [PATCH 34/52] Uninstaller works --- install/database-validation.php | 4 ++-- install/js/install-script.js | 10 +++++----- install/js/uninstall-script.js | 16 ++++++++-------- install/uninstall.php | 4 ++-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/install/database-validation.php b/install/database-validation.php index 4eaf4c8a..e7ae6853 100644 --- a/install/database-validation.php +++ b/install/database-validation.php @@ -31,7 +31,7 @@ hesk_dbConnect();