Update database tables



Please enable a different anti-SPAM measure in HESK settings.'); } ?>

Things to do next:

  1. Delete the /install folder from your server!
     
  2. Login to HESK administration panel and make sure everything works fine.

 

$value) { $value['articles'] = isset($value['articles']) ? $value['articles'] : 0; $value['articles_private'] = isset($value['articles_private']) ? $value['articles_private'] : 0; $value['articles_draft'] = isset($value['articles_draft']) ? $value['articles_draft'] : 0; hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` SET `articles`={$value['articles']}, `articles_private`={$value['articles_private']}, `articles_draft`={$value['articles_draft']} WHERE `id`='{$catid}'"); // Force order articles $res = hesk_dbQuery("SELECT `id`, `sticky` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` WHERE `catid`='{$catid}' ORDER BY `sticky` DESC, `art_order` ASC"); $i = 10; $previous_sticky = 1; while ( $article = hesk_dbFetchAssoc($res) ) { if ($previous_sticky != $article['sticky']) { $i = 10; $previous_sticky = $article['sticky']; } hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` SET `art_order`=".intval($i)." WHERE `id`='".intval($article['id'])."'"); $i += 10; } } // Force order categories $res = hesk_dbQuery('SELECT `id`, `parent` FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'kb_categories` ORDER BY `parent` ASC, `cat_order` ASC'); $i = 10; while ( $category = hesk_dbFetchAssoc($res) ) { hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` SET `cat_order`=".intval($i)." WHERE `id`='".intval($category['id'])."'"); $i += 10; } $update_all_next = 1; } // END version 2.4.0 to 2.5.0 // 2.5.1 no changes // 2.5.2 no changes // 2.5.3 no changes // 2.5.4 no changes // 2.5.5 no changes // Upgrade version 2.5.x to 2.6.0 if ($update_all_next || $hesk_settings['update_from'] == '2.5') { // -> Banned emails hesk_dbQuery(" CREATE TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."banned_emails` ( `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `email` varchar(255) NOT NULL, `banned_by` smallint(5) unsigned NOT NULL, `dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `email` (`email`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 "); // -> Banned IPs hesk_dbQuery(" CREATE TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."banned_ips` ( `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `ip_from` int(10) unsigned NOT NULL DEFAULT '0', `ip_to` int(10) unsigned NOT NULL DEFAULT '0', `ip_display` varchar(100) NOT NULL, `banned_by` smallint(5) unsigned NOT NULL, `dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 "); // -> Reply drafts hesk_dbQuery(" CREATE TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."reply_drafts` ( `owner` smallint(5) unsigned NOT NULL, `ticket` mediumint(8) unsigned NOT NULL, `message` mediumtext CHARACTER SET utf8 NOT NULL, `dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY `owner` (`owner`), KEY `ticket` (`ticket`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci "); // -> Reset password hesk_dbQuery(" CREATE TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."reset_password` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `user` smallint(5) unsigned NOT NULL, `hash` char(40) NOT NULL, `ip` varchar(45) NOT NULL, `dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `user` (`user`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; "); // -> Service messages hesk_dbQuery(" CREATE TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."service_messages` ( `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `author` smallint(5) unsigned NOT NULL, `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `message` mediumtext COLLATE utf8_unicode_ci NOT NULL, `style` enum('0','1','2','3','4') COLLATE utf8_unicode_ci NOT NULL DEFAULT '0', `type` enum('0','1') COLLATE utf8_unicode_ci NOT NULL DEFAULT '0', `order` smallint(5) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `type` (`type`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; "); // -> Ticket templates hesk_dbQuery(" CREATE TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."ticket_templates` ( `id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', `message` mediumtext COLLATE utf8_unicode_ci NOT NULL, `tpl_order` smallint(5) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci "); // 2.6.0 table changes $sql = array(); $sql[] = "ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."mail` CHANGE `dt` `dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"; $sql[] = "ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."notes` CHANGE `dt` `dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"; $sql[] = "ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."replies` CHANGE `dt` `dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"; $sql[] = "ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."attachments` ADD `type` ENUM( '0', '1' ) NOT NULL DEFAULT '0'"; $sql[] = "ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."categories` ADD `priority` ENUM( '0', '1', '2', '3' ) NOT NULL DEFAULT '3'"; $sql[] = "ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` CHANGE `type` `type` ENUM('0','1') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '0'"; $sql[] = "ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."logins` CHANGE `ip` `ip` VARCHAR(45) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL"; $sql[] = "ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."notes` ADD `attachments` MEDIUMTEXT NOT NULL"; $sql[] = "ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."pipe_loops` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci"; $sql[] = "ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."replies` CHANGE `rating` `rating` ENUM('1','5') CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL, ADD INDEX(`dt`), ADD INDEX(`staffid`)"; $sql[] = "ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` CHANGE `email` `email` VARCHAR( 1000 ) NOT NULL DEFAULT '', CHANGE `ip` `ip` VARCHAR(45) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '', ADD `firstreply` TIMESTAMP NULL DEFAULT NULL AFTER `lastchange`, ADD `closedat` TIMESTAMP NULL DEFAULT NULL AFTER `firstreply`, ADD `articles` VARCHAR(255) NULL DEFAULT NULL AFTER `closedat`, ADD `openedby` MEDIUMINT(8) DEFAULT '0' AFTER `status`, ADD `firstreplyby` SMALLINT(5) UNSIGNED NULL DEFAULT NULL AFTER `openedby`, ADD `closedby` MEDIUMINT(8) NULL DEFAULT NULL AFTER `firstreplyby`, ADD `replies` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' AFTER `closedby`, ADD `staffreplies` SMALLINT( 5 ) UNSIGNED NOT NULL DEFAULT '0' AFTER `replies`, ADD INDEX ( `openedby` , `firstreplyby` , `closedby` ), ADD INDEX(`dt`)"; $sql[] = "ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."users` CHANGE `signature` `signature` VARCHAR( 1000 ) NOT NULL DEFAULT '', CHANGE `heskprivileges` `heskprivileges` VARCHAR(1000) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL, CHANGE `categories` `categories` VARCHAR(500) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '', ADD `notify_customer_new` ENUM('0','1') NOT NULL DEFAULT '1' AFTER `autostart`, ADD `notify_customer_reply` ENUM('0','1') NOT NULL DEFAULT '1' AFTER `notify_customer_new`, ADD `show_suggested` ENUM('0','1') NOT NULL DEFAULT '1' AFTER `notify_customer_reply`"; foreach ($sql as $s) { hesk_dbQuery($s); } // ==> Populate new fields where available // Get list of valid ticket categories $cat = array(); $res = hesk_dbQuery("SELECT `id` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."categories`"); while ($row=hesk_dbFetchAssoc($res)) { $cat[]=$row['id']; } // Update tickets $res = hesk_dbQuery("SELECT `id`, `category` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets`"); while ($ticket = hesk_dbFetchAssoc($res) ) { $sql = array(); // Verify that the category is valid if ( ! in_array($ticket['category'], $cat) ) { $sql[] = " `category`=1 "; } // Update number of staff replies $res2 = hesk_dbQuery("SELECT COUNT(*) as `cnt`, (CASE WHEN `staffid` = 0 THEN 0 ELSE 1 END) AS `staffcnt` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."replies` WHERE `replyto`=".intval($ticket['id'])." GROUP BY `staffcnt`"); $total = 0; $staffreplies = 0; while ( $row = hesk_dbFetchAssoc($res2) ) { $total += $row['cnt']; $staffreplies += ($row['staffcnt'] ? $row['cnt'] : 0); } if ( $total > 0 ) { $sql[] = " `replies`={$total}, `staffreplies`={$staffreplies} "; } // If we have staff replies, find the first one if ( $staffreplies > 0 ) { $res2 = hesk_dbQuery("SELECT `dt`, `staffid` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."replies` WHERE `replyto`={$ticket['id']} AND `staffid`>0 ORDER BY `id` ASC LIMIT 1"); if ( hesk_dbNumRows($res2) == 1) { $reply = hesk_dbFetchAssoc($res2); $sql[] = " `firstreply`='".hesk_dbEscape($reply['dt'])."', `firstreplyby`={$reply['staffid']} "; } } // Do we need to update the ticket? if ( count($sql) ) { hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` SET " . implode(',', $sql) . ", `lastchange`=`lastchange` WHERE `id`={$ticket['id']}"); } } $update_all_next = 1; } // END version 2.5.x to 2.6.0 // 2.6.1 no changes // 2.6.2 change `closedby` type for all 2.6.x to be sure if ($hesk_settings['update_from'] == '2.6') { hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` CHANGE `closedby` `closedby` MEDIUMINT(8) NULL DEFAULT NULL"); } // 2.6.3 no changes // 2.6.4 no changes // 2.6.5 no changes // 2.6.6 no changes // 2.6.7 no changes // Updating version 2.6 to 2.7 if ($update_all_next || $hesk_settings['update_from'] == '2.6') { // Delete old export folder $export_dir = HESK_PATH.$hesk_settings['attach_dir'].'/export/'; if (is_dir($export_dir)) { $files = glob($export_dir.'*', GLOB_NOSORT); if (is_array($files)) { array_walk($files, 'hesk_unlink_callable'); } @rmdir($export_dir); } // Delete old __latest.txt file hesk_unlink(HESK_PATH.$hesk_settings['attach_dir'].'/__latest.txt'); // Delete HTMLPurifier cache if (is_dir(HESK_PATH.'inc/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer')) { hesk_rrmdir(HESK_PATH.'inc/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer', true); } $sql = array(); $sql[] = "ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."users` ADD `autoreload` SMALLINT UNSIGNED NOT NULL DEFAULT '0' AFTER `autostart`"; foreach ($sql as $s) { hesk_dbQuery($s); } // Add new custom field columns and make sure all are set to mediumtext $sql = array(); $table = array(); // Is the status column an enum type? (HESK < 2.7.0) If no, don't subtract 1 later on $res = hesk_dbQuery("SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '".hesk_dbEscape($hesk_settings['db_name'])."' AND TABLE_NAME = '".hesk_dbEscape($hesk_settings['db_pfix'])."tickets' AND COLUMN_NAME = 'status'"); $adjust_status_column = false; if (hesk_dbResult($res) == 'enum') { $adjust_status_column = true; } // Change the type regardless $sql[] = "CHANGE `status` `status` TINYINT UNSIGNED NOT NULL DEFAULT '0'"; $res = hesk_dbQuery("DESCRIBE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets`"); while($row = hesk_dbFetchAssoc($res)) { $table[$row['Field']] = $row['Type']; } for ($i=1; $i<=50; $i++) { if (isset($table['custom'.$i])) { if (strtolower($table['custom'.$i]) != 'mediumtext') { $sql[] = 'CHANGE `custom'.$i.'` `custom'.$i.'` MEDIUMTEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL'; } } else { $sql[] = 'ADD `custom'.$i.'` MEDIUMTEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL'; } } hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` " . implode(',', $sql)); // A tweak to fix converting enum to int if ($adjust_status_column) { hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` SET `status`=`status`-1, `lastchange`=`lastchange`"); } // -> Custom fields hesk_dbQuery(" CREATE TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."custom_fields` ( `id` tinyint(3) UNSIGNED NOT NULL, `use` enum('0','1','2') NOT NULL DEFAULT '0', `place` enum('0','1') NOT NULL DEFAULT '0', `type` varchar(20) NOT NULL DEFAULT 'text', `req` enum('0','1','2') NOT NULL DEFAULT '0', `category` text, `name` text, `value` text, `order` smallint(5) UNSIGNED NOT NULL DEFAULT '10', PRIMARY KEY (`id`), KEY `useType` (`use`,`type`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci "); // ---> Insert empty custom fields hesk_dbQuery(" INSERT INTO `".hesk_dbEscape($hesk_settings['db_pfix'])."custom_fields` (`id`, `use`, `place`, `type`, `req`, `category`, `name`, `value`, `order`) VALUES (1, '0', '0', 'text', '0', NULL, '', NULL, 1000), (2, '0', '0', 'text', '0', NULL, '', NULL, 1000), (3, '0', '0', 'text', '0', NULL, '', NULL, 1000), (4, '0', '0', 'text', '0', NULL, '', NULL, 1000), (5, '0', '0', 'text', '0', NULL, '', NULL, 1000), (6, '0', '0', 'text', '0', NULL, '', NULL, 1000), (7, '0', '0', 'text', '0', NULL, '', NULL, 1000), (8, '0', '0', 'text', '0', NULL, '', NULL, 1000), (9, '0', '0', 'text', '0', NULL, '', NULL, 1000), (10, '0', '0', 'text', '0', NULL, '', NULL, 1000), (11, '0', '0', 'text', '0', NULL, '', NULL, 1000), (12, '0', '0', 'text', '0', NULL, '', NULL, 1000), (13, '0', '0', 'text', '0', NULL, '', NULL, 1000), (14, '0', '0', 'text', '0', NULL, '', NULL, 1000), (15, '0', '0', 'text', '0', NULL, '', NULL, 1000), (16, '0', '0', 'text', '0', NULL, '', NULL, 1000), (17, '0', '0', 'text', '0', NULL, '', NULL, 1000), (18, '0', '0', 'text', '0', NULL, '', NULL, 1000), (19, '0', '0', 'text', '0', NULL, '', NULL, 1000), (20, '0', '0', 'text', '0', NULL, '', NULL, 1000), (21, '0', '0', 'text', '0', NULL, '', NULL, 1000), (22, '0', '0', 'text', '0', NULL, '', NULL, 1000), (23, '0', '0', 'text', '0', NULL, '', NULL, 1000), (24, '0', '0', 'text', '0', NULL, '', NULL, 1000), (25, '0', '0', 'text', '0', NULL, '', NULL, 1000), (26, '0', '0', 'text', '0', NULL, '', NULL, 1000), (27, '0', '0', 'text', '0', NULL, '', NULL, 1000), (28, '0', '0', 'text', '0', NULL, '', NULL, 1000), (29, '0', '0', 'text', '0', NULL, '', NULL, 1000), (30, '0', '0', 'text', '0', NULL, '', NULL, 1000), (31, '0', '0', 'text', '0', NULL, '', NULL, 1000), (32, '0', '0', 'text', '0', NULL, '', NULL, 1000), (33, '0', '0', 'text', '0', NULL, '', NULL, 1000), (34, '0', '0', 'text', '0', NULL, '', NULL, 1000), (35, '0', '0', 'text', '0', NULL, '', NULL, 1000), (36, '0', '0', 'text', '0', NULL, '', NULL, 1000), (37, '0', '0', 'text', '0', NULL, '', NULL, 1000), (38, '0', '0', 'text', '0', NULL, '', NULL, 1000), (39, '0', '0', 'text', '0', NULL, '', NULL, 1000), (40, '0', '0', 'text', '0', NULL, '', NULL, 1000), (41, '0', '0', 'text', '0', NULL, '', NULL, 1000), (42, '0', '0', 'text', '0', NULL, '', NULL, 1000), (43, '0', '0', 'text', '0', NULL, '', NULL, 1000), (44, '0', '0', 'text', '0', NULL, '', NULL, 1000), (45, '0', '0', 'text', '0', NULL, '', NULL, 1000), (46, '0', '0', 'text', '0', NULL, '', NULL, 1000), (47, '0', '0', 'text', '0', NULL, '', NULL, 1000), (48, '0', '0', 'text', '0', NULL, '', NULL, 1000), (49, '0', '0', 'text', '0', NULL, '', NULL, 1000), (50, '0', '0', 'text', '0', NULL, '', NULL, 1000) "); // ---> Update custom fields with current values if (isset($hesk_settings['custom_fields'])) { foreach ($hesk_settings['custom_fields'] as $k => $v) { if ( ! $v['use']) { continue; } $cf = array(); // ID $id = intval(str_replace('custom', '', $k)); // Name $cf['names'][$hesk_settings['language']] = $v['name']; $cf['names'] = addslashes(json_encode($cf['names'])); // Type and value $cf['type'] = $v['type']; switch ($cf['type']) { case 'textarea': $size = explode('#',$v['value']); $cf['rows'] = empty($size[0]) ? 5 : intval($size[0]); $cf['cols'] = empty($size[1]) ? 30 : intval($size[1]); $cf['value'] = array('rows' => $cf['rows'], 'cols' => $cf['cols']); break; case 'radio': $options = explode('#HESK#',$v['value']); $cf['value'] = array('radio_options' => $options); break; case 'select': $v['value'] = str_replace('{HESK_SELECT}', '', $v['value'], $num); $options = explode('#HESK#',$v['value']); $cf['value'] = array('show_select' => ($num ? 1 : 0), 'select_options' => $options); break; case 'checkbox': $options = explode('#HESK#',$v['value']); $cf['value'] = array('checkbox_options' => $options); break; default: $cf['type'] = 'text'; $cf['max_length'] = intval($v['maxlen']); $cf['default_value'] = $v['value']; $cf['value'] = array('max_length' => $cf['max_length'], 'default_value' => $cf['default_value']); } $cf['value'] = addslashes(json_encode($cf['value'])); // Update custom_fields table with this field settings hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."custom_fields` SET `use` = '1', `place` = '".($v['place'] ? '1' : '0')."', `type` = '{$cf['type']}', `req` = '".($v['req'] ? '1' : '0')."', `name` = '".hesk_dbEscape($cf['names'])."', `value` = ".(strlen($cf['value']) ? "'".hesk_dbEscape($cf['value'])."'" : 'NULL')." WHERE `id`={$id}"); } } // -> Custom statuses hesk_dbQuery(" CREATE TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."custom_statuses` ( `id` tinyint(3) UNSIGNED NOT NULL, `name` text NOT NULL, `color` varchar(6) NOT NULL, `can_customers_change` enum('0','1') NOT NULL DEFAULT '1', `order` smallint(5) UNSIGNED NOT NULL DEFAULT '10', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci "); // Update staff with new permissions (allowed by default) hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."users` SET `heskprivileges`=CONCAT(`heskprivileges`,',can_resolve,can_submit_any_cat') WHERE `isadmin` = '0' AND `heskprivileges` LIKE '%can_reply_tickets%' "); $update_all_next = 1; } // END version 2.6 to 2.7 // Updating version 2.7 to 2.8 if ($update_all_next || $hesk_settings['update_from'] == '2.7') { // Modify tickets table hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` ADD `assignedby` MEDIUMINT NULL DEFAULT NULL AFTER `owner`, ADD INDEX (`assignedby`)"); $update_all_next = 1; } // END version 2.7 to 2.8 // Updating 2.8 to 2.8.2 if ($update_all_next || $hesk_settings['update_from'] == '2.8') { // Modify service_messages table hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."service_messages` ADD `language` VARCHAR(50) NULL DEFAULT NULL AFTER `message`"); $update_all_next = 1; } // END version 2.8 to 2.8.2 // Updating 2.8.2 to 2.8.3 if ($update_all_next || $hesk_settings['update_from'] == '2.8.2') { // Modify tickets table hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` CHANGE `name` `name` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '', CHANGE `subject` `subject` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT ''"); $update_all_next = 1; } // END version 2.8.2 to 2.8.3 // 2.8.4 no changes // 2.8.5 no changes // 3.0.0 no changes // 3.0.1 no changes // 3.0.2 no changes // 3.0.3 no changes // 3.1.0 no changes // 3.1.1 no changes // 3.1.2 no changes // Updating 2.8.3 through 3.1.1 to 3.2.0 if ($update_all_next || $hesk_settings['update_from'] == '2.8.3') { // Modify tickets table with due date-related fields only if it doesn't exist (MfH users will already have these columns) $existing_column_rs = hesk_dbQuery("SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '".hesk_dbEscape($hesk_settings['db_pfix'])."tickets' AND table_schema = '".hesk_dbEscape($hesk_settings['db_name'])."' AND column_name = 'due_date'"); if (hesk_dbNumRows($existing_column_rs) === 0) { hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` ADD COLUMN `message_html` mediumtext DEFAULT NULL AFTER `message`, ADD COLUMN `due_date` timestamp NULL DEFAULT NULL, ADD COLUMN `overdue_email_sent` tinyint(1) DEFAULT '0'"); hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."users` ADD COLUMN `notify_overdue_unassigned` enum('0','1') COLLATE utf8_unicode_ci NOT NULL DEFAULT '1' AFTER `notify_note`"); hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."users` ADD COLUMN `notify_overdue_my` enum('0','1') COLLATE utf8_unicode_ci NOT NULL DEFAULT '1' AFTER `notify_overdue_unassigned`"); } else { hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` ADD COLUMN `message_html` mediumtext DEFAULT NULL AFTER `message`"); } hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` SET `message_html` = `message`, `lastchange`=`lastchange`"); hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."replies` CHANGE `name` `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', ADD COLUMN `message_html` mediumtext DEFAULT NULL AFTER `message`"); hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."replies` SET `message_html` = `message`"); hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."reply_drafts` ADD COLUMN `message_html` mediumtext COLLATE utf8_unicode_ci NULL AFTER `message`"); hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."reply_drafts` SET `message_html` = `message`"); hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."std_replies` ADD COLUMN `message_html` mediumtext COLLATE utf8_unicode_ci NULL AFTER `message`"); hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."std_replies` SET `message_html` = `message`"); hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."ticket_templates` ADD COLUMN `message_html` mediumtext COLLATE utf8_unicode_ci NULL AFTER `message`"); hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."ticket_templates` SET `message_html` = `message`"); hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."users` CHANGE `name` `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT ''"); hesk_dbQuery("ALTER TABLE `".hesk_dbEscape($hesk_settings['db_pfix'])."categories` CHANGE `name` `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT ''"); // -> Log of overdue tickets hesk_dbQuery(" CREATE TABLE IF NOT EXISTS `".hesk_dbEscape($hesk_settings['db_pfix'])."log_overdue` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `ticket` mediumint(8) UNSIGNED NOT NULL, `category` smallint(5) UNSIGNED NOT NULL, `priority` enum('0','1','2','3') NOT NULL, `status` tinyint(3) UNSIGNED NOT NULL, `owner` smallint(5) UNSIGNED NOT NULL DEFAULT '0', `due_date` timestamp NOT NULL DEFAULT '2000-01-01 00:00:00', `comments` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `ticket` (`ticket`), KEY `category` (`category`), KEY `priority` (`priority`), KEY `status` (`status`), KEY `owner` (`owner`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; "); $update_all_next = 1; } // Updating 3.2.0 and 3.2.1 to 3.2.2 if ($update_all_next || $hesk_settings['update_from'] == '3.2.0') { // Fix any missing HTML messages from merged tickets hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."replies` SET `message_html` = `message` WHERE `message_html` IS NULL"); $update_all_next = 1; } // 3.2.3 no changes // 3.2.4 no changes // 3.2.5 no changes // Insert the "HESK updated to latest version" mail for the administrator $offer_license = file_exists(HESK_PATH.'hesk_license.php') ? "" : "

» Look professional

\r\n\r\n

To not only support Hesk development but also look more professional, remove "Powered by" links from your help desk.

\r\n\r\n"; hesk_dbQuery("INSERT INTO `".hesk_dbEscape($hesk_settings['db_pfix'])."mail` (`id`, `from`, `to`, `subject`, `message`, `dt`, `read`, `deletedby`) VALUES (NULL, 9999, 1, 'Hesk updated to version ".HESK_NEW_VERSION."', '".hesk_dbEscape("

\r\n\r\n

Congratulations, your Hesk has been successfully updated! Now is your chance to:

\r\n\r\n

» Help us improve

\r\n\r\n

Suggest what features we should add to Hesk by posting them here.

\r\n\r\n

» Stay updated

\r\n\r\n

Hesk regularly receives improvements and bug fixes; make sure you know about them!

\r\n\r\n\r\n{$offer_license}

» Tired of manual updates? Upgrade to Hesk Cloud!

\r\n\r\n

Experience the best of Hesk by moving your help desk into the Hesk Cloud:

\r\n\r\n\r\n

 
Click here to learn more about Hesk Cloud

\r\n\r\n

 

\r\n\r\n

Best regards,

\r\n\r\n

Klemen Stirn
\r\nFounder
\r\nhttps://www.hesk.com

\r\n\r\n

 

\r\n\r\n

")."', NOW(), '0', 9999)"); return true; } // End hesk_iUpdateTables() function hesk_iSaveSettings() { global $hesk_settings, $hesklang; // Get default settings $hesk_default = hesk_defaultSettings(); // Set a new version number $hesk_settings['hesk_version'] = HESK_NEW_VERSION; // Correct typos in variable names before 2.4 if ( isset($hesk_settings['stmp_host_port']) ) { $hesk_settings['smtp_host_port'] = isset($hesk_settings['stmp_host_port']) ? $hesk_settings['stmp_host_port'] : 25; $hesk_settings['smtp_timeout'] = isset($hesk_settings['stmp_timeout']) ? $hesk_settings['stmp_timeout'] : 10; $hesk_settings['smtp_user'] = isset($hesk_settings['stmp_user']) ? $hesk_settings['stmp_user'] : ''; $hesk_settings['smtp_password'] = isset($hesk_settings['stmp_password']) ? $hesk_settings['stmp_password'] : ''; } // Assign all required values foreach ($hesk_default as $k => $v) { if (is_array($v)) { // Arrays will be processed separately continue; } if ( ! isset($hesk_settings[$k])) { $hesk_settings[$k] = $v; } } // Arrays need special care $hesk_settings['attachments'] = isset($hesk_settings['attachments']) ? $hesk_settings['attachments'] : $hesk_default['attachments']; $hesk_settings['email_providers'] = isset($hesk_settings['email_providers']) ? array_unique(array_merge($hesk_settings['email_providers'], $hesk_default['email_providers'])) : $hesk_default['email_providers']; $hesk_settings['notify_spam_tags'] = isset($hesk_settings['notify_spam_tags']) ? $hesk_settings['notify_spam_tags'] : $hesk_default['notify_spam_tags']; $hesk_settings['ticket_list'] = isset($hesk_settings['ticket_list']) ? $hesk_settings['ticket_list'] : $hesk_default['ticket_list']; // Attachments max size must be multiplied by 1024 since version 2.4 if ($hesk_settings['attachments']['max_size'] < 102400) { $hesk_settings['attachments']['max_size'] = $hesk_settings['attachments']['max_size'] * 1024; } // Encode and escape characters $set = $hesk_settings; foreach ($hesk_settings as $k=> $v) { if (is_array($v) || is_object($v)) { continue; } $set[$k] = addslashes($v); } $set['debug_mode'] = 0; $set['email_providers'] = count($hesk_settings['email_providers']) ? "'" . implode("','", $hesk_settings['email_providers']) . "'" : ''; $set['notify_spam_tags'] = count($hesk_settings['notify_spam_tags']) ? "'" . implode("','", $hesk_settings['notify_spam_tags']) . "'" : ''; $set['ip_whois'] = str_replace('http://whois.domaintools.com', 'https://whois.domaintools.com', $set['ip_whois']); // reCaptcha v1 has been removed in 2.8, disable it if ($set['recaptcha_use'] == 1 && version_compare($hesk_settings['update_from'], '2.8', '<')) { $set['recaptcha_use'] = 0; define('RECAPTCHA_V1', true); } hesk_iSaveSettingsFile($set); return true; } // End hesk_iSaveSettings() function hesk_defaultSettings() { $spam_question = hesk_generate_SPAM_question(); $secimg_sum = ''; for ($i=1;$i<=10;$i++) { $secimg_sum .= substr('AEUYBDGHJLMNPQRSTVWXZ123456789', rand(0,29), 1); } // --> General settings $hesk_settings['site_title']='Website'; $hesk_settings['site_url']='http://www.example.com'; $hesk_settings['webmaster_mail']='support@example.com'; $hesk_settings['noreply_mail']='noreply@example.com'; $hesk_settings['noreply_name']='Help Desk'; $hesk_settings['site_theme']='hesk3'; $hesk_settings['admin_css']=0; $hesk_settings['admin_css_url']='https://www.example.com/hesk-style.css'; // --> Language settings $hesk_settings['can_sel_lang']=0; $hesk_settings['language']='English'; $hesk_settings['languages']=array( 'English' => array('folder'=>'en','hr'=>'------ Reply above this line ------'), ); // --> Database settings $hesk_settings['db_host']='localhost'; $hesk_settings['db_name']='hesk'; $hesk_settings['db_user']='test'; $hesk_settings['db_pass']='test'; $hesk_settings['db_pfix']='hesk_'; // ==> HELP DESK // --> Help desk settings $hesk_settings['hesk_title']='Help Desk'; $hesk_settings['hesk_url']='http://www.example.com/helpdesk'; $hesk_settings['admin_dir']='admin'; $hesk_settings['attach_dir']='attachments'; $hesk_settings['cache_dir']='cache'; $hesk_settings['max_listings']=20; $hesk_settings['print_font_size']=12; $hesk_settings['autoclose']=0; $hesk_settings['max_open']=0; $hesk_settings['due_soon']=7; $hesk_settings['new_top']=0; $hesk_settings['reply_top']=0; $hesk_settings['hide_replies']=0; $hesk_settings['limit_width']=800; // --> Features $hesk_settings['autologin']=1; $hesk_settings['autoassign']=1; $hesk_settings['require_email']=1; $hesk_settings['require_owner']=0; $hesk_settings['require_subject']=1; $hesk_settings['require_message']=1; $hesk_settings['custclose']=1; $hesk_settings['custopen']=1; $hesk_settings['rating']=1; $hesk_settings['cust_urgency']=1; $hesk_settings['sequential']=1; $hesk_settings['time_worked']=1; $hesk_settings['spam_notice']=1; $hesk_settings['list_users']=0; $hesk_settings['debug_mode']=0; $hesk_settings['short_link']=0; $hesk_settings['select_cat']=0; $hesk_settings['select_pri']=0; $hesk_settings['cat_show_select']=15; $hesk_settings['staff_ticket_formatting']=0; // --> SPAM Prevention $hesk_settings['secimg_use']=1; $hesk_settings['secimg_sum']=$secimg_sum; $hesk_settings['recaptcha_use']=0; $hesk_settings['recaptcha_public_key']=''; $hesk_settings['recaptcha_private_key']=''; $hesk_settings['question_use']=0; $hesk_settings['question_ask']=$spam_question[0]; $hesk_settings['question_ans']=$spam_question[1]; // --> Security $hesk_settings['attempt_limit']=6; $hesk_settings['attempt_banmin']=60; $hesk_settings['flood']=3; $hesk_settings['reset_pass']=1; $hesk_settings['email_view_ticket']=1; $hesk_settings['x_frame_opt']=1; $hesk_settings['samesite']='Lax'; $hesk_settings['force_ssl']=0; $hesk_settings['url_key']=''; // --> Attachments $hesk_settings['attachments']=array ( 'use' => 1, 'max_number' => 2, 'max_size' => 2097152, 'allowed_types' => array('.gif','.jpg','.png','.zip','.rar','.csv','.doc','.docx','.xls','.xlsx','.txt','.pdf') ); // ==> KNOWLEDGEBASE // --> Knowledgebase settings $hesk_settings['kb_enable']=1; $hesk_settings['kb_wysiwyg']=1; $hesk_settings['kb_search']=2; $hesk_settings['kb_search_limit']=10; $hesk_settings['kb_views']=0; $hesk_settings['kb_date']=0; $hesk_settings['kb_recommendanswers']=1; $hesk_settings['kb_rating']=1; $hesk_settings['kb_substrart']=200; $hesk_settings['kb_cols']=2; $hesk_settings['kb_numshow']=3; $hesk_settings['kb_popart']=6; $hesk_settings['kb_latest']=6; $hesk_settings['kb_index_popart']=6; $hesk_settings['kb_index_latest']=0; $hesk_settings['kb_related']=5; // ==> EMAIL // --> Email sending $hesk_settings['smtp']=0; $hesk_settings['smtp_host_name']='mail.example.com'; $hesk_settings['smtp_host_port']=25; $hesk_settings['smtp_timeout']=10; $hesk_settings['smtp_ssl']=0; $hesk_settings['smtp_tls']=0; $hesk_settings['smtp_user']=''; $hesk_settings['smtp_password']=''; // --> Email piping $hesk_settings['email_piping']=0; // --> POP3 Fetching $hesk_settings['pop3']=0; $hesk_settings['pop3_job_wait']=15; $hesk_settings['pop3_host_name']='mail.example.com'; $hesk_settings['pop3_host_port']=110; $hesk_settings['pop3_tls']=0; $hesk_settings['pop3_keep']=0; $hesk_settings['pop3_user']=''; $hesk_settings['pop3_password']=''; // --> IMAP Fetching $hesk_settings['imap']=0; $hesk_settings['imap_job_wait']=15; $hesk_settings['imap_host_name']='mail.example.com'; $hesk_settings['imap_host_port']=993; $hesk_settings['imap_enc']='ssl'; $hesk_settings['imap_noval_cert']=1; $hesk_settings['imap_keep']=0; $hesk_settings['imap_user']=''; $hesk_settings['imap_password']=''; // --> Email loops $hesk_settings['loop_hits']=6; $hesk_settings['loop_time']=300; // --> Detect email typos $hesk_settings['detect_typos']=1; $hesk_settings['email_providers']=array('aim.com','aol.co.uk','aol.com','att.net','bellsouth.net','blueyonder.co.uk','bt.com','btinternet.com','btopenworld.com','charter.net','comcast.net','cox.net','earthlink.net','email.com','facebook.com','fastmail.fm','free.fr','freeserve.co.uk','gmail.com','gmx.at','gmx.ch','gmx.com','gmx.de','gmx.fr','gmx.net','gmx.us','googlemail.com','hotmail.be','hotmail.co.uk','hotmail.com','hotmail.com.ar','hotmail.com.mx','hotmail.de','hotmail.es','hotmail.fr','hushmail.com','icloud.com','inbox.com','laposte.net','lavabit.com','list.ru','live.be','live.co.uk','live.com','live.com.ar','live.com.mx','live.de','live.fr','love.com','lycos.com','mac.com','mail.com','mail.ru','me.com','msn.com','nate.com','naver.com','neuf.fr','ntlworld.com','o2.co.uk','online.de','orange.fr','orange.net','outlook.com','pobox.com','prodigy.net.mx','qq.com','rambler.ru','rocketmail.com','safe-mail.net','sbcglobal.net','t-online.de','talktalk.co.uk','tiscali.co.uk','verizon.net','virgin.net','virginmedia.com','wanadoo.co.uk','wanadoo.fr','yahoo.co.id','yahoo.co.in','yahoo.co.jp','yahoo.co.kr','yahoo.co.uk','yahoo.com','yahoo.com.ar','yahoo.com.mx','yahoo.com.ph','yahoo.com.sg','yahoo.de','yahoo.fr','yandex.com','yandex.ru','ymail.com'); // --> Notify customer when $hesk_settings['notify_new']=1; $hesk_settings['notify_skip_spam']=1; $hesk_settings['notify_spam_tags']=array('Spam?}','***SPAM***','[SPAM]','SPAM-LOW:','SPAM-MED:'); $hesk_settings['notify_closed']=1; // --> Other $hesk_settings['strip_quoted']=1; $hesk_settings['eml_req_msg']=0; $hesk_settings['save_embedded']=1; $hesk_settings['multi_eml']=0; $hesk_settings['confirm_email']=0; $hesk_settings['open_only']=1; // ==> TICKET LIST $hesk_settings['ticket_list']=array('trackid','lastchange','name','subject','status','lastreplier'); // --> Other $hesk_settings['submittedformat']=2; $hesk_settings['updatedformat']=2; // ==> MISC // --> Date & Time $hesk_settings['timezone']=date_default_timezone_get(); $hesk_settings['timeformat']='Y-m-d H:i:s'; $hesk_settings['time_display']=1; // --> Other $hesk_settings['ip_whois']='https://whois.domaintools.com/{IP}'; $hesk_settings['maintenance_mode']=0; $hesk_settings['alink']=1; $hesk_settings['submit_notice']=0; $hesk_settings['online']=0; $hesk_settings['online_min']=10; $hesk_settings['check_updates']=1; return $hesk_settings; } // END hesk_defaultSettings() function hesk_iDetectVersion() { global $hesk_settings, $hesklang; // Get a list of tables from the database $tables = array(); $res = hesk_dbQuery('SHOW TABLES FROM `'.hesk_dbEscape($hesk_settings['db_name']).'`'); while ($row = hesk_dbFetchRow($res)) { $tables[] = $row[0]; } // If we don't have four basic tables this is not a valid HESK install if ( ! in_array($hesk_settings['db_pfix'].'categories', $tables) || ! in_array($hesk_settings['db_pfix'].'replies', $tables) || ! in_array($hesk_settings['db_pfix'].'tickets', $tables) || ! in_array($hesk_settings['db_pfix'].'users', $tables) ) { hesk_iDatabase(3); } // Version 3.2.0 tables installed? if (in_array($hesk_settings['db_pfix'].'log_overdue', $tables)) { return '3.2.0'; } // Version 2.8.3 tables installed? $res = hesk_dbQuery("SELECT CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '".hesk_dbEscape($hesk_settings['db_pfix'])."tickets' AND table_schema = '".hesk_dbEscape($hesk_settings['db_name'])."' AND column_name = 'name' LIMIT 0, 1"); $row = hesk_dbFetchRow($res); if ($row[0] == 255) { return '2.8.3'; } // Version 2.8.2 tables installed? if (in_array($hesk_settings['db_pfix'].'service_messages', $tables)) { $res = hesk_dbQuery("SHOW COLUMNS FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."service_messages` LIKE 'language'"); if (hesk_dbNumRows($res)) { return '2.8.2'; } } // Version 2.8 tables installed? $res = hesk_dbQuery("SHOW COLUMNS FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` LIKE 'assignedby'"); if (hesk_dbNumRows($res)) { return '2.8'; } // Version 2.7 tables installed? if ( in_array($hesk_settings['db_pfix'].'custom_fields', $tables) || in_array($hesk_settings['db_pfix'].'custom_statuses', $tables) ) { return '2.7'; } // Version 2.6 tables installed? if ( in_array($hesk_settings['db_pfix'].'banned_emails', $tables) || in_array($hesk_settings['db_pfix'].'banned_ips', $tables) || in_array($hesk_settings['db_pfix'].'reply_drafts', $tables) || in_array($hesk_settings['db_pfix'].'reset_password', $tables) || in_array($hesk_settings['db_pfix'].'service_messages', $tables) || in_array($hesk_settings['db_pfix'].'ticket_templates', $tables) ) { return '2.6'; } // Version 2.4/2.5 tables installed? elseif (in_array($hesk_settings['db_pfix'].'pipe_loops', $tables)) { // Version 2.4 didn't have articles_private in kb_categories $res = hesk_dbQuery("SELECT * FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` WHERE `id`=1 LIMIT 1"); $row = hesk_dbFetchAssoc($res); if (isset($row['articles_private'])) { // This is one of the 2.5.x version // Database is 100% compatible, so let's be safe and return 2.5 return '2.5'; } else { return '2.4'; } } // Version 2.3 tables installed? elseif (in_array($hesk_settings['db_pfix'].'online', $tables) || in_array($hesk_settings['db_pfix'].'logins', $tables)) { return '2.3'; } // Version 2.2 tables installed? elseif (in_array($hesk_settings['db_pfix'].'mail', $tables)) { return '2.2'; } // Version 2.1 tables installed? elseif (in_array($hesk_settings['db_pfix'].'kb_attachments', $tables)) { return '2.1'; } // Version 2.0 tables installed? elseif (in_array($hesk_settings['db_pfix'].'kb_articles', $tables)) { return '2.0'; } // Version 0.94.1 tables installed? elseif (in_array('hesk_attachments', $tables)) { return '0.94.1'; } // Version 0.94 tables installed? elseif (in_array('hesk_std_replies', $tables)) { return '0.94'; } // It's a version older than 0.94 or no tables found else { // Version 0.90 didn't have the notify column in users table $res = hesk_dbQuery("SELECT * FROM `hesk_users` WHERE `id`=1 LIMIT 1"); $row = hesk_dbFetchAssoc($res); if (isset($row['notify'])) { return '0.91-0.93.1'; } else { // Wow, we found someone using the very first HESK version :-) return '0.90'; } } } // END hesk_iDetectVersion() ?>