Merge branch '3-0-1' into 'master'

3.0.1 Update

Closes #488, #489, #490, #494, #496, #497, and #499

See merge request !38
remotes/remote_mirror_8/ability-to-resend-response 3.0.1
Mike Koch 7 years ago
commit 0b44970041

1
.gitignore vendored

@ -241,7 +241,6 @@ inc/tiny_mce/3.5.11/utils/mctabs.js
inc/tiny_mce/3.5.11/utils/validate.js
inc/treemenu/TreeMenu.php
inc/treemenu/index.htm
inc/users_online.inc.php
inc/zip/Zip.php
inc/zip/index.htm
inc/zip/pclzip.lib.php

@ -264,7 +264,7 @@ $modsForHesk_settings = mfh_getSettings();
document.getElementById('servertime').innerHTML = h + ":" + m;
s = s + 1;
today.setSeconds(s);
t = setTimeout('startTime()', 1000);
t = setTimeout(function() { startTime(); },1000);
}
function checkTime(i) {
@ -591,6 +591,32 @@ $modsForHesk_settings = mfh_getSettings();
placeholder="<?php echo htmlspecialchars($hesklang['navbar_title_url']); ?>"/>
</div>
</div>
<div class="form-group">
<label for="s_hesk_title" class="col-sm-3 control-label"><?php echo $hesklang['hesk_title']; ?>
<a href="Javascript:void(0)"
onclick="Javascript:hesk_window('<?php echo $help_folder; ?>helpdesk.html#6','400','500')"><i
class="fa fa-question-circle settingsquestionmark"></i></a></label>
<div class="col-sm-9">
<input type="text" class="form-control"
placeholder="<?php echo htmlspecialchars($hesklang['hesk_title']); ?>"
name="s_hesk_title" size="40" maxlength="255"
value="<?php echo $hesk_settings['hesk_title']; ?>"/>
</div>
</div>
<div class="form-group">
<label for="s_hesk_url" class="col-sm-3 control-label"><?php echo $hesklang['hesk_url']; ?> <a
href="Javascript:void(0)"
onclick="Javascript:hesk_window('<?php echo $help_folder; ?>helpdesk.html#7','400','500')"><i
class="fa fa-question-circle settingsquestionmark"></i></a></label>
<div class="col-sm-9">
<input type="text" class="form-control"
placeholder="<?php echo htmlspecialchars($hesklang['hesk_url']); ?>"
name="s_hesk_url" size="40" maxlength="255"
value="<?php echo $hesk_settings['hesk_url']; ?>"/>
</div>
</div>
<div class="form-group">
<label for="s_webmaster_email"
class="col-sm-3 control-label"><?php echo $hesklang['email_wm']; ?> <a
@ -805,32 +831,6 @@ $modsForHesk_settings = mfh_getSettings();
</div>
<div class="box-body">
<h4 class="bold"><?php echo $hesklang['hd']; ?></h4>
<div class="form-group">
<label for="s_hesk_title" class="col-sm-3 control-label"><?php echo $hesklang['hesk_title']; ?>
<a href="Javascript:void(0)"
onclick="Javascript:hesk_window('<?php echo $help_folder; ?>helpdesk.html#6','400','500')"><i
class="fa fa-question-circle settingsquestionmark"></i></a></label>
<div class="col-sm-9">
<input type="text" class="form-control"
placeholder="<?php echo htmlspecialchars($hesklang['hesk_title']); ?>"
name="s_hesk_title" size="40" maxlength="255"
value="<?php echo $hesk_settings['hesk_title']; ?>"/>
</div>
</div>
<div class="form-group">
<label for="s_hesk_url" class="col-sm-3 control-label"><?php echo $hesklang['hesk_url']; ?> <a
href="Javascript:void(0)"
onclick="Javascript:hesk_window('<?php echo $help_folder; ?>helpdesk.html#7','400','500')"><i
class="fa fa-question-circle settingsquestionmark"></i></a></label>
<div class="col-sm-9">
<input type="text" class="form-control"
placeholder="<?php echo htmlspecialchars($hesklang['hesk_url']); ?>"
name="s_hesk_url" size="40" maxlength="255"
value="<?php echo $hesk_settings['hesk_url']; ?>"/>
</div>
</div>
<div class="form-group">
<label for="s_admin_dir" class="col-sm-3 control-label"><?php echo $hesklang['adf']; ?> <a
href="Javascript:void(0)"
@ -3745,18 +3745,30 @@ $modsForHesk_settings = mfh_getSettings();
<div class="col-sm-9 col-xs-7">
<select name="admin-color-scheme" class="form-control">
<option value="skin-blue">Blue</option>
<option value="skin-blue-light">Blue (Light)</option>
<option value="skin-yellow">Yellow</option>
<option value="skin-yellow-light">Yellow (Light)</option>
<option value="skin-green">Green</option>
<option value="skin-green-light">Green (Light)</option>
<option value="skin-purple">Purple</option>
<option value="skin-purple-light">Purple (Light)</option>
<option value="skin-red">Red</option>
<option value="skin-red-light">Red (Light)</option>
<option value="skin-black">Black</option>
<option value="skin-black-light">Black (Light)</option>
<option value="skin-blue"
<?php if ($modsForHesk_settings['admin_color_scheme'] == 'skin-blue') { echo 'selected'; } ?>>Blue</option>
<option value="skin-blue-light"
<?php if ($modsForHesk_settings['admin_color_scheme'] == 'skin-blue-light') { echo 'selected'; } ?>>Blue (Light)</option>
<option value="skin-yellow"
<?php if ($modsForHesk_settings['admin_color_scheme'] == 'skin-yellow') { echo 'selected'; } ?>>Yellow</option>
<option value="skin-yellow-light"
<?php if ($modsForHesk_settings['admin_color_scheme'] == 'skin-yellow-light') { echo 'selected'; } ?>>Yellow (Light)</option>
<option value="skin-green"
<?php if ($modsForHesk_settings['admin_color_scheme'] == 'skin-green') { echo 'selected'; } ?>>Green</option>
<option value="skin-green-light"
<?php if ($modsForHesk_settings['admin_color_scheme'] == 'skin-green-light') { echo 'selected'; } ?>>Green (Light)</option>
<option value="skin-purple"
<?php if ($modsForHesk_settings['admin_color_scheme'] == 'skin-purple') { echo 'selected'; } ?>>Purple</option>
<option value="skin-purple-light"
<?php if ($modsForHesk_settings['admin_color_scheme'] == 'skin-purple-light') { echo 'selected'; } ?>>Purple (Light)</option>
<option value="skin-red"
<?php if ($modsForHesk_settings['admin_color_scheme'] == 'skin-red') { echo 'selected'; } ?>>Red</option>
<option value="skin-red-light"
<?php if ($modsForHesk_settings['admin_color_scheme'] == 'skin-red-light') { echo 'selected'; } ?>>Red (Light)</option>
<option value="skin-black"
<?php if ($modsForHesk_settings['admin_color_scheme'] == 'skin-black') { echo 'selected'; } ?>>Black</option>
<option value="skin-black-light"
<?php if ($modsForHesk_settings['admin_color_scheme'] == 'skin-black-light') { echo 'selected'; } ?>>Black (Light)</option>
</select>
</div>
<script>
@ -3831,7 +3843,7 @@ $modsForHesk_settings = mfh_getSettings();
}
// No cached file or older than 3600 seconds, try to get an update
$hesk_version_url = 'http://heskcom.s3.amazonaws.com/hesk_version.txt';
$hesk_version_url = 'https://hesk.com/version';
// Try using cURL
if (function_exists('curl_init')) {
@ -3845,7 +3857,7 @@ $modsForHesk_settings = mfh_getSettings();
}
// Try using a simple PHP function instead
if ($latest = file_get_contents($hesk_version_url)) {
if ($latest = @file_get_contents($hesk_version_url)) {
return hesk_cacheLatestVersion($latest);
}

@ -52,6 +52,9 @@ $set = array();
$set['site_title'] = hesk_input(hesk_POST('s_site_title'), $hesklang['err_sname']);
$set['site_title'] = str_replace('\\&quot;', '&quot;', $set['site_title']);
$set['site_url'] = hesk_input(hesk_POST('s_site_url'), $hesklang['err_surl']);
$set['hesk_title'] = hesk_input(hesk_POST('s_hesk_title'), $hesklang['err_htitle']);
$set['hesk_title'] = str_replace('\\&quot;', '&quot;', $set['hesk_title']);
$set['hesk_url'] = rtrim(hesk_input(hesk_POST('s_hesk_url'), $hesklang['err_hurl']), '/');
$set['webmaster_mail'] = hesk_validateEmail(hesk_POST('s_webmaster_mail'), $hesklang['err_wmmail']);
$set['noreply_mail'] = hesk_validateEmail(hesk_POST('s_noreply_mail'), $hesklang['err_nomail']);
$set['noreply_name'] = hesk_input(hesk_POST('s_noreply_name'));
@ -78,11 +81,6 @@ if (hesk_testMySQL()) {
/*** HELP DESK ***/
/* --> Helpdesk settings */
$set['hesk_title'] = hesk_input(hesk_POST('s_hesk_title'), $hesklang['err_htitle']);
$set['hesk_title'] = str_replace('\\&quot;', '&quot;', $set['hesk_title']);
$set['hesk_url'] = rtrim(hesk_input(hesk_POST('s_hesk_url'), $hesklang['err_hurl']), '/');
// ---> check admin folder
$set['admin_dir'] = isset($_POST['s_admin_dir']) && !is_array($_POST['s_admin_dir']) ? preg_replace('/[^a-zA-Z0-9_-]/', '', $_POST['s_admin_dir']) : 'admin';
/*
@ -544,6 +542,8 @@ $settings_file_content = '<?php
// --> General settings
$hesk_settings[\'site_title\']=\'' . $set['site_title'] . '\';
$hesk_settings[\'site_url\']=\'' . $set['site_url'] . '\';
$hesk_settings[\'hesk_title\']=\'' . $set['hesk_title'] . '\';
$hesk_settings[\'hesk_url\']=\'' . $set['hesk_url'] . '\';
$hesk_settings[\'webmaster_mail\']=\'' . $set['webmaster_mail'] . '\';
$hesk_settings[\'noreply_mail\']=\'' . $set['noreply_mail'] . '\';
$hesk_settings[\'noreply_name\']=\'' . $set['noreply_name'] . '\';
@ -566,8 +566,6 @@ $hesk_settings[\'db_vrsn\']=' . $set['db_vrsn'] . ';
// ==> HELP DESK
// --> Help desk settings
$hesk_settings[\'hesk_title\']=\'' . $set['hesk_title'] . '\';
$hesk_settings[\'hesk_url\']=\'' . $set['hesk_url'] . '\';
$hesk_settings[\'admin_dir\']=\'' . $set['admin_dir'] . '\';
$hesk_settings[\'attach_dir\']=\'' . $set['attach_dir'] . '\';
$hesk_settings[\'cache_dir\']=\'' . $set['cache_dir'] . '\';
@ -708,8 +706,8 @@ $hesk_settings[\'open_only\']=' . $set['open_only'] . ';
$hesk_settings[\'ticket_list\']=array(' . $set['ticket_list'] . ');
// --> Other
$hesk_settings[\'submittedformat\']=\'' . $set['submittedformat'] . '\';
$hesk_settings[\'updatedformat\']=\'' . $set['updatedformat'] . '\';
$hesk_settings[\'submittedformat\']=' . $set['submittedformat'] . ';
$hesk_settings[\'updatedformat\']=' . $set['updatedformat'] . ';
// ==> MISC

@ -1171,14 +1171,14 @@ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
<?php endif; ?>
</div>
<?php
/* Do we need or have any canned responses? */
$can_options = hesk_printCanned();
/* Reply form on top? */
if ($can_reply && $hesk_settings['reply_top'] == 1) {
hesk_printReplyForm();
}
/* Do we need or have any canned responses? */
$can_options = hesk_printCanned();
hesk_printTicketReplies();
echo '<br>';

@ -41,9 +41,12 @@ require(HESK_PATH . 'inc/knowledgebase_functions.inc.php');
require(HESK_PATH . 'inc/mail_functions.inc.php');
hesk_load_database_functions();
hesk_session_start();
hesk_dbConnect();
hesk_isLoggedIn();
hesk_kb_preheader();
/* Is Knowledgebase enabled? */
if ( ! $hesk_settings['kb_enable'])
@ -109,14 +112,17 @@ exit();
/*** START FUNCTIONS ***/
function hesk_kb_header($kb_link, $catid=1)
{
function hesk_kb_preheader() {
global $hesk_settings, $hesklang, $can_man_kb;
/* Print admin navigation */
require_once(HESK_PATH . 'inc/headerAdmin.inc.php');
require_once(HESK_PATH . 'inc/headerAdmin.inc.php');
require_once(HESK_PATH . 'inc/show_admin_nav.inc.php');
}
function hesk_kb_header($kb_link, $catid=1)
{
global $hesk_settings, $hesklang, $can_man_kb;
?>
<ol class="breadcrumb">
@ -130,12 +136,9 @@ function hesk_kb_header($kb_link, $catid=1)
?>
<li class="active"><?php echo $kb_link; ?></li>
</ol>
<?php show_subnav('view', $catid); ?>
<section style="padding: 15px;">
<?php hesk_kbSearchLarge(1); ?>
</section>
<?php
<?php
show_subnav('view', $catid);
hesk_kbSearchLarge(1);
} // END hesk_kb_header()
@ -145,13 +148,12 @@ function hesk_kb_search($query)
define('HESK_NO_ROBOTS',1);
hesk_kb_header($hesk_settings['kb_link']);
$res = hesk_dbQuery('SELECT t1.`id`, t1.`subject`, LEFT(`t1`.`content`, '.max(200, $hesk_settings['kb_substrart'] * 2).') AS `content`, t1.`rating` FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'kb_articles` AS t1 LEFT JOIN `'.hesk_dbEscape($hesk_settings['db_pfix']).'kb_categories` AS t2 ON t1.`catid` = t2.`id` '." WHERE t1.`type` IN ('0','1') AND MATCH(`subject`,`content`,`keywords`) AGAINST ('".hesk_dbEscape($query)."') LIMIT ".intval($hesk_settings['kb_search_limit']));
$num = hesk_dbNumRows($res);
$show_default_category = false;
?>
<div class="content-wrapper">
<?php hesk_kb_header($hesk_settings['kb_link']); ?>
<section style="padding: 15px">
<div class="box">
<div class="box-header with-border">
@ -225,13 +227,13 @@ function hesk_show_kb_article($artid)
// Print header
$hesk_settings['tmp_title'] = $article['subject'];
hesk_kb_header($hesk_settings['kb_link'], $article['catid']);
// Update views by 1
hesk_dbQuery('UPDATE `'.hesk_dbEscape($hesk_settings['db_pfix'])."kb_articles` SET `views`=`views`+1 WHERE `id`={$artid}");
?>
<div class="content-wrapper">
<?php hesk_kb_header($hesk_settings['kb_link'], $article['catid']); ?>
<section class="content">
<div class="box">
<div class="box-header with-border">
@ -404,17 +406,17 @@ function hesk_show_kb_article($artid)
function hesk_show_kb_category($catid, $is_search = 0) {
global $hesk_settings, $hesklang;
if ($is_search == 0)
{
/* Print header */
hesk_kb_header($hesk_settings['kb_link'], $catid);
}
$res = hesk_dbQuery("SELECT `name`,`parent` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."kb_categories` WHERE `id`='".intval($catid)."' LIMIT 1");
$thiscat = hesk_dbFetchAssoc($res) or hesk_error($hesklang['kb_cat_inv']);
?>
<div class="content-wrapper">
<?php
if ($is_search == 0)
{
/* Print header */
hesk_kb_header($hesk_settings['kb_link'], $catid);
} ?>
<section class="content">
<?php if ($thiscat['parent']): ?>
<h3><?php echo $hesklang['kb_cat'].': '.$thiscat['name']; ?></h3>

@ -1,4 +1,4 @@
<?php
// Define the current build
define('MODS_FOR_HESK_BUILD', 34);
define('MODS_FOR_HESK_BUILD', 35);

@ -104,8 +104,15 @@
margin-top: 10px;
}
.dropdown-empty {
padding: 10%;
color: #ddd;
font-weight: bolder;
}
.attachment-table > tbody > tr > td > i {
.attachment-table > tbody > tr > td > i,
.dropdown-empty > i {
color: #ddd;
text-shadow: 2px 2px #ccc;
}
@ -166,7 +173,8 @@ button.dropdown-submit {
}
.login-box {
width: 500px;
width: 35%;
min-width: 350px;
}
.login-box-body {
@ -245,6 +253,10 @@ div.ticket-info {
display: block;
}
[class*="-light"] div.ticket-info {
color: #444;
}
.event-category:hover {
border: solid 1px #fff !important;
cursor: pointer;
@ -265,4 +277,8 @@ div.ticket-info {
.box-header h1.box-title {
width: 100%;
cursor: pointer;
}
.black {
color: black;
}

@ -196,8 +196,7 @@ function hesk_suggestKB() {
xmlHttp.send(params);
}
setTimeout('hesk_suggestKB();', 2000);
setTimeout(function() { hesk_suggestKB(); }, 2000);
}
function hesk_suggestKBsearch(isAdmin) {
@ -238,7 +237,7 @@ function hesk_suggestKBsearch(isAdmin) {
xmlHttp.send(params);
}
setTimeout('hesk_suggestKBsearch(' + isAdmin + ');', 2000);
setTimeout(function() { hesk_suggestKBsearch(isAdmin); }, 2000);
}
function hesk_suggestEmail(emailField, displayDiv, padDiv, isAdmin, allowMultiple) {

@ -43,12 +43,6 @@ if (defined('AUTOFOCUS'))
<?php
}
// Users online
if (defined('SHOW_ONLINE'))
{
hesk_printOnline();
}
// The closing div here is to close the content area on each page. Annoying, but necessary.
if (defined('ADMIN_PAGE')) {
echo '

@ -79,38 +79,38 @@ if (is_dir(HESK_PATH . 'install')) {
<link href="<?php echo HESK_PATH; ?>css/hesk_newStyle.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>" type="text/css"
rel="stylesheet"/>
<?php } ?>
<link href="<?php echo HESK_PATH; ?>css/bootstrap-iconpicker.min.css" rel="stylesheet">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/octicons.css" type="text/css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/dropzone.min.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/dropzone-basic.min.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/fullcalendar.min.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/bootstrap-clockpicker.min.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/jquery.jgrowl.min.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/bootstrap-colorpicker.min.css">
<link href="<?php echo HESK_PATH; ?>css/bootstrap-iconpicker.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>" rel="stylesheet">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>" rel="stylesheet">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/octicons.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>" type="text/css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/dropzone.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/dropzone-basic.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/fullcalendar.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/bootstrap-clockpicker.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/jquery.jgrowl.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/bootstrap-colorpicker.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<?php if (defined('USE_JQUERY_2')): ?>
<script src="<?php echo HESK_PATH; ?>js/jquery-2.2.4.min.js"></script>
<script src="<?php echo HESK_PATH; ?>js/jquery-2.2.4.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<?php else: ?>
<script src="<?php echo HESK_PATH; ?>js/jquery-1.10.2.min.js"></script>
<script src="<?php echo HESK_PATH; ?>js/jquery-1.10.2.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<?php endif; ?>
<script language="Javascript" type="text/javascript" src="<?php echo HESK_PATH; ?>hesk_javascript.js"></script>
<script language="Javascript" type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap.min.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/dropzone.min.js"></script>
<script language="Javascript" type="text/javascript" src="<?php echo HESK_PATH; ?>hesk_javascript.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script language="Javascript" type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/dropzone.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script language="Javascript" type="text/javascript"
src="<?php echo HESK_PATH; ?>js/modsForHesk-javascript.js"></script>
src="<?php echo HESK_PATH; ?>js/modsForHesk-javascript.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script language="JavaScript" type="text/javascript"
src="<?php echo HESK_PATH; ?>js/bootstrap-datepicker.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-clockpicker.min.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/iconset-fontawesome-4.3.0.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/iconset-octicon-2.1.2.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-iconpicker.js"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/platform.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-validator.min.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>internal-api/js/core.php"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/jquery.jgrowl.min.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-colorpicker.min.js"></script>
src="<?php echo HESK_PATH; ?>js/bootstrap-datepicker.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-clockpicker.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/iconset-fontawesome-4.3.0.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/iconset-octicon-2.1.2.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-iconpicker.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/platform.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-validator.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>internal-api/js/core.php?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/jquery.jgrowl.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-colorpicker.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<style>
.navbar-default {
background-color: <?php echo $modsForHesk_settings['navbarBackgroundColor']; ?>;
@ -338,7 +338,5 @@ if ($modsForHesk_settings['show_icons']) {
?>
</div>
<?php } ?>
</div>
<!-- /.navbar-collapse -->
</nav>

@ -46,48 +46,48 @@ $modsForHesk_settings = mfh_getSettings();
<meta http-equiv="Content-Type" content="text/html;charset=<?php echo $hesklang['ENCODING']; ?>"/>
<meta name="viewport" content="width=device-width, user-scalable=no">
<meta name="theme-color" content="<?php echo '#414a5c'; ?>">
<link href="<?php echo HESK_PATH; ?>css/datepicker.css" type="text/css" rel="stylesheet"/>
<link href="<?php echo HESK_PATH; ?>css/bootstrap.css?v=21" type="text/css" rel="stylesheet"/>
<link href="<?php echo HESK_PATH; ?>css/bootstrap-iconpicker.min.css" rel="stylesheet">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/octicons.css" type="text/css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/dropzone.min.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/dropzone-basic.min.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/fullcalendar.min.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/bootstrap-clockpicker.min.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/jquery.jgrowl.min.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/bootstrap-colorpicker.min.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/AdminLTE.min.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/skins/_all-skins.min.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/mods-for-hesk-new.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/colors.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/positions.css">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/displays.css">
<link href="<?php echo HESK_PATH; ?>css/datepicker.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>" type="text/css" rel="stylesheet"/>
<link href="<?php echo HESK_PATH; ?>css/bootstrap.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>" type="text/css" rel="stylesheet"/>
<link href="<?php echo HESK_PATH; ?>css/bootstrap-iconpicker.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>" rel="stylesheet">
<link href="//netdna.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>" rel="stylesheet">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/octicons.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>" type="text/css">
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/dropzone.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/dropzone-basic.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/fullcalendar.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/bootstrap-clockpicker.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/jquery.jgrowl.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/bootstrap-colorpicker.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/AdminLTE.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/skins/_all-skins.min.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/mods-for-hesk-new.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/colors.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/positions.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<link rel="stylesheet" href="<?php echo HESK_PATH; ?>css/displays.css?v=<?php echo MODS_FOR_HESK_BUILD; ?>">
<?php if (defined('USE_JQUERY_2')): ?>
<script src="<?php echo HESK_PATH; ?>js/jquery-2.2.4.min.js"></script>
<script src="<?php echo HESK_PATH; ?>js/jquery-2.2.4.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<?php else: ?>
<script src="<?php echo HESK_PATH; ?>js/jquery-1.10.2.min.js"></script>
<script src="<?php echo HESK_PATH; ?>js/jquery-1.10.2.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<?php endif; ?>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/adminlte.min.js"></script>
<script language="Javascript" type="text/javascript" src="<?php echo HESK_PATH; ?>hesk_javascript.js"></script>
<script language="Javascript" type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap.min.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/dropzone.min.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/adminlte.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script language="Javascript" type="text/javascript" src="<?php echo HESK_PATH; ?>hesk_javascript.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script language="Javascript" type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/dropzone.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script language="Javascript" type="text/javascript"
src="<?php echo HESK_PATH; ?>js/modsForHesk-javascript.js"></script>
src="<?php echo HESK_PATH; ?>js/modsForHesk-javascript.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script language="JavaScript" type="text/javascript"
src="<?php echo HESK_PATH; ?>js/bootstrap-datepicker.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-clockpicker.min.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/iconset-fontawesome-4.3.0.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/iconset-octicon-2.1.2.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-iconpicker.js"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/platform.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-validator.min.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>internal-api/js/core-admin.php"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/jquery.jgrowl.min.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-colorpicker.min.js"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/jquery.slimscroll.min.js"></script>
src="<?php echo HESK_PATH; ?>js/bootstrap-datepicker.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-clockpicker.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/iconset-fontawesome-4.3.0.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/iconset-octicon-2.1.2.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-iconpicker.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/platform.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-validator.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>internal-api/js/core-admin.php?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/jquery.jgrowl.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/bootstrap-colorpicker.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/jquery.slimscroll.min.js?v=<?php echo MODS_FOR_HESK_BUILD; ?>"></script>
<?php
if (defined('EXTRA_JS')) {
echo EXTRA_JS;
@ -144,6 +144,11 @@ $modsForHesk_settings = mfh_getSettings();
<?php
}
// Use ReCaptcha API v2?
if (defined('RECAPTCHA')) {
echo '<script src="https://www.google.com/recaptcha/api.js?hl=' . $hesklang['RECAPTCHA'] . '" async defer></script>';
}
if (defined('VALIDATOR')) {
?>
<script type="text/javascript" src="<?php echo HESK_PATH; ?>js/validation-scripts.js"></script>

@ -89,12 +89,6 @@ function hesk_kbTopArticles($how_many, $index = 1)
</thead>
<tbody>
<?php
/* Get list of articles from the database */
$res = hesk_dbQuery("SELECT `t1`.`id`,`t1`.`subject`,`t1`.`dt`, `t1`.`views`,`t1`.`sticky` FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "kb_articles` AS `t1`
LEFT JOIN `" . hesk_dbEscape($hesk_settings['db_pfix']) . "kb_categories` AS `t2` ON `t1`.`catid` = `t2`.`id`
WHERE `t1`.`type`='0' AND `t2`.`type`='0'
ORDER BY `t1`.`sticky` DESC, `t1`.`views` DESC, `t1`.`art_order` ASC LIMIT " . intval($how_many));
/* If no results found end here */
if (hesk_dbNumRows($res) == 0) {
$colspan = '';
@ -109,7 +103,13 @@ function hesk_kbTopArticles($how_many, $index = 1)
if (!$hesk_settings['kb_views']) {
$colspan = 'colspan="2"';
}
// Remember what articles are printed for "Top" so we don't print them again in "Latest"
$hesk_settings['kb_top_articles_printed'] = array();
while ($article = hesk_dbFetchAssoc($res)) {
$hesk_settings['kb_top_articles_printed'][] = $article['id'];
$icon = 'fa fa-file';
$style = '';
@ -176,6 +176,12 @@ function hesk_kbLatestArticles($how_many, $index = 1)
<thead>
<tr>
<?php
// Don't include articles that have already been printed under "Top" articles
$sql_top = '';
if (isset($hesk_settings['kb_top_articles_printed']) && count($hesk_settings['kb_top_articles_printed'])) {
$sql_top = ' AND `t1`.`id` NOT IN ('.implode(',', $hesk_settings['kb_top_articles_printed']).')';
}
$colspan = '';
if (!$hesk_settings['kb_date']) {
$colspan = 'colspan="2"';
@ -183,7 +189,7 @@ function hesk_kbLatestArticles($how_many, $index = 1)
/* Get list of articles from the database */
$res = hesk_dbQuery("SELECT `t1`.* FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "kb_articles` AS `t1`
LEFT JOIN `" . hesk_dbEscape($hesk_settings['db_pfix']) . "kb_categories` AS `t2` ON `t1`.`catid` = `t2`.`id`
WHERE `t1`.`type`='0' AND `t2`.`type`='0'
WHERE `t1`.`type`='0' AND `t2`.`type`='0' {$sql_top}
ORDER BY `t1`.`dt` DESC LIMIT " . intval($how_many));
/* Show number of views? */
@ -198,11 +204,6 @@ function hesk_kbLatestArticles($how_many, $index = 1)
</thead>
<tbody>
<?php
/* Get list of articles from the database */
$res = hesk_dbQuery("SELECT `t1`.* FROM `" . hesk_dbEscape($hesk_settings['db_pfix']) . "kb_articles` AS `t1`
LEFT JOIN `" . hesk_dbEscape($hesk_settings['db_pfix']) . "kb_categories` AS `t2` ON `t1`.`catid` = `t2`.`id`
WHERE `t1`.`type`='0' AND `t2`.`type`='0'
ORDER BY `t1`.`dt` DESC LIMIT " . intval($how_many));
/* If no results found end here */
if (hesk_dbNumRows($res) == 0) {

@ -378,12 +378,12 @@ function hesk_stripQuotedText($message)
function hesk_isReturnedEmail($tmpvar)
{
// Check noreply email addresses
if (preg_match('/not?[\-_]reply@/i', $tmpvar['email'])) {
if (preg_match('/not?[\-_\.]?reply@/i', $tmpvar['email'])) {
return true;
}
// Check mailer daemon email addresses
if (preg_match('/mail(er)?[\-_]daemon@/i', $tmpvar['email'])) {
if (preg_match('/mail(er)?[\-_\.]?daemon@/i', $tmpvar['email'])) {
return true;
}

@ -188,7 +188,14 @@ $mails = mfh_get_mail_headers_for_dropdown($_SESSION['id'], $hesk_settings, $hes
</li>
</ul>
</li>
<?php endif; ?>
<?php
endif;
// Users online
if (defined('SHOW_ONLINE')) {
hesk_printOnline();
}
?>
<li class="dropdown messages-menu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-envelope-o"></i>
@ -197,16 +204,30 @@ $mails = mfh_get_mail_headers_for_dropdown($_SESSION['id'], $hesk_settings, $hes
<?php endif; ?>
</a>
<ul class="dropdown-menu">
<?php if (count($mails) > 0): ?>
<li class="header"><?php echo sprintf($hesklang['you_have_x_messages'],
count($mails),
count($mails) == 1
? $hesklang['message_lower_case']
: $hesklang['messages_lower_case']); ?></li>
<?php endif; ?>
<!-- Begin New Messages -->
<li>
<!-- inner menu: contains the actual data -->
<ul class="menu">
<?php foreach ($mails as $mail): ?>
<?php if (count($mails) == 0): ?>
<div class="text-center dropdown-empty">
<i class="fa fa-envelope-o fa-3x"></i><br>
<span class="fa-2x">
<?php echo sprintf($hesklang['you_have_x_messages'],
count($mails),
$hesklang['messages_lower_case']); ?>
</span>
</div>
<?php
endif;
foreach ($mails as $mail):
?>
<li><!-- start message -->
<a href="mail.php?a=read&id=<?php echo $mail['id']; ?>">
<h4>

@ -25,11 +25,13 @@ if (!isset($admins)) {
}
/* List of categories */
$orderBy = $modsForHesk_settings['category_order_column'];
$hesk_settings['categories'] = array();
$res2 = hesk_dbQuery('SELECT `id`, `name` FROM `' . hesk_dbEscape($hesk_settings['db_pfix']) . 'categories` WHERE ' . hesk_myCategories('id') . ' ORDER BY `' . $orderBy . '` ASC');
while ($row = hesk_dbFetchAssoc($res2)) {
$hesk_settings['categories'][$row['id']] = $row['name'];
if ( ! isset($hesk_settings['categories'])) {
$orderBy = $modsForHesk_settings['category_order_column'];
$hesk_settings['categories'] = array();
$res2 = hesk_dbQuery('SELECT `id`, `name` FROM `' . hesk_dbEscape($hesk_settings['db_pfix']) . 'categories` WHERE ' . hesk_myCategories('id') . ' ORDER BY `' . $orderBy . '` ASC');
while ($row = hesk_dbFetchAssoc($res2)) {
$hesk_settings['categories'][$row['id']] = $row['name'];
}
}
/* Current MySQL time */

@ -0,0 +1,153 @@
<?php
/**
*
* This file is part of HESK - PHP Help Desk Software.
*
* (c) Copyright Klemen Stirn. All rights reserved.
* http://www.hesk.com
*
* For the full copyright and license agreement information visit
* http://www.hesk.com/eula.php
*
*/
/* Check if this is a valid include */
if (!defined('IN_SCRIPT')) {die('Invalid attempt');}
function hesk_initOnline($user_id)
{
global $hesk_settings, $hesklang;
/* Set user to online */
hesk_setOnline($user_id);
/* Can this user view online staff? */
if (hesk_checkPermission('can_view_online',0))
{
$hesk_settings['users_online'] = hesk_listOnline();
define('SHOW_ONLINE',1);
}
return true;
} // END hesk_initOnline()
function hesk_printOnline() {
global $hesk_settings, $hesklang;
?>
<li class="dropdown messages-menu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-users"></i>
<span class="label label-danger"><?php echo count($hesk_settings['users_online']); ?></span>
</a>
<ul class="dropdown-menu">
<li class="header"><?php echo $hesklang['onlinep']; ?></li>
<li>
<ul class="menu">
<?php foreach ($hesk_settings['users_online'] as $tmp): ?>
<li>
<?php $link = ($tmp['id'] == $_SESSION['id']) ? '' : ' href="mail.php?a=new&id='.$tmp['id'].'"'; ?>
<a<?php echo $link; ?>>
<div class="pull-left">
<i class="fa fa-user fa-2x black"></i>
</div>
<h4><?php echo $tmp['name']; ?></h4>
<?php
if ($tmp['isadmin']): ?>
<p>
<span class="label label-default">
<?php echo $hesklang['administrator']; ?>
</span>
</p>
<?php elseif ($tmp['id'] == $_SESSION['id']): ?>
<!--<span class="badge badge-default">You</span>-->
<?php endif; ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</li>
</ul>
</li>
<?php
} // END hesk_printOnline()
function hesk_listOnline($list_names=1)
{
global $hesk_settings, $hesklang, $hesk_db_link;
$users_online = array();
/* Clean expired entries */
hesk_cleanOnline();
/* Get a list of online users */
/* --> With names */
if ($list_names)
{
$res = hesk_dbQuery("SELECT `t1`.`user_id` , `t2`.`name` , `t2`.`isadmin` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."online` AS `t1` INNER JOIN `".hesk_dbEscape($hesk_settings['db_pfix'])."users` AS `t2` ON `t1`.`user_id` = `t2`.`id`");
while ($tmp = hesk_dbFetchAssoc($res))
{
$users_online[$tmp['user_id']] = array(
'id' => $tmp['user_id'],
'name' => $tmp['name'],
'isadmin' => $tmp['isadmin']
);
}
}
/* --> Without names */
else
{
$res = hesk_dbQuery("SELECT `user_id` FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."online`");
while ($tmp = hesk_dbFetchAssoc($res))
{
$users_online[] = $tmp['user_id'];
}
}
return $users_online;
} // END hesk_listOnline()
function hesk_setOnline($user_id)
{
global $hesk_settings, $hesklang, $hesk_db_link;
/* If already online just update... */
hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."online` SET `tmp` = `tmp` + 1 WHERE `user_id` = '".intval($user_id)."'");
/* ... else insert a new entry */
if ( ! hesk_dbAffectedRows() )
{
hesk_dbQuery("INSERT INTO `".hesk_dbEscape($hesk_settings['db_pfix'])."online` (`user_id`) VALUES (".intval($user_id).") ");
}
return true;
} // END hesk_setOnline()
function hesk_setOffline($user_id)
{
global $hesk_settings, $hesklang, $hesk_db_link;
/* If already online just update... */
hesk_dbQuery("DELETE FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."online` WHERE `user_id` = '".intval($user_id)."'");
return true;
} // END hesk_setOffline()
function hesk_cleanOnline()
{
global $hesk_settings, $hesklang, $hesk_db_link;
/* Delete old rows from the database */
hesk_dbQuery("DELETE FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."online` WHERE `dt` < ( NOW() - INTERVAL ".intval($hesk_settings['online_min'])." MINUTE) ");
return true;
} // END hesk_cleanOnline()

@ -36,8 +36,8 @@
if (!defined('IN_SCRIPT')) {die('Invalid attempt');}
// We will be installing this HESK version:
define('HESK_NEW_VERSION','2.7.1');
define('MODS_FOR_HESK_NEW_VERSION','3.0.0');
define('HESK_NEW_VERSION','2.7.2');
define('MODS_FOR_HESK_NEW_VERSION','3.0.1');
define('REQUIRE_PHP_VERSION','5.3.0');
define('REQUIRE_MYSQL_VERSION','5.0.7');
@ -59,908 +59,4 @@ require(HESK_PATH . 'inc/setup_functions.inc.php');
hesk_load_database_functions();
// Start the session
hesk_session_start();
// ******* FUNCTIONS ******* //
function hesk_iTestDatabaseConnection()
{
global $hesk_settings, $hesklang;
$db_success = 1;
$hesk_settings['db_host'] = hesk_input( hesk_POST('host') );
$hesk_settings['db_name'] = hesk_input( hesk_POST('name') );
$hesk_settings['db_user'] = hesk_input( hesk_POST('user') );
$hesk_settings['db_pass'] = hesk_input( hesk_POST('pass') );
// Allow & in password
$hesk_settings['db_pass'] = str_replace('&amp;', '&', $hesk_settings['db_pass']);
// Use MySQLi extension to connect?
$use_mysqli = function_exists('mysqli_connect') ? true : false;
// Start output buffering
ob_start();
// Connect to database
if ($use_mysqli)
{
// Do we need a special port? Check and connect to the database
if ( strpos($hesk_settings['db_host'], ':') )
{
list($hesk_settings['db_host'], $hesk_settings['db_port']) = explode(':', $hesk_settings['db_host']);
$hesk_db_link = mysqli_connect($hesk_settings['db_host'], $hesk_settings['db_user'], $hesk_settings['db_pass'], $hesk_settings['db_name'], intval($hesk_settings['db_port']) ) or $db_success=0;
}
else
{
$hesk_db_link = mysqli_connect($hesk_settings['db_host'], $hesk_settings['db_user'], $hesk_settings['db_pass'], $hesk_settings['db_name']) or $db_success=0;
}
}
else
{
$hesk_db_link = mysql_connect($hesk_settings['db_host'],$hesk_settings['db_user'], $hesk_settings['db_pass']) or $db_success=0;
// Select database works OK?
if ($db_success == 1 && ! mysql_select_db($hesk_settings['db_name'], $hesk_db_link) )
{
// No, try to create the database
if (function_exists('mysql_create_db') && mysql_create_db($hesk_settings['db_name'], $hesk_db_link))
{
if (mysql_select_db($hesk_settings['db_name'], $hesk_db_link))
{
$db_success = 1;
}
else
{
$db_success = 0;
}
}
else
{
$db_success = 0;
}
}
}
ob_end_clean();
// Any errors?
if ( ! $db_success)
{
global $mysql_log;
$mysql_log = $use_mysqli ? mysqli_connect_error() : mysql_error();
hesk_iDatabase(1);
}
// Check MySQL version
define('MYSQL_VERSION', hesk_dbResult( hesk_dbQuery('SELECT VERSION() AS version') ) );
if ( version_compare(MYSQL_VERSION,REQUIRE_MYSQL_VERSION,'<') )
{
hesk_iDatabase(5);
}
return $hesk_db_link;
} // END hesk_iTestDatabaseConnection()
function hesk_iSaveSettingsFile($set)
{
global $hesk_settings, $hesklang;
$settings_file_content='<?php
// Settings file for HESK ' . $set['hesk_version'] . '
// ==> GENERAL
// --> General settings
$hesk_settings[\'site_title\']=\'' . $set['site_title'] . '\';
$hesk_settings[\'site_url\']=\'' . $set['site_url'] . '\';
$hesk_settings[\'webmaster_mail\']=\'' . $set['webmaster_mail'] . '\';
$hesk_settings[\'noreply_mail\']=\'' . $set['noreply_mail'] . '\';
$hesk_settings[\'noreply_name\']=\'' . $set['noreply_name'] . '\';
// --> Language settings
$hesk_settings[\'can_sel_lang\']=' . $set['can_sel_lang'] . ';
$hesk_settings[\'language\']=\'' . $set['language'] . '\';
$hesk_settings[\'languages\']=array(
\'English\' => array(\'folder\'=>\'en\',\'hr\'=>\'------ Reply above this line ------\'),
);
// --> Database settings
$hesk_settings[\'db_host\']=\'' . $set['db_host'] . '\';
$hesk_settings[\'db_name\']=\'' . $set['db_name'] . '\';
$hesk_settings[\'db_user\']=\'' . $set['db_user'] . '\';
$hesk_settings[\'db_pass\']=\'' . $set['db_pass'] . '\';
$hesk_settings[\'db_pfix\']=\'' . $set['db_pfix'] . '\';
$hesk_settings[\'db_vrsn\']=' . $set['db_vrsn'] . ';
// ==> HELP DESK
// --> Help desk settings
$hesk_settings[\'hesk_title\']=\'' . $set['hesk_title'] . '\';
$hesk_settings[\'hesk_url\']=\'' . $set['hesk_url'] . '\';
$hesk_settings[\'admin_dir\']=\'' . $set['admin_dir'] . '\';
$hesk_settings[\'attach_dir\']=\'' . $set['attach_dir'] . '\';
$hesk_settings[\'max_listings\']=' . $set['max_listings'] . ';
$hesk_settings[\'print_font_size\']=' . $set['print_font_size'] . ';
$hesk_settings[\'autoclose\']=' . $set['autoclose'] . ';
$hesk_settings[\'max_open\']=' . $set['max_open'] . ';
$hesk_settings[\'new_top\']=' . $set['new_top'] . ';
$hesk_settings[\'reply_top\']=' . $set['reply_top'] . ';
// --> Features
$hesk_settings[\'autologin\']=' . $set['autologin'] . ';
$hesk_settings[\'autoassign\']=' . $set['autoassign'] . ';
$hesk_settings[\'custclose\']=' . $set['custclose'] . ';
$hesk_settings[\'custopen\']=' . $set['custopen'] . ';
$hesk_settings[\'rating\']=' . $set['rating'] . ';
$hesk_settings[\'cust_urgency\']=' . $set['cust_urgency'] . ';
$hesk_settings[\'sequential\']=' . $set['sequential'] . ';
$hesk_settings[\'time_worked\']=' . $set['time_worked'] . ';
$hesk_settings[\'spam_notice\']=' . $set['spam_notice'] . ';
$hesk_settings[\'list_users\']=' . $set['list_users'] . ';
$hesk_settings[\'debug_mode\']=' . $set['debug_mode'] . ';
$hesk_settings[\'short_link\']=' . $set['short_link'] . ';
$hesk_settings[\'select_cat\']=' . $set['select_cat'] . ';
$hesk_settings[\'select_pri\']=' . $set['select_pri'] . ';
// --> SPAM Prevention
$hesk_settings[\'secimg_use\']=' . $set['secimg_use'] . ';
$hesk_settings[\'secimg_sum\']=\'' . $set['secimg_sum'] . '\';
$hesk_settings[\'recaptcha_use\']=' . $set['recaptcha_use'] . ';
$hesk_settings[\'recaptcha_public_key\']=\'' . $set['recaptcha_public_key'] . '\';
$hesk_settings[\'recaptcha_private_key\']=\'' . $set['recaptcha_private_key'] . '\';
$hesk_settings[\'question_use\']=' . $set['question_use'] . ';
$hesk_settings[\'question_ask\']=\'' . $set['question_ask'] . '\';
$hesk_settings[\'question_ans\']=\'' . $set['question_ans'] . '\';
// --> Security
$hesk_settings[\'attempt_limit\']=' . $set['attempt_limit'] . ';
$hesk_settings[\'attempt_banmin\']=' . $set['attempt_banmin'] . ';
$hesk_settings[\'reset_pass\']=' . $set['reset_pass'] . ';
$hesk_settings[\'email_view_ticket\']=' . $set['email_view_ticket'] . ';
// --> Attachments
$hesk_settings[\'attachments\']=array (
\'use\' => ' . $set['attachments']['use'] . ',
\'max_number\' => ' . $set['attachments']['max_number'] . ',
\'max_size\' => ' . $set['attachments']['max_size'] . ',
\'allowed_types\' => array(\'' . implode('\',\'',$set['attachments']['allowed_types']) . '\')
);
// ==> KNOWLEDGEBASE
// --> Knowledgebase settings
$hesk_settings[\'kb_enable\']=' . $set['kb_enable'] . ';
$hesk_settings[\'kb_wysiwyg\']=' . $set['kb_wysiwyg'] . ';
$hesk_settings[\'kb_search\']=' . $set['kb_search'] . ';
$hesk_settings[\'kb_search_limit\']=' . $set['kb_search_limit'] . ';
$hesk_settings[\'kb_views\']=' . $set['kb_views'] . ';
$hesk_settings[\'kb_date\']=' . $set['kb_date'] . ';
$hesk_settings[\'kb_recommendanswers\']=' . $set['kb_recommendanswers'] . ';
$hesk_settings[\'kb_rating\']=' . $set['kb_rating'] . ';
$hesk_settings[\'kb_substrart\']=' . $set['kb_substrart'] . ';
$hesk_settings[\'kb_cols\']=' . $set['kb_cols'] . ';
$hesk_settings[\'kb_numshow\']=' . $set['kb_numshow'] . ';
$hesk_settings[\'kb_popart\']=' . $set['kb_popart'] . ';
$hesk_settings[\'kb_latest\']=' . $set['kb_latest'] . ';
$hesk_settings[\'kb_index_popart\']=' . $set['kb_index_popart'] . ';
$hesk_settings[\'kb_index_latest\']=' . $set['kb_index_latest'] . ';
$hesk_settings[\'kb_related\']=' . $set['kb_related'] . ';
// ==> EMAIL
// --> Email sending
$hesk_settings[\'smtp\']=' . $set['smtp'] . ';
$hesk_settings[\'smtp_host_name\']=\'' . $set['smtp_host_name'] . '\';
$hesk_settings[\'smtp_host_port\']=' . $set['smtp_host_port'] . ';
$hesk_settings[\'smtp_timeout\']=' . $set['smtp_timeout'] . ';
$hesk_settings[\'smtp_ssl\']=' . $set['smtp_ssl'] . ';
$hesk_settings[\'smtp_tls\']=' . $set['smtp_tls'] . ';
$hesk_settings[\'smtp_user\']=\'' . $set['smtp_user'] . '\';
$hesk_settings[\'smtp_password\']=\'' . $set['smtp_password'] . '\';
// --> Email piping
$hesk_settings[\'email_piping\']=' . $set['email_piping'] . ';
// --> POP3 Fetching
$hesk_settings[\'pop3\']=' . $set['pop3'] . ';
$hesk_settings[\'pop3_job_wait\']=' . $set['pop3_job_wait'] . ';
$hesk_settings[\'pop3_host_name\']=\'' . $set['pop3_host_name'] . '\';
$hesk_settings[\'pop3_host_port\']=' . $set['pop3_host_port'] . ';
$hesk_settings[\'pop3_tls\']=' . $set['pop3_tls'] . ';
$hesk_settings[\'pop3_keep\']=' . $set['pop3_keep'] . ';
$hesk_settings[\'pop3_user\']=\'' . $set['pop3_user'] . '\';
$hesk_settings[\'pop3_password\']=\'' . $set['pop3_password'] . '\';
// --> Email loops
$hesk_settings[\'loop_hits\']=' . $set['loop_hits'] . ';
$hesk_settings[\'loop_time\']=' . $set['loop_time'] . ';
// --> Detect email typos
$hesk_settings[\'detect_typos\']=' . $set['detect_typos'] . ';
$hesk_settings[\'email_providers\']=array(' . $set['email_providers'] . ');
// --> Notify customer when
$hesk_settings[\'notify_new\']=' . $set['notify_new'] . ';
$hesk_settings[\'notify_skip_spam\']=' . $set['notify_skip_spam'] . ';
$hesk_settings[\'notify_spam_tags\']=array(' . $set['notify_spam_tags'] . ');
$hesk_settings[\'notify_closed\']=' . $set['notify_closed'] . ';
// --> Other
$hesk_settings[\'strip_quoted\']=' . $set['strip_quoted'] . ';
$hesk_settings[\'eml_req_msg\']=' . $set['eml_req_msg'] . ';
$hesk_settings[\'save_embedded\']=' . $set['save_embedded'] . ';
$hesk_settings[\'multi_eml\']=' . $set['multi_eml'] . ';
$hesk_settings[\'confirm_email\']=' . $set['confirm_email'] . ';
$hesk_settings[\'open_only\']=' . $set['open_only'] . ';
// ==> TICKET LIST
$hesk_settings[\'ticket_list\']=array(\'' . implode('\',\'',$set['ticket_list']) . '\');
// --> Other
$hesk_settings[\'submittedformat\']=\'' . $set['submittedformat'] . '\';
$hesk_settings[\'updatedformat\']=\'' . $set['updatedformat'] . '\';
// ==> MISC
// --> Date & Time
$hesk_settings[\'diff_hours\']=' . $set['diff_hours'] . ';
$hesk_settings[\'diff_minutes\']=' . $set['diff_minutes'] . ';
$hesk_settings[\'daylight\']=' . $set['daylight'] . ';
$hesk_settings[\'timeformat\']=\'' . $set['timeformat'] . '\';
// --> Other
$hesk_settings[\'ip_whois\']=\'' . $set['ip_whois'] . '\';
$hesk_settings[\'maintenance_mode\']=' . $set['maintenance_mode'] . ';
$hesk_settings[\'alink\']=' . $set['alink'] . ';
$hesk_settings[\'submit_notice\']=' . $set['submit_notice'] . ';
$hesk_settings[\'online\']=' . $set['online'] . ';
$hesk_settings[\'online_min\']=' . $set['online_min'] . ';
$hesk_settings[\'check_updates\']=' . $set['check_updates'] . ';
// ==> CUSTOM FIELDS
$hesk_settings[\'custom_fields\']=array (
';
for ($i=1;$i<=20;$i++) {
$settings_file_content.='\'custom'.$i.'\'=>array(\'use\'=>'.$set['custom_fields']['custom'.$i]['use'].',\'place\'=>'.$set['custom_fields']['custom'.$i]['place'].',\'type\'=>\''.$set['custom_fields']['custom'.$i]['type'].'\',\'req\'=>'.$set['custom_fields']['custom'.$i]['req'].',\'name\'=>\''.$set['custom_fields']['custom'.$i]['name'].'\',\'maxlen\'=>'.$set['custom_fields']['custom'.$i]['maxlen'].',\'value\'=>\''.$set['custom_fields']['custom'.$i]['value'].'\')';
if ($i!=20) {$settings_file_content.=',
';}
}
$settings_file_content.='
);
#############################
# DO NOT EDIT BELOW #
#############################
$hesk_settings[\'hesk_version\']=\'' . $set['hesk_version'] . '\';
if ($hesk_settings[\'debug_mode\'])
{
error_reporting(E_ALL);
}
else
{
error_reporting(0);
}
if (!defined(\'IN_SCRIPT\')) {die(\'Invalid attempt!\');}';
// Write to the settings file
if ( ! file_put_contents(HESK_PATH . 'hesk_settings.inc.php', $settings_file_content) )
{
hesk_error($hesklang['err_openset']);
}
return true;
} // END hesk_iSaveSettingsFile()
function hesk_iDatabase($problem=0)
{
global $hesk_settings, $hesk_db_link, $mysql_log;
hesk_iHeader();
?>
<br />
<div class="col-md-4">
<div class="panel panel-default">
<div class="panel-heading">
<p>Summary</p>
</div>
<div class="panel-body">
<p style="padding: 10px;">To complete setup HESK needs to connect to your database. You can get this information from your hosting control panel.</p>
</div>
</div>
</div>
<div class="col-md-8">
<div class="alert alert-warning"><strong>3. Database Settings</strong></div>
<form role="form" action="<?php echo INSTALL_PAGE; ?>" method="post">
<div class="h3">Database Settings</div>
<div class="footerWithBorder blankSpace"></div>
<?php
if ($problem == 1)
{
echo '<div class="alert alert-danger">';
echo '<br /><br />Double-check all the information below. Contact your hosting company for the correct information to use!<br /><br /><b>MySQL said:</b> '.$mysql_log.'</p>', 'Database connection failed';
echo '</div>';
}
elseif ($problem == 2)
{
echo '<div class="alert alert-danger">';
echo '<b>Database tables already exist!</b><br /><br />
HESK database tables with <b>'.$hesk_settings['db_pfix'].'</b> prefix already exist in this database!<br /><br />
To upgrade an existing HESK installation select <a href="index.php">Update existing install</a> instead.<br /><br />
To install a new copy of HESK in use a unique table prefix.';
echo '</div>';
}
elseif ($problem == 3)
{
echo '<div class="alert alert-danger">';
echo '<b>Old database tables not found!</b><br /><br />
HESK database tables have not been found in this database!<br /><br />
To install HESK use the <a href="index.php">New install</a> option instead.';
echo '</div>';
}
elseif ($problem == 4)
{
echo '<div class="alert alert-danger">';
echo '<b>Version '.HESK_NEW_VERSION.' tables already exist!</b><br /><br />
Your database seems to be compatible with HESK version '.HESK_NEW_VERSION.'<br /><br />
To install a new copy of HESK use the <a href="index.php">New install</a> option instead.';
echo '</div>';
}
elseif ($problem == 5)
{
hesk_show_error('MySQL version <b>'.REQUIRE_MYSQL_VERSION.'+</b> required, you are using: <b>' . MYSQL_VERSION . '</b><br /><br />
You are using and old and insecure MySQL version with known bugs, security issues and outdated functionality.<br /><br />
Ask your hosting company to update your MySQL version.');
}
?>
<div class="form-group">
<label for="host">Database Host</label>
<input type="text" class="form-control" name="host" id="host" placeholder="ex. localhost">
</div>
<div class="form-group">
<label for="name">Database Name</label>
<input type="text" class="form-control" name="name" id="name" placeholder="ex. hesk">
</div>
<div class="form-group">
<label for="user">Database User</label>
<input type="text" class="form-control" name="user" id="user" placeholder="ex. root">
</div>
<div class="form-group">
<label for="pass">Database User's Password</label>
<input type="password" class="form-control" name="pass" id="pass" placeholder="Password">
</div>
<?php
if (INSTALL_PAGE == 'install.php')
{
?>
<div class="form-group">
<label for="pfix">Table Prefix</label>
<input type="text" class="form-control" name="pfix" id="pfix" placeholder="ex. hesk_">
</div>
<br>
<div class="h3">HESK Login Details</div>
<div class="h6">Username and password you will use to login into HESK administration.</div>
<div class="footerWithBorder blankSpace"></div>
<div class="form-group">
<label for="admin_user">Choose a Username</label>
<input type="text" class="form-control" placeholder="Username" name="admin_user" value="<?php echo isset($_SESSION['admin_user']) ? stripslashes($_SESSION['admin_user']) : 'Administrator'; ?>" size="40" autocomplete="off" />
</div>
<div class="form-group">
<label for="admin_pass">Choose a Password</label>
<input type="text" class="form-control" placeholder="Password" name="admin_pass" id="admin_pass" value="<?php echo isset($_SESSION['admin_pass']) ? stripslashes($_SESSION['admin_pass']) : ''; ?>" size="40" autocomplete="off" />
</div>
<?php
}
?>
<p align="center"><input type="hidden" name="dbtest" value="1" /><button type="submit" class="btn btn-default btn-lg">Continue</button></p>
</form>
<?php
hesk_iFooter();
} // End hesk_iDatabase()
function hesk_iCheckSetup()
{
global $hesk_settings;
$correct_these = array();
// 1. PHP 5+ required
if ( function_exists('version_compare') && version_compare(PHP_VERSION,REQUIRE_PHP_VERSION,'<') )
{
$correct_these[] = '
PHP version <b>'.REQUIRE_PHP_VERSION.'+</b> required, you are using: <b>' . PHP_VERSION . '</b><br /><br />
You are using and old and insecure PHP version with known bugs, security issues and outdated functionality.<br /><br />
Ask your hosting company to update your PHP version.
';
}
// 2. File hesk_settings.inc.php must be writable
if ( ! is__writable(HESK_PATH . 'hesk_settings.inc.php') )
{
// -> try to CHMOD it
if ( function_exists('chmod') )
{
@chmod(HESK_PATH . 'hesk_settings.inc.php', 0666);
}
// -> test again
if ( ! is__writable(HESK_PATH . 'hesk_settings.inc.php') )
{
$correct_these[] = '
File <b>hesk_settings.inc.php</b> is not writable by PHP.<br /><br />
Make sure PHP has permission to write to file <b>hesk_settings.inc.php</b><br /><br />
&raquo; on <b>Linux</b> servers <a href="http://www.phpjunkyard.com/tutorials/ftp-chmod-tutorial.php">CHMOD</a> this file to 666 (rw-rw-rw-)<br />
&raquo; on <b>Windows</b> servers allow Internet Guest Account to modify the file<br />
&raquo; contact your hosting company for help with setting up file permissions.
';
}
}
// 3. Folder attachments must exist
$hesk_settings['attach_dir_name'] = isset($hesk_settings['attach_dir']) ? $hesk_settings['attach_dir'] : 'attachments';
$hesk_settings['attach_dir'] = HESK_PATH . $hesk_settings['attach_dir_name'];
// -> Try to create it
if ( ! file_exists($hesk_settings['attach_dir']) )
{
@mkdir($hesk_settings['attach_dir'], 0755);
}
// -> Is the folder now there?
if ( is_dir($hesk_settings['attach_dir']) )
{
// -> Is it writable?
if ( ! is__writable($hesk_settings['attach_dir']) )
{
// -> try to CHMOD it
@chmod($hesk_settings['attach_dir'], 0777);
// -> test again
if ( ! is__writable($hesk_settings['attach_dir']) )
{
$correct_these[] = '
Folder <b>' . $hesk_settings['attach_dir_name'] . '</b> is not writable by PHP.<br /><br />
Make sure PHP has permission to write to folder <b>' . $hesk_settings['attach_dir_name'] . '</b><br /><br />
&raquo; on <b>Linux</b> servers <a href="http://www.phpjunkyard.com/tutorials/ftp-chmod-tutorial.php">CHMOD</a> this folder to 777 (rwxrwxrwx)<br />
&raquo; on <b>Windows</b> servers allow Internet Guest Account to modify the folder<br />
&raquo; contact your hosting company for help with setting up folder permissions.
';
}
}
}
else
{
$correct_these[] = '
Folder <b>' . $hesk_settings['attach_dir_name'] . '</b> is missing.<br /><br />
Create a folder called <b>' . $hesk_settings['attach_dir_name'] . '</b> inside your main HESK folder.<br /><br />
';
}
// 4. MySQL must be available
if ( ! function_exists('mysql_connect') && ! function_exists('mysqli_connect') )
{
$correct_these[] = '
MySQL is disabled.<br /><br />
HESK requires MySQL to be installed and enabled.<br /><br />
Ask your hosting company to enable MySQL for PHP.
';
}
// 5. Can we use GD library?
$GD_LIB = ( extension_loaded('gd') && function_exists('gd_info') ) ? true : false;
// 6. Make sure old files are deleted
$old_files = array(
// pre-0.93 *.inc files
'hesk_settings.inc','hesk.sql','inc/common.inc','inc/database.inc','inc/footer.inc','inc/header.inc',
'inc/print_tickets.inc','inc/show_admin_nav.inc','inc/show_search_form.inc','install.php','update.php',
// pre-2.0 files
'admin.php','admin_change_status.php','admin_main.php','admin_move_category','admin_reply_ticket.php',
'admin_settings.php','admin_settings_save.php','admin_ticket.php','archive.php',
'delete_tickets.php','find_tickets.php','manage_canned.php','manage_categories.php',
'manage_users.php','profile.php','show_tickets.php',
// pre-2.1 files
'emails/','language/english.php',
// pre-2.3 files
'secimg.inc.php',
// pre-2.4 files
'hesk_style_v23.css','help_files/','TreeMenu.js',
// malicious files that were found on some websites illegally redistributing HESK
'inc/tiny_mce/utils/r00t10.php', 'language/en/help_files/r00t10.php',
// pre-2.5 files
'hesk_style_v24.css', 'hesk_javascript_v24.js',
// pre-2.6 files
'hesk_style_v25.css', 'hesk_javascript_v25.js',
);
sort($old_files);
$still_exist = array();
foreach ($old_files as $f)
{
if (file_exists(HESK_PATH . $f))
{
$still_exist[] = $f;
}
}
if ( count($still_exist) )
{
$correct_these[] = '
Outdated files and folders<br /><br />
For security reasons please delete these legacy files and folders:<br />
<ul><li><b>'.implode('</b></li><li><b>',$still_exist).'</b></li></ul>
';
}
// Do we have any errors?
if ( count($correct_these) )
{
hesk_iHeader();
?>
&nbsp;
<div style="margin-left:40px;margin-right:40px">
<?php
foreach ($correct_these as $correct_this)
{
hesk_show_error($correct_this);
echo "&nbsp;";
}
?>
</div>
<form method="post" action="<?php echo INSTALL_PAGE; ?>">
<p align="center"><input type="submit" value="Click here to test again" class="btn btn-default" /></p>
</form>
<p>&nbsp;</p>
<?php
hesk_iFooter();
}
// If all tests were successful, we can continue to the next step
$_SESSION['set_attachments'] = 1;
$_SESSION['set_captcha'] = $GD_LIB ? 1 : 0;
$_SESSION['use_spamq'] = $GD_LIB ? 0 : 1;
$_SESSION['step'] = 3;
// When updating, first try saved MySQL info
if (INSTALL_PAGE == 'update.php')
{
header('Location: ' . INSTALL_PAGE);
}
else
{
hesk_iDatabase();
}
exit();
} ?></div></div> <!-- End hesk_iCheckSetup() -->
<?php
function hesk_iStart()
{
global $hesk_settings;
// Set this session variable to check later if sessions are working
$_SESSION['works'] = true;
hesk_iHeader();
?>
<div class="row">
<div class="col-md-4">
<div class="panel panel-default">
<div class="panel-heading">
<p>Summary</p>
</div>
<div class="panel-body">
<ul>
<li>The script is provided &quot;as is&quot;, without any warranty. Use at your own risk.<br />&nbsp;</li>
<li>HESK is a registered trademark, using the term HESK requires permission.<br />&nbsp;</li>
<li>Do not redistribute this script without express written permission<br />&nbsp;</li>
<li>If you wish to remove the &quot;Powered by&quot; links a <a href="https://www.hesk.com/buy.php" target="_blank">license is required</a>.</li>
</ul>
</div>
</div>
</div>
<div class="col-md-8">
<div class="alert alert-warning"><strong>1. License Agreement</strong></div>
<b>The entire agreement:</b>
<div class="agreementBox">
<strong>HESK License Agreement</strong><br/>
The &quot;script&quot; is all files included with the HESK distribution archive as well as all files produced as a result of the installation scripts. Klemen Stirn (&quot;Author&quot;,&quot;HESK&quot;) is the author and copyrights owner of the script. The &quot;Licensee&quot; (&quot;you&quot;) is the person downloading or using the Licensed version of script. &quot;User&quot; is any person using or viewing the script with their HTML browser.
&quot;Powered by&quot; link is herein defined as an anchor link pointing to HESK website and/or script webpage, usually located at the bottom of the script and visible to users of the script without looking into source code.
&quot;Copyright headers&quot; is a written copyright notice located in script source code and normally not visible to users.
This License may be modified by the Author at any time. The new version of the License becomes valid when published on HESK website. You are encouraged to regularly check back for License updates.
THIS SCRIPT IS PROVIDED &quot;AS IS&quot; AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KLEMEN STIRN BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SCRIPT, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Using this code, in part or full, to create derivative work, new scripts or products is expressly forbidden. Obtain permission before redistributing this software over the Internet or in any other medium.
REMOVING POWERED BY LINKS
You are not allowed to remove or in any way edit the &quot;Powered by&quot; links in this script without purchasing a License. You can purchase a License at
https://www.hesk.com/buy.php
If you remove the Powered by links without purchasing a License and paying the licensee fee, you are in a direct violation of European Union and International copyright laws. Your License to use the scripts is immediately terminated and you must delete all copies of the entire program from your web server. Klemen Stirn may, at any time, terminate this License agreement if Klemen Stirn determines, that this License agreement has been breached.
Under no circumstance is the removal of copyright headers from the script source code permitted.
TRADEMARK POLICY
HESK is a US and EU registered trademark of Klemen Stirn. Certain usages of the Trademark are fine and no specific permission from the author is needed:
- there is no commercial intent behind the use
- what you are referring to is in fact HESK. If someone is confused into thinking that what isn't HESK is in fact HESK, you are probably doing something wrong
- there is no suggestion (through words or appearance) that your project is approved, sponsored, or affiliated with HESK or its related projects unless it actually has been approved by and is accountable to the author
Permission from the author is necessary to use the HESK trademark under any circumstances other than those specifically permitted above. These include:
- any commercial use
- use on or in relation to a software product that includes or is built on top of a product supplied by author, if there is any commercial intent associated with that product
- use in a domain name or URL
- use for merchandising purposes, e.g. on t-shirts and the like
- use of a name which includes the letters HESK in relation to computer hardware or software.
- services relating to any of the above
If you wish to have permission for any of the uses above or for any other use which is not specifically referred to in this policy, please contact me and I'll let you know as soon as possible if your proposed use is permissible. Note that due to the volume of mail I receive, it may take some time to process your request. Permission may only be granted subject to certain conditions and these may include the requirement that you enter into an agreement with me to maintain the quality of the product and/or service which you intend to supply at a prescribed level.
While there may be exceptions, it is very unlikely that I will approve Trademark use in the following cases:
- use of a Trademark in a company name
- use of a Trademark in a domain name which has a commercial intent. The commercial intent can range from promotion of a company or product, to collecting revenue generated by advertising
- the calling of any software or product by the name HESK (or another related Trademark), unless that software or product is a substantially unmodified HESK product
- use in combination with any other marks or logos. This include use of a Trademark in a manner that creates a "combined mark," or use that integrates other wording with the Trademark in a way that the public may think of the use as a new mark (for example Club HESK or HESKBooks, or in a way that by use of special fonts or presentation with nearby words or images conveys an impression that the two are tied in some way)
- use in combination with any product or service which is presented as being Certified or Official or formally associated with me or my products or services
- use in a way which implies an endorsement where that doesn't exist, or which attempts to unfairly or confusingly capitalise on the goodwill or brand of the project
- use of a Trademark in a manner that disparages HESK and is not clearly third-party parody
- on or in relation to a software product which constitutes a substantially modified version of a product supplied by HESK.com, that is to say with material changes to the code, or services relating to such a product
- in a title or metatag of a web page whose sole intention or result is to influence search engine rankings or result listings, rather than for discussion, development or advocacy of the Trademarks
OTHER
This License Agreement is governed by the laws of Slovenia, European Union. Both the Licensee and Klemen Stirn submit to the jurisdiction of the courts of Slovenia, European Union. Both the Licensee and Klemen Stirn agree to commence any litigation that may arise hereunder in the courts located in Slovenia.
If any provision hereof shall be held illegal, invalid or unenforceable, in whole or in part, such provision shall be modified to the minimum extent necessary to make it legal, valid and enforceable, and the legality, validity and enforceability of all other provisions of this Agreement shall not be affected thereby. No delay or failure by either party to exercise or enforce at any time any right or provision hereof shall be considered a waiver thereof or of such party's right thereafter to exercise or enforce each and every right and provision of this Agreement.
</div>
</div>
</div>
<br />
<br />
<form method="post" action="<?php echo INSTALL_PAGE; ?>" name="license" onsubmit="return hesk_checkAgree()">
<div align="center">
<p align="center">
<a class="btn btn-default btn-lg" href="#" onclick="javascript:parent.location='index.php'" role="button">Cancel</a>
<button type="submit" class="btn btn-default btn-lg">Continue</button>
<p><b>By clicking continue, you agree to the license agreement and all the terms incorporated therein.</b></p>
<input type="hidden" name="agree" value="YES" />
</p>
<p>&nbsp;</p>
</div>
</form>
<?php
hesk_iFooter();
} // End hesk_iStart()
function hesk_iHeader()
{
global $hesk_settings;
$steps = array(
1 => '1. License agreement',
2 => '2. Check setup',
3 => '3. Database settings',
4 => '4. Setup database tables'
);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>HESK <?php echo HESK_NEW_VERSION; ?> Setup</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<link href="../hesk_style.css?<?php echo HESK_NEW_VERSION; ?>" type="text/css" rel="stylesheet" />
<link rel="stylesheet" href="../css/bootstrap.css">
<link rel="stylesheet" href="../css/bootstrap-theme.css">
<link href="../css/hesk_newStyle.css" type="text/css" rel="stylesheet" />
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="../js/jquery-1.10.2.min.js"></script>
<script language="Javascript" type="text/javascript" src="../hesk_javascript.js?<?php echo HESK_NEW_VERSION; ?>"></script>
<script language="Javascript" type="text/javascript" src="../js/bootstrap.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="../js/bootstrap.min.js"></script>
</head>
<body>
<div class="enclosing">
<div class="headersm">HESK <?php echo HESK_NEW_VERSION; ?> Setup</div>
<?php
if ( isset($_SESSION['step']) )
{
$_SESSION['step'] = intval($_SESSION['step']);
?>
<ol class="breadcrumb">
<?php
foreach ($steps as $number => $description)
{
if ($number == $_SESSION['step']) //Active step
{
$steps[$number] = '<li>' . $steps[$number] . '</li>';
}
else //Already passed through or not yet there
{
$steps[$number] = '<li class="active">' . $steps[$number] . '</li>';
}
}
echo implode($steps);
?>
</ol>
<br />
<?php
}
else
{
echo '<div class="installWarning"><div class="alert alert-warning"><strong>Note: </strong><a href="../docs/index.html">Read installation guide</a> before using this setup script!</div></div>';
}
} // End hesk_iHeader()
function hesk_iFooter()
{
global $hesk_settings;
?>
<p style="text-align:center"><span class="smaller">&nbsp;<br />Powered by <a href="https://www.hesk.com" class="smaller" title="Free PHP Help Desk Software">Help Desk Software</a> <b>HESK</b>, brought to you by <a href="https://www.sysaid.com/?utm_source=Hesk&utm_medium=cpc&utm_campaign=HeskProduct_To_HP">SysAid</a></span></p>
</div>
</body>
</html>
<?php
exit();
} // End hesk_iFooter()
function hesk_iSessionError()
{
hesk_session_stop();
hesk_iHeader();
?>
<br />
<div class="error">
<img src="<?php echo HESK_PATH; ?>img/error.png" width="16" height="16" border="0" alt="" style="vertical-align:text-bottom" />
<b>Error:</b> PHP sessions not working!<br /><br />Note that this is a server configuration issue, not a HESK issue.<br /><br />Please contact your hosting company and ask them to verify why PHP sessions aren't working on your server!
</div>
<br />
<form method="get" action="<?php echo INSTALL_PAGE; ?>">
<p align="center"><input type="submit" value="&laquo; Start over" class="orangebutton" onmouseover="hesk_btn(this,'orangebuttonover');" onmouseout="hesk_btn(this,'orangebutton');" /></p>
</form>
<?php
hesk_iFooter();
} // END hesk_iSessionError()
function hesk_compareVariable($k,$v)
{
global $hesk_settings;
if (is_array($v))
{
foreach ($v as $sub_k => $sub_v)
{
$v[$k] = hesk_compareVariable($sub_k,$sub_v);
}
}
if (isset($hesk_settings[$k]))
{
return $hesk_settings[$k];
}
else
{
return $v;
}
} // END hesk_compareVariable()
function is__writable($path)
{
//will work in despite of Windows ACLs bug
//NOTE: use a trailing slash for folders!!!
//see http://bugs.php.net/bug.php?id=27609
//see http://bugs.php.net/bug.php?id=30931
if ($path{strlen($path)-1}=='/') // recursively return a temporary file path
return is__writable($path.uniqid(mt_rand()).'.tmp');
else if (is_dir($path))
return is__writable($path.'/'.uniqid(mt_rand()).'.tmp');
// check tmp file for read/write capabilities
$rm = file_exists($path);
$f = @fopen($path, 'a');
if ($f===false)
return false;
fclose($f);
if (!$rm)
unlink($path);
return true;
} // END is__writable()
hesk_session_start();

@ -74,6 +74,8 @@ if ($version == 2) {
execute300RC1Scripts();
} elseif ($version == 34) {
execute300Scripts();
} elseif ($version == 35) {
execute301Scripts();
} else {
$response = 'The version "' . $version . '" was not recognized. Check the value submitted and try again.';
print $response;

@ -27,7 +27,26 @@ hesk_dbConnect();
<div class="page-header">
<h1>Mods for HESK Database Validation</h1>
<p>The database validation tool will check your database setup to ensure that everything is set up correctly.
As of this time, the database validator assumes you are running the latest version of Mods for HESK (2.6.4)</p>
As of this time, the database validator assumes you are running the latest version of Mods for HESK (<?php echo MODS_FOR_HESK_NEW_VERSION; ?>)</p>
</div>
<div class="panel panel-success" id="all-good" style="display: none">
<div class="panel-heading">
<h4>Success</h4>
</div>
<div class="panel-body text-center">
<i class="fa fa-check-circle fa-4x" style="color: green"></i><br>
<h4>Your database is valid</h4>
</div>
</div>
<div class="panel panel-danger" id="not-good" style="display: none">
<div class="panel-heading">
<h4>Failure</h4>
</div>
<div class="panel-body text-center">
<i class="fa fa-times-circle fa-4x" style="color: red"></i><br>
<h4>One or more columns / tables are not properly configured in your database. Please open a topic at the
<a href="http://developers.phpjunkyard.com/viewforum.php?f=19" target="_blank">PHP Junkyard Forums</a> with this information for assistance.</h4>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
@ -42,110 +61,118 @@ hesk_dbConnect();
</thead>
<tbody>
<?php
$all_good = true;
output_header_row('1.0.0 - 1.3.x');
run_table_check('statuses');
run_column_check('statuses', '`ID`');
run_column_check('statuses', '`TextColor`');
run_column_check('statuses', '`IsNewTicketStatus`');
run_column_check('statuses', '`IsClosed`');
run_column_check('statuses', '`IsClosedByClient`');
run_column_check('statuses', '`IsCustomerReplyStatus`');
run_column_check('statuses', '`IsStaffClosedOption`');
run_column_check('statuses', '`IsStaffReopenedStatus`');
run_column_check('statuses', '`IsDefaultStaffReplyStatus`');
run_column_check('statuses', '`LockedTicketStatus`');
run_column_check('statuses', '`IsAutocloseOption`');
run_column_check('statuses', '`Closable`');
$all_good = run_table_check('statuses');
$all_good = $all_good & run_column_check('statuses', '`ID`');
$all_good = $all_good & run_column_check('statuses', '`TextColor`');
$all_good = $all_good & run_column_check('statuses', '`IsNewTicketStatus`');
$all_good = $all_good & run_column_check('statuses', '`IsClosed`');
$all_good = $all_good & run_column_check('statuses', '`IsClosedByClient`');
$all_good = $all_good & run_column_check('statuses', '`IsCustomerReplyStatus`');
$all_good = $all_good & run_column_check('statuses', '`IsStaffClosedOption`');
$all_good = $all_good & run_column_check('statuses', '`IsStaffReopenedStatus`');
$all_good = $all_good & run_column_check('statuses', '`IsDefaultStaffReplyStatus`');
$all_good = $all_good & run_column_check('statuses', '`LockedTicketStatus`');
$all_good = $all_good & run_column_check('statuses', '`IsAutocloseOption`');
$all_good = $all_good & run_column_check('statuses', '`Closable`');
output_header_row('1.5.0');
run_column_check('users', '`active`');
run_column_check('users', '`notify_note_unassigned`');
$all_good = $all_good & run_column_check('users', '`active`');
$all_good = $all_good & run_column_check('users', '`notify_note_unassigned`');
output_header_row('1.6.0');
run_table_check('settings');
$all_good = $all_good & run_table_check('settings');
output_header_row('1.7.0');
run_table_check('verified_emails');
run_table_check('pending_verification_emails');
run_table_check('stage_tickets');
$all_good = $all_good & run_table_check('verified_emails');
$all_good = $all_good & run_table_check('pending_verification_emails');
$all_good = $all_good & run_table_check('stage_tickets');
output_header_row('2.3.0');
run_column_check('service_messages', '`icon`');
run_column_check('statuses', '`Key`');
run_column_check('tickets', '`latitude`');
run_column_check('tickets', '`longitude`');
run_column_check('stage_tickets', '`latitude`');
run_column_check('stage_tickets', '`longitude`');
run_column_check('categories', '`manager`');
run_column_check('users', '`permission_template`');
run_table_check('permission_templates');
run_column_check('permission_templates', '`id`');
run_column_check('permission_templates', '`name`');
run_column_check('permission_templates', '`heskprivileges`');
run_column_check('permission_templates', '`categories`');
$all_good = $all_good & run_column_check('service_messages', '`icon`');
$all_good = $all_good & run_column_check('statuses', '`Key`');
$all_good = $all_good & run_column_check('tickets', '`latitude`');
$all_good = $all_good & run_column_check('tickets', '`longitude`');
$all_good = $all_good & run_column_check('stage_tickets', '`latitude`');
$all_good = $all_good & run_column_check('stage_tickets', '`longitude`');
$all_good = $all_good & run_column_check('categories', '`manager`');
$all_good = $all_good & run_column_check('users', '`permission_template`');
$all_good = $all_good & run_table_check('permission_templates');
$all_good = $all_good & run_column_check('permission_templates', '`id`');
$all_good = $all_good & run_column_check('permission_templates', '`name`');
$all_good = $all_good & run_column_check('permission_templates', '`heskprivileges`');
$all_good = $all_good & run_column_check('permission_templates', '`categories`');
output_header_row('2.4.0');
run_table_check('quick_help_sections');
run_column_check('quick_help_sections', '`id`');
run_column_check('quick_help_sections', '`location`');
run_column_check('quick_help_sections', '`show`');
run_table_check('text_to_status_xref');
run_column_check('text_to_status_xref', '`id`');
run_column_check('text_to_status_xref', '`language`');
run_column_check('text_to_status_xref', '`text`');
run_column_check('text_to_status_xref', '`status_id`');
run_column_check('statuses', '`sort`');
run_column_check('attachments', '`download_count`');
run_column_check('kb_attachments', '`download_count`');
run_column_check('tickets', '`html`');
run_column_check('stage_tickets', '`html`');
run_column_check('replies', '`html`');
$all_good = $all_good & run_table_check('quick_help_sections');
$all_good = $all_good & run_column_check('quick_help_sections', '`id`');
$all_good = $all_good & run_column_check('quick_help_sections', '`location`');
$all_good = $all_good & run_column_check('quick_help_sections', '`show`');
$all_good = $all_good & run_table_check('text_to_status_xref');
$all_good = $all_good & run_column_check('text_to_status_xref', '`id`');
$all_good = $all_good & run_column_check('text_to_status_xref', '`language`');
$all_good = $all_good & run_column_check('text_to_status_xref', '`text`');
$all_good = $all_good & run_column_check('text_to_status_xref', '`status_id`');
$all_good = $all_good & run_column_check('statuses', '`sort`');
$all_good = $all_good & run_column_check('attachments', '`download_count`');
$all_good = $all_good & run_column_check('kb_attachments', '`download_count`');
$all_good = $all_good & run_column_check('tickets', '`html`');
$all_good = $all_good & run_column_check('stage_tickets', '`html`');
$all_good = $all_good & run_column_check('replies', '`html`');
output_header_row('2.5.0');
run_column_check('tickets', '`user_agent`');
run_column_check('tickets', '`screen_resolution_width`');
run_column_check('tickets', '`screen_resolution_height`');
run_column_check('stage_tickets', '`user_agent`');
run_column_check('stage_tickets', '`screen_resolution_width`');
run_column_check('stage_tickets', '`screen_resolution_height`');
$all_good = $all_good & run_column_check('tickets', '`user_agent`');
$all_good = $all_good & run_column_check('tickets', '`screen_resolution_width`');
$all_good = $all_good & run_column_check('tickets', '`screen_resolution_height`');
$all_good = $all_good & run_column_check('stage_tickets', '`user_agent`');
$all_good = $all_good & run_column_check('stage_tickets', '`screen_resolution_width`');
$all_good = $all_good & run_column_check('stage_tickets', '`screen_resolution_height`');
output_header_row('2.6.0');
run_table_check('logging');
run_column_check('logging', '`id`');
run_column_check('logging', '`username`');
run_column_check('logging', '`message`');
run_column_check('logging', '`severity`');
run_column_check('logging', '`location`');
run_column_check('logging', '`timestamp`');
run_table_check('user_api_tokens');
run_column_check('user_api_tokens', '`id`');
run_column_check('user_api_tokens', '`user_id`');
run_column_check('user_api_tokens', '`token`');
run_table_check('temp_attachment');
run_column_check('temp_attachment', '`id`');
run_column_check('temp_attachment', '`file_name`');
run_column_check('temp_attachment', '`saved_name`');
run_column_check('temp_attachment', '`size`');
run_column_check('temp_attachment', '`type`');
run_column_check('temp_attachment', '`date_uploaded`');
run_table_check('calendar_event');
run_column_check('calendar_event', '`id`');
run_column_check('calendar_event', '`start`');
run_column_check('calendar_event', '`end`');
run_column_check('calendar_event', '`all_day`');
run_column_check('calendar_event', '`name`');
run_column_check('calendar_event', '`location`');
run_column_check('calendar_event', '`comments`');
run_column_check('calendar_event', '`category`');
run_table_check('calendar_event_reminder');
run_column_check('calendar_event_reminder', '`id`');
run_column_check('calendar_event_reminder', '`user_id`');
run_column_check('calendar_event_reminder', '`event_id`');
run_column_check('calendar_event_reminder', '`amount`');
run_column_check('calendar_event_reminder', '`unit`');
run_column_check('calendar_event_reminder', '`email_sent`');
run_column_check('tickets', '`due_date`');
run_column_check('tickets', '`overdue_email_sent`');
run_column_check('categories', '`color`');
run_column_check('categories', '`usage`');
run_column_check('users', '`notify_overdue_unassigned`');
run_column_check('users', '`default_calendar_view`');
$all_good = $all_good & run_table_check('logging');
$all_good = $all_good & run_column_check('logging', '`id`');
$all_good = $all_good & run_column_check('logging', '`username`');
$all_good = $all_good & run_column_check('logging', '`message`');
$all_good = $all_good & run_column_check('logging', '`severity`');
$all_good = $all_good & run_column_check('logging', '`location`');
$all_good = $all_good & run_column_check('logging', '`timestamp`');
$all_good = $all_good & run_table_check('user_api_tokens');
$all_good = $all_good & run_column_check('user_api_tokens', '`id`');
$all_good = $all_good & run_column_check('user_api_tokens', '`user_id`');
$all_good = $all_good & run_column_check('user_api_tokens', '`token`');
$all_good = $all_good & run_table_check('temp_attachment');
$all_good = $all_good & run_column_check('temp_attachment', '`id`');
$all_good = $all_good & run_column_check('temp_attachment', '`file_name`');
$all_good = $all_good & run_column_check('temp_attachment', '`saved_name`');
$all_good = $all_good & run_column_check('temp_attachment', '`size`');
$all_good = $all_good & run_column_check('temp_attachment', '`type`');
$all_good = $all_good & run_column_check('temp_attachment', '`date_uploaded`');
$all_good = $all_good & run_table_check('calendar_event');
$all_good = $all_good & run_column_check('calendar_event', '`id`');
$all_good = $all_good & run_column_check('calendar_event', '`start`');
$all_good = $all_good & run_column_check('calendar_event', '`end`');
$all_good = $all_good & run_column_check('calendar_event', '`all_day`');
$all_good = $all_good & run_column_check('calendar_event', '`name`');
$all_good = $all_good & run_column_check('calendar_event', '`location`');
$all_good = $all_good & run_column_check('calendar_event', '`comments`');
$all_good = $all_good & run_column_check('calendar_event', '`category`');
$all_good = $all_good & run_table_check('calendar_event_reminder');
$all_good = $all_good & run_column_check('calendar_event_reminder', '`id`');
$all_good = $all_good & run_column_check('calendar_event_reminder', '`user_id`');
$all_good = $all_good & run_column_check('calendar_event_reminder', '`event_id`');
$all_good = $all_good & run_column_check('calendar_event_reminder', '`amount`');
$all_good = $all_good & run_column_check('calendar_event_reminder', '`unit`');
$all_good = $all_good & run_column_check('calendar_event_reminder', '`email_sent`');
$all_good = $all_good & run_column_check('tickets', '`due_date`');
$all_good = $all_good & run_column_check('tickets', '`overdue_email_sent`');
$all_good = $all_good & run_column_check('categories', '`color`');
$all_good = $all_good & run_column_check('categories', '`usage`');
$all_good = $all_good & run_column_check('users', '`notify_overdue_unassigned`');
$all_good = $all_good & run_column_check('users', '`default_calendar_view`');
output_header_row('2.6.2');
run_column_check('stage_tickets', '`due_date`');
run_column_check('stage_tickets', '`overdue_email_sent`');
$all_good = $all_good & run_column_check('stage_tickets', '`due_date`');
$all_good = $all_good & run_column_check('stage_tickets', '`overdue_email_sent`');
if ($all_good) {
echo "<script>$('#all-good').show()</script>";
} else {
echo "<script>$('#not-good').show()</script>";
}
?>
</tbody>
</table>
@ -155,21 +182,24 @@ hesk_dbConnect();
</html>
<?php
function run_table_check($table_name) {
run_column_check($table_name, '1');
return run_column_check($table_name, '1');
}
function run_column_check($table_name, $column_name) {
global $hesk_settings;
if ($column_name == '1') {
$all_good = run_check('SELECT ' . $column_name . ' FROM `' . $hesk_settings['db_pfix'] . $table_name . '` LIMIT 1');
output_result('<b>Table Exists</b>: ' . $table_name,
run_check('SELECT ' . $column_name . ' FROM `' . $hesk_settings['db_pfix'] . $table_name . '` LIMIT 1'));
$all_good);
} else {
$all_good = run_check('SELECT ' . $column_name . ' FROM `' . $hesk_settings['db_pfix'] . $table_name . '` LIMIT 1');
output_result('<b>Column Exists</b>: ' . $table_name . '.' . $column_name,
run_check('SELECT ' . $column_name . ' FROM `' . $hesk_settings['db_pfix'] . $table_name . '` LIMIT 1'));
$all_good);
}
return $all_good !== false;
}
function run_check($sql) {

@ -43,6 +43,7 @@ $buildToVersionMap = array(
32 => '3.0.0 beta 1',
33 => '3.0.0 RC 1',
34 => '3.0.0',
35 => '3.0.1',
);
function echoInitialVersionRows($version, $build_to_version_map)
@ -58,6 +59,8 @@ function printRow($version)
{
$versionId = str_replace('.', '', $version);
$versionId = str_replace('Pre-', 'p', $versionId);
$versionId = str_replace(' beta ', 'b', $versionId);
$versionId = str_replace(' RC ', 'rc', $versionId);
echo '<tr id="row-' . $versionId . '">';
echo '<td>' . $version . '</td>';
echo '<td><i id="spinner-' . $versionId . '" class="fa fa-spinner"></i> <span id="span-' . $versionId . '">Waiting...</span></td>';

@ -98,6 +98,9 @@ function processUpdates(startingVersion) {
} else if (startingVersion < 34) {
startVersionUpgrade('300');
executeUpdate(34, '300', '3.0.0');
} else if (startingVersion < 35) {
startVersionUpgrade('301');
executeUpdate(35, '301', '3.0.1');
} else {
installationFinished();
}

@ -116,7 +116,9 @@ hesk_dbConnect();
<div class="col-md-9">
<div class="col-md-8">
<select name="current-version" class="form-control">
<option disabled>Select One, or "No Previous Installation" Below</option>
<optgroup label="Mods for HESK 3">
<option value="34">3.0.0</option>
<option value="33">3.0.0 RC 1 [Prerelease Build]</option>
<option value="32">3.0.0 beta 1 [Prerelease Build]</option>
</optgroup>
@ -172,6 +174,9 @@ hesk_dbConnect();
data-target="#uninstallModal"><i class="fa fa-trash"></i> Uninstall Mods for
HESK
</button>
<a class="btn btn-default btn-block" href="database-validation.php">
<i class="fa fa-check-circle"></i> Validate Database
</a>
</div>
</div>
</div>

@ -905,4 +905,11 @@ function execute300Scripts() {
hesk_dbConnect();
updateVersion('3.0.0');
}
function execute301Scripts() {
global $hesk_settings;
hesk_dbConnect();
updateVersion('3.0.1');
}

@ -52,6 +52,10 @@ function replaceStatusColumn()
function removeOtherColumns()
{
global $hesk_settings;
hesk_dbConnect();
executeQuery("ALTER TABLE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "users` DROP COLUMN `autorefresh`");
executeQuery("ALTER TABLE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "tickets` DROP COLUMN `parent`");
executeQuery("ALTER TABLE `" . hesk_dbEscape($hesk_settings['db_pfix']) . "users` DROP COLUMN `can_manage_settings`");

Loading…
Cancel
Save