'', 'email' => '', 'cleanpass' => '', 'user' => '', 'autoassign' => 'Y', // Signature 'signature' => '', // Permissions 'isadmin' => 1, 'categories' => array('1'), 'features' => array('can_view_tickets','can_reply_tickets','can_change_cat','can_assign_self','can_view_unassigned','can_view_online','can_resolve','can_submit_any_cat'), // Preferences 'afterreply' => 0, // Defaults 'autostart' => 1, 'notify_customer_new' => 1, 'notify_customer_reply' => 1, 'show_suggested' => 1, 'autoreload' => 0, // Notifications 'notify_new_unassigned' => 1, 'notify_overdue_unassigned' => 1, 'notify_new_my' => 1, 'notify_overdue_my' => 1, 'notify_reply_unassigned' => 1, 'notify_reply_my' => 1, 'notify_assigned' => 1, 'notify_note' => 1, 'notify_pm' => 1, ); /* A list of all categories */ $hesk_settings['categories'] = array(); $res = hesk_dbQuery('SELECT `id`,`name` FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'categories` ORDER BY `cat_order` ASC'); while ($row=hesk_dbFetchAssoc($res)) { if ( hesk_okCategory($row['id'], 0) ) { $hesk_settings['categories'][$row['id']] = $row['name']; } } /* Non-admin users may not create users with more permissions than they have */ if ( ! $_SESSION['isadmin']) { /* Can't create admin users */ if ( isset($_POST['isadmin']) ) { unset($_POST['isadmin']); } /* Can only add features he/she has access to */ $hesk_settings['features'] = array_intersect( explode(',', $_SESSION['heskprivileges']) , $hesk_settings['features']); /* Can user modify auto-assign setting? */ if ($hesk_settings['autoassign'] && ( ! hesk_checkPermission('can_assign_self', 0) || ! hesk_checkPermission('can_assign_others', 0) ) ) { $hesk_settings['autoassign'] = 0; } } /* Use any set values, default otherwise */ foreach ($default_userdata as $k => $v) { if ( ! isset($_SESSION['userdata'][$k]) ) { $_SESSION['userdata'][$k] = $v; } } $_SESSION['userdata'] = hesk_stripArray($_SESSION['userdata']); /* What should we do? */ if ( $action = hesk_REQUEST('a') ) { // Check permission again - required manage users permission for all actions hesk_checkPermission('can_man_users'); if ($action == 'reset_form') { $_SESSION['edit_userdata'] = TRUE; header('Location: ./manage_users.php'); } elseif ($action == 'edit') {edit_user();} elseif ( defined('HESK_DEMO') ) {hesk_process_messages($hesklang['ddemo'], 'manage_users.php', 'NOTICE');} elseif ($action == 'new') {new_user();} elseif ($action == 'save') {update_user();} elseif ($action == 'remove') {remove();} elseif ($action == 'autoassign') {toggle_autoassign();} elseif ($action == 'resetmfa') {reset_mfa();} else {hesk_error($hesklang['invalid_action']);} } else { /* If one came from the Edit page make sure we reset user values */ if (isset($_SESSION['save_userdata'])) { $_SESSION['userdata'] = $default_userdata; unset($_SESSION['save_userdata']); } if (isset($_SESSION['edit_userdata'])) { $_SESSION['userdata'] = $default_userdata; unset($_SESSION['edit_userdata']); } /* Print header */ require_once(HESK_PATH . 'inc/header.inc.php'); /* Print main manage users page */ require_once(HESK_PATH . 'inc/show_admin_nav.inc.php'); ?> 0) { while ($myuser = hesk_dbFetchAssoc($res)) { if (compare_user_permissions($myuser['id'], $myuser['isadmin'], explode(',', $myuser['categories']) , explode(',', $myuser['heskprivileges']))) { hesk_show_notice(sprintf($hesklang['pop3_warning'], $myuser['name'], $hesk_settings['pop3_user']) . "

" . $hesklang['fetch_warning'], $hesklang['warn']); break; } } } } // If IMAP fetching is active, no user should have the same email address if ($hesk_settings['imap'] && hesk_validateEmail($hesk_settings['imap_user'], 'ERR', 0)) { $res = hesk_dbQuery("SELECT * FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `email` LIKE '".hesk_dbEscape($hesk_settings['imap_user'])."'"); if (hesk_dbNumRows($res) > 0) { while ($myuser = hesk_dbFetchAssoc($res)) { if (compare_user_permissions($myuser['id'], $myuser['isadmin'], explode(',', $myuser['categories']) , explode(',', $myuser['heskprivileges']))) { hesk_show_notice(sprintf($hesklang['imap_warning'], $myuser['name'], $hesk_settings['imap_user']) . "

" . $hesklang['fetch_warning'], $hesklang['warn']); break; } } } } // We probably shouldn't have two or more users with the same email address; show a notice if so $res = hesk_dbQuery('SELECT `email`, COUNT(*) AS `cnt` FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'users` GROUP BY `email` HAVING `cnt` > 1'); if (hesk_dbNumRows($res) > 0) { $emails = array(); while ($row = hesk_dbFetchAssoc($res)) { $emails[$row['email']] = $row['cnt']; } //hesk_show_notice($hesklang['uue'] . '

' . implode('
', array_keys($emails))); hesk_show_notice($hesklang['uue']); } ?>

0, 'closed' => 0, 'total' => 0 ); } $tickets_per_user[$row['owner']]['total'] += $row['cnt']; if ($row['open']) { $tickets_per_user[$row['owner']]['open'] += $row['cnt']; } else { $tickets_per_user[$row['owner']]['closed'] += $row['cnt']; } } $res = hesk_dbQuery('SELECT * FROM `'.hesk_dbEscape($hesk_settings['db_pfix']).'users` ORDER BY `name` ASC'); $cannot_manage = array(); while ($myuser = hesk_dbFetchAssoc($res)) { $can_manage_this_user = compare_user_permissions($myuser['id'], $myuser['isadmin'], explode(',', $myuser['categories']) , explode(',', $myuser['heskprivileges'])); $can_view_this_user = ($can_manage_this_user || $can_view_users) ? true : false; if (!$can_view_this_user) { $cannot_manage[$myuser['id']] = array('name' => $myuser['name'], 'user' => $myuser['user'], 'email' => $myuser['email']); continue; } $table_row = ''; if (isset($_SESSION['seluser']) && $myuser['id'] == $_SESSION['seluser']) { $table_row = 'class="ticket-new"'; unset($_SESSION['seluser']); } /* User online? */ if ($hesk_settings['online']) { if (isset($hesk_settings['users_online'][$myuser['id']])) { $myuser['name'] = ' ' . $myuser['name']; } else { $myuser['name'] = ' ' . $myuser['name']; } } /* To edit yourself go to "Profile" page, not here. */ if ($myuser['id'] == $_SESSION['id']) { $edit_code = ' '; } elseif ($can_manage_this_user) { $edit_code = ' '; } else { $edit_code = ''; } if ($myuser['isadmin']) { $myuser['isadmin'] = $hesklang['administrator']; } else { $myuser['isadmin'] = $hesklang['staff']; } /* Deleting user with ID 1 (default administrator) is not allowed */ if ($myuser['id'] == 1) { $remove_code = ''; } elseif ($myuser['id'] == $_SESSION['id']) { // You cannot delete your own account $remove_code = ''; } elseif ($can_manage_this_user) { $modal_body = $hesklang['sure_remove_user']; if (isset($tickets_per_user[$myuser['id']]) && $tickets_per_user[$myuser['id']]['total'] > 0) { $total_tickets = $tickets_per_user[$myuser['id']]['total']; $open_tickets = $tickets_per_user[$myuser['id']]['open']; $modal_body .= '

'. '
'.$hesklang['sm_notice'].'
'.sprintf($hesklang['deleting_user_with_tickets'], $total_tickets, $open_tickets).'
'; } $modal_id = hesk_generate_delete_modal($hesklang['confirm_deletion'], $modal_body, 'manage_users.php?a=remove&id='.$myuser['id'].'&token='.hesk_token_echo(0)); $remove_code = ' '; } else { $remove_code = ''; } /* Is auto assign enabled? */ if ($hesk_settings['autoassign']) { if ($myuser['autoassign']) { $autoassign_code = ' '; } elseif ($can_manage_this_user) { $autoassign_code = ' '; } else { $autoassign_code = ''; } } else { $autoassign_code = ''; } echo << EOC; if ($hesk_settings['rating']) { $alt = $myuser['rating'] ? sprintf($hesklang['rated'], sprintf("%01.1f", $myuser['rating']), ($myuser['ratingneg']+$myuser['ratingpos'])) : $hesklang['not_rated']; echo ''; } if ($hesk_settings['autoassign']) { echo ''; } $mfa_enrollment = intval($myuser['mfa_enrollment']); $mfa_status = $hesklang['mfa_method_none']; $mfa_reset = ''; $modal_id = hesk_generate_delete_modal($hesklang['mfa_reset_to_default'], $hesklang['mfa_reset_confirm'], 'manage_users.php?a=resetmfa&id='.$myuser['id'].'&token='.hesk_token_echo(0), $hesklang['mfa_reset_yes']); if ($mfa_enrollment === 1) { $mfa_status = $hesklang['mfa_method_email']; if (!$hesk_settings['require_mfa'] && $can_manage_this_user) { $mfa_reset = ''; } } elseif ($mfa_enrollment === 2) { $mfa_status = $hesklang['mfa_method_auth_app_short']; if ($can_manage_this_user) { $mfa_reset = ''; } } echo <<$mfa_status $mfa_reset EOC; } // End while ?>
$myuser[name] $myuser[email] $myuser[user] $myuser[isadmin] '.hesk3_get_rating($myuser['rating']).' ' . $autoassign_code . '

$edit_code $remove_code

>

'; hesk_handle_messages(); echo '
'; } ?>
' . $hesklang['enter_real_name'] . ''; $errors[] = 'name'; } if (hesk_validateEmail( hesk_POST('email'), 'ERR', 0)) { $myuser['email'] = hesk_validateEmail( hesk_POST('email'), 'ERR', 0); } else { $hesk_error_buffer .= '
  • ' . $hesklang['enter_valid_email'] . '
  • '; $errors[] = 'email'; } if (hesk_input( hesk_POST('user') )) { $myuser['user'] = hesk_input(hesk_POST('user')); } else { $hesk_error_buffer .= '
  • ' . $hesklang['enter_username'] . '
  • '; $errors[] = 'user'; } $myuser['isadmin'] = empty($_POST['isadmin']) ? 0 : 1; $myuser['signature'] = hesk_input( hesk_POST('signature') ); $myuser['autoassign'] = hesk_POST('autoassign') == 'Y' ? 1 : 0; /* If it's not admin at least one category and fature is required */ $myuser['categories'] = array(); $myuser['features'] = array(); if ($myuser['isadmin']==0) { if (empty($_POST['categories']) || ! is_array($_POST['categories']) ) { $hesk_error_buffer .= '
  • ' . $hesklang['asign_one_cat'] . '
  • '; $errors[] = 'categories'; } else { foreach ($_POST['categories'] as $tmp) { if (is_array($tmp)) { continue; } if ($tmp = intval($tmp)) { $myuser['categories'][] = $tmp; } } } if (empty($_POST['features']) || ! is_array($_POST['features']) ) { $hesk_error_buffer .= '
  • ' . $hesklang['asign_one_feat'] . '
  • '; $errors[] = 'features'; } else { foreach ($_POST['features'] as $tmp) { if (in_array($tmp,$hesk_settings['features'])) { $myuser['features'][] = $tmp; } } } // One needs view tickets permissions in one has reply to permission if (in_array('can_reply_tickets', $myuser['features'])) { $myuser['features'][] = 'can_view_tickets'; } } if (hesk_mb_strlen($myuser['signature'])>1000) { $hesk_error_buffer .= '
  • ' . $hesklang['signature_long'] . '
  • '; $errors[] = 'signature'; } /* Password */ $myuser['cleanpass'] = ''; $newpass = hesk_input( hesk_POST('newpass') ); $passlen = strlen($newpass); if ($pass_required || $passlen > 0) { /* At least 5 chars? */ if ($passlen < 5) { $hesk_error_buffer .= '
  • ' . $hesklang['password_not_valid'] . '
  • '; $errors[] = 'passwords'; } // Too long? elseif ($passlen > 64) { $hesk_error_buffer .= '
  • ' . $hesklang['pass_len'] . '
  • '; $errors[] = 'passwords'; } /* Check password confirmation */ else { $newpass2 = hesk_input( hesk_POST('newpass2') ); if ($newpass != $newpass2) { $hesk_error_buffer .= '
  • ' . $hesklang['passwords_not_same'] . '
  • '; $errors[] = 'passwords'; } else { $myuser['pass'] = hesk_password_hash($newpass); $myuser['cleanpass'] = $newpass; define('PASSWORD_CHANGED', true); } } } /* After reply */ $myuser['afterreply'] = intval( hesk_POST('afterreply') ); if ($myuser['afterreply'] != 1 && $myuser['afterreply'] != 2) { $myuser['afterreply'] = 0; } // Defaults $myuser['autostart'] = isset($_POST['autostart']) ? 1 : 0; $myuser['notify_customer_new'] = isset($_POST['notify_customer_new']) ? 1 : 0; $myuser['notify_customer_reply'] = isset($_POST['notify_customer_reply']) ? 1 : 0; $myuser['show_suggested'] = isset($_POST['show_suggested']) ? 1 : 0; $myuser['autoreload'] = isset($_POST['autoreload']) ? 1 : 0; if ($myuser['autoreload']) { $myuser['autoreload'] = intval(hesk_POST('reload_time')); if (hesk_POST('secmin') == 'min') { $myuser['autoreload'] *= 60; } if ($myuser['autoreload'] < 0 || $myuser['autoreload'] > 65535) { $myuser['autoreload'] = 30; } } /* Notifications */ $myuser['notify_new_unassigned'] = empty($_POST['notify_new_unassigned']) ? 0 : 1; $myuser['notify_overdue_unassigned'] = empty($_POST['notify_overdue_unassigned']) ? 0 : 1; $myuser['notify_new_my'] = empty($_POST['notify_new_my']) ? 0 : 1; $myuser['notify_overdue_my'] = empty($_POST['notify_overdue_my']) ? 0 : 1; $myuser['notify_reply_unassigned'] = empty($_POST['notify_reply_unassigned']) ? 0 : 1; $myuser['notify_reply_my'] = empty($_POST['notify_reply_my']) ? 0 : 1; $myuser['notify_assigned'] = empty($_POST['notify_assigned']) ? 0 : 1; $myuser['notify_note'] = empty($_POST['notify_note']) ? 0 : 1; $myuser['notify_pm'] = empty($_POST['notify_pm']) ? 0 : 1; /* Save entered info in session so we don't lose it in case of errors */ $_SESSION['userdata'] = $myuser; /* Any errors */ if (strlen($hesk_error_buffer)) { if ($myuser['isadmin']) { // Preserve default staff data for the form global $default_userdata; $_SESSION['userdata']['features'] = $default_userdata['features']; $_SESSION['userdata']['categories'] = $default_userdata['categories']; } $_SESSION['userdata']['errors'] = $errors; $hesk_error_buffer = $hesklang['rfm'].'

    '; hesk_process_messages($hesk_error_buffer,$redirect_to); } // "can_unban_emails" feature also enables "can_ban_emails" if ( in_array('can_unban_emails', $myuser['features']) && ! in_array('can_ban_emails', $myuser['features']) ) { $myuser['features'][] = 'can_ban_emails'; } // "can_unban_ips" feature also enables "can_ban_ips" if ( in_array('can_unban_ips', $myuser['features']) && ! in_array('can_ban_ips', $myuser['features']) ) { $myuser['features'][] = 'can_ban_ips'; } return $myuser; } // End hesk_validateUserInfo() function remove() { global $hesk_settings, $hesklang; /* A security check */ hesk_token_check(); $myuser = intval( hesk_GET('id' ) ) or hesk_error($hesklang['no_valid_id']); /* You can't delete the default user */ if ($myuser == 1) { hesk_process_messages($hesklang['cant_del_admin'],'./manage_users.php'); } /* You can't delete your own account (the one you are logged in) */ if ($myuser == $_SESSION['id']) { hesk_process_messages($hesklang['cant_del_own'],'./manage_users.php'); } // Make sure we have permission to edit this user if ( ! compare_user_permissions($myuser)) { hesk_process_messages($hesklang['npea'],'manage_users.php'); } /* Un-assign all tickets for this user */ // Don't update resolved tickets "Last modified" // $res = hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` SET `owner`=0, `lastchange`=`lastchange` WHERE `owner`='".intval($myuser)."' AND `status` = '3'"); // For unresolved tickets, update the "Last modified" $res = hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."tickets` SET `owner`=0 WHERE `owner`='".intval($myuser)."' AND `status` <> '3'"); /* Delete user info */ $res = hesk_dbQuery("DELETE FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."users` WHERE `id`='".intval($myuser)."'"); if (hesk_dbAffectedRows() != 1) { hesk_process_messages($hesklang['int_error'].': '.$hesklang['user_not_found'],'./manage_users.php'); } /* Delete any user reply drafts */ hesk_dbQuery("DELETE FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."reply_drafts` WHERE `owner`={$myuser}"); // Clear users' authentication and MFA tokens hesk_dbQuery("DELETE FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."auth_tokens` WHERE `user_id` = {$myuser}"); hesk_dbQuery("DELETE FROM `".hesk_dbEscape($hesk_settings['db_pfix'])."mfa_verification_tokens` WHERE `user_id` = {$myuser}"); // Refresh autoassign configs to ensure their ID is gone hesk_updateAutoassignConfigs(); hesk_process_messages($hesklang['sel_user_removed'],'./manage_users.php','SUCCESS'); } // End remove() function toggle_autoassign() { global $hesk_settings, $hesklang; /* A security check */ hesk_token_check(); $myuser = intval( hesk_GET('id' ) ) or hesk_error($hesklang['no_valid_id']); $_SESSION['seluser'] = $myuser; if ( intval( hesk_GET('s') ) ) { $autoassign = 1; $tmp = $hesklang['uaaon']; } else { $autoassign = 0; $tmp = $hesklang['uaaoff']; } /* Update auto-assign settings */ $res = hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."users` SET `autoassign`='{$autoassign}' WHERE `id`='".intval($myuser)."'"); if (hesk_dbAffectedRows() != 1) { hesk_process_messages($hesklang['int_error'].': '.$hesklang['user_not_found'],'./manage_users.php'); } hesk_process_messages($tmp,'./manage_users.php','SUCCESS'); } // End toggle_autoassign() function reset_mfa() { global $hesk_settings, $hesklang; /* A security check */ hesk_token_check(); require(HESK_PATH . 'inc/mfa_functions.inc.php'); $myuser = intval(hesk_GET('id')) or hesk_error($hesklang['no_valid_id']); // Make sure we have permission to edit this user if ( ! compare_user_permissions($myuser)) { hesk_process_messages($hesklang['npea'],'manage_users.php'); } $_SESSION['seluser'] = $myuser; $target_enrollment = 0; if ($hesk_settings['require_mfa']) { $target_enrollment = 1; } hesk_dbQuery("UPDATE `".hesk_dbEscape($hesk_settings['db_pfix'])."users` SET `mfa_enrollment` = {$target_enrollment}, `mfa_secret` = NULL WHERE `id` = {$myuser}"); if (hesk_dbAffectedRows() != 1) { hesk_process_messages($hesklang['int_error'].': '.$hesklang['user_not_found'],'./manage_users.php'); } delete_mfa_backup_codes($myuser); delete_mfa_codes($myuser); hesk_process_messages($hesklang['mfa_reset'], './manage_users.php', 'SUCCESS'); } ?>