Below is a differential between the unpatched vulnerable code and the patched update, for reference.
--- a/elex-helpdesk-customer-support-ticket-system/elex-helpdesk-customer-support-ticket-system.php
+++ b/elex-helpdesk-customer-support-ticket-system/elex-helpdesk-customer-support-ticket-system.php
@@ -3,7 +3,7 @@
* Plugin Name: ELEX HelpDesk & Customer Support Ticket System
* Plugin URI: https://elextensions.com/plugin/wsdesk-wordpress-helpdesk-plugin-free-version/
* Description: Enhances your customer service and enables efficient handling of customer issues.
- * Version: 3.3.6
+ * Version: 3.3.7
* Author: ELEXtensions
* Author URI: https://elextensions.com/
* Text Domain: wsdesk
--- a/elex-helpdesk-customer-support-ticket-system/includes/Tickets/Filters/Sorter.php
+++ b/elex-helpdesk-customer-support-ticket-system/includes/Tickets/Filters/Sorter.php
@@ -30,7 +30,11 @@
$column = wpFluent()->raw( 'STR_TO_DATE(`ticket_date`, '%%b %%d, %%Y %%r')' );
}
- $query->orderBy( $column, Arr::get( $filters, 'sort.dir', 'asc' ) );
+ $dir = strtolower( Arr::get( $filters, 'sort.dir', 'asc' ) );
+ if ( ! in_array( $dir, [ 'asc', 'desc' ] ) ) {
+ $dir = 'asc';
+ }
+ $query->orderBy( $column, $dir );
return $query;
}
--- a/elex-helpdesk-customer-support-ticket-system/includes/class-crm-ajax-functions-one.php
+++ b/elex-helpdesk-customer-support-ticket-system/includes/class-crm-ajax-functions-one.php
@@ -2335,10 +2335,13 @@
wp_send_json_error( array( 'message' => 'Invalid role specified.' ), 400 );
return;
}
+ $current_user = wp_get_current_user();
+ $user_roles = (array) $current_user->roles;
+
if ( ! in_array( 'administrator', $user_roles, true ) && 'administrator' === $role ) {
wp_send_json_error( array( 'message' => 'Unauthorized User.' ), 403 );
}
- if ( ! in_array( 'administrator', $user_roles, true ) && ! in_array( 'supervisor', $user_roles, true ) ) {
+ if ( ! in_array( 'administrator', $user_roles, true ) && ! in_array( 'WSDesk_Supervisor', $user_roles, true ) ) {
wp_send_json_error( array( 'message' => 'Unauthorized User.' ), 403 );
}
$rights = explode( ',', isset( $_POST['rights'] ) ? sanitize_text_field( $_POST['rights'] ) : '' );
--- a/elex-helpdesk-customer-support-ticket-system/includes/class-crm-ajax-functions-two.php
+++ b/elex-helpdesk-customer-support-ticket-system/includes/class-crm-ajax-functions-two.php
@@ -1871,7 +1871,12 @@
if ('woo_order_id' == $value['slug']) {
array_push($new_row, $current_meta[$value['slug']]);
} else {
- array_push($new_row, $field_meta['field_values'][$current_meta[$value['slug']]]);
+ $meta_key = $current_meta[$value['slug']];
+ if (isset($field_meta['field_values'][$meta_key])) {
+ array_push($new_row, $field_meta['field_values'][$meta_key]);
+ } else {
+ array_push($new_row, ($meta_key === '-' || $meta_key === '') ? '' : $meta_key);
+ }
}
break;
case 'radio':
@@ -1879,12 +1884,24 @@
case 'woo_category':
case 'woo_tags':
case 'woo_vendors':
- array_push($new_row, $field_meta['field_values'][$current_meta[$value['slug']]]);
+ $meta_key = $current_meta[$value['slug']];
+ if (isset($field_meta['field_values'][$meta_key])) {
+ array_push($new_row, $field_meta['field_values'][$meta_key]);
+ } else {
+ array_push($new_row, ($meta_key === '-' || $meta_key === '') ? '' : $meta_key);
+ }
break;
case 'checkbox':
$checkbox_values = array();
- foreach ($current_meta[$value['slug']] as $a) {
- array_push($checkbox_values, $field_meta['field_values'][$a]);
+ $meta_vals = $current_meta[$value['slug']];
+ if (is_array($meta_vals)) {
+ foreach ($meta_vals as $a) {
+ if (isset($field_meta['field_values'][$a])) {
+ array_push($checkbox_values, $field_meta['field_values'][$a]);
+ } else {
+ array_push($checkbox_values, ($a === '-' || $a === '') ? '' : $a);
+ }
+ }
}
array_push($new_row, implode(', ', $checkbox_values));
break;
@@ -1895,7 +1912,14 @@
}
fclose($file);
$read_stream = fopen($filename, 'r');
- fpassthru($read_stream);
+ if ( $read_stream ) {
+ while ( ! feof( $read_stream ) ) {
+ echo fread( $read_stream, 8192 );
+ @ob_flush();
+ @flush();
+ }
+ fclose( $read_stream );
+ }
wp_delete_file($filename);
die();
--- a/elex-helpdesk-customer-support-ticket-system/includes/class-crm-ajax-functions.php
+++ b/elex-helpdesk-customer-support-ticket-system/includes/class-crm-ajax-functions.php
@@ -2595,6 +2595,17 @@
}
public static function eh_crm_v2_get_tickets() {
+ $nonce_check = check_ajax_referer( 'wsdesk_nonce', 'nonce', false );
+ $cap_check = ( current_user_can( 'crm_role' ) || current_user_can( 'manage_options' ) );
+ if ( ! $nonce_check || ! $cap_check ) {
+ wp_send_json( array(
+ 'data' => array(),
+ 'recordsTotal' => 0,
+ 'recordsFiltered' => 0,
+ 'error' => __( 'Access Denied!', 'wsdesk' )
+ ) );
+ return;
+ }
$repo = new WSDeskTicketsTicketRepository();
$data['data'] = $repo->get( $_REQUEST );
$data['recordsTotal'] = $repo->count();
@@ -2604,6 +2615,17 @@
}
public static function eh_crm_v2_get_archive_tickets() {
+ $nonce_check = check_ajax_referer( 'wsdesk_nonce', 'nonce', false );
+ $cap_check = ( current_user_can( 'crm_role' ) || current_user_can( 'manage_options' ) );
+ if ( ! $nonce_check || ! $cap_check ) {
+ wp_send_json( array(
+ 'data' => array(),
+ 'recordsTotal' => 0,
+ 'recordsFiltered' => 0,
+ 'error' => __( 'Access Denied!', 'wsdesk' )
+ ) );
+ return;
+ }
$repo = new WSDeskTicketsTicketArchiveRepository();
$data['data'] = $repo->get( $_REQUEST );
@@ -2615,6 +2637,17 @@
}
public static function eh_crm_v2_get_tickets_count() {
+ $nonce_check = check_ajax_referer( 'wsdesk_nonce', 'nonce', false );
+ $cap_check = ( current_user_can( 'crm_role' ) || current_user_can( 'manage_options' ) );
+ if ( ! $nonce_check || ! $cap_check ) {
+ wp_send_json( array(
+ 'data' => array(),
+ 'recordsTotal' => 0,
+ 'recordsFiltered' => 0,
+ 'error' => __( 'Access Denied!', 'wsdesk' )
+ ) );
+ return;
+ }
$repo = new WSDeskTicketsTicketRepository();
$data['all_tickets'] = $repo->count();
$data['views'] = $repo->get_ticket_counts_by_active_views( $_REQUEST );
--- a/elex-helpdesk-customer-support-ticket-system/includes/class-crm-init-handler.php
+++ b/elex-helpdesk-customer-support-ticket-system/includes/class-crm-init-handler.php
@@ -373,6 +373,7 @@
array(
'url' => EH_CRM_MAIN_URL,
'ticket_admin_url' => admin_url( 'admin.php?page=wsdesk_tickets' ),
+ 'nonce' => wp_create_nonce( 'wsdesk_nonce' ),
)
);
wp_enqueue_style( 'quill', EH_CRM_MAIN_CSS . 'quill.snow.css', array(), EH_CRM_VERSION );
@@ -388,6 +389,8 @@
wp_enqueue_style( 'jquery-ui' , EH_CRM_MAIN_CSS . 'jquery-ui.css', array(), EH_CRM_VERSION );
wp_enqueue_style( 'app_css', EH_CRM_MAIN_CSS . 'app.css' , array(), EH_CRM_VERSION );
wp_enqueue_script( 'app_scripts', EH_CRM_MAIN_JS . 'app.js', array(), EH_CRM_VERSION, true );
+ wp_localize_script( 'app_scripts', 'js_obj', $js_var );
+ wp_enqueue_script( 'crm_tickets_v2_source', EH_CRM_MAIN_JS . 'crm_tickets_v2.js', array( 'app_scripts' ), EH_CRM_VERSION, true );
}
if ( 'wsdesk_agents' === $page ) {
wp_enqueue_script( 'crm_agents', EH_CRM_MAIN_JS . 'crm_agents.js', array(), EH_CRM_VERSION );
@@ -438,6 +441,7 @@
array(
'url' => EH_CRM_MAIN_URL,
'ticket_admin_url' => admin_url( 'admin.php?page=wsdesk_archive' ),
+ 'nonce' => wp_create_nonce( 'wsdesk_nonce' ),
)
);
wp_enqueue_style( 'quill', EH_CRM_MAIN_CSS . 'quill.snow.css' , array(), EH_CRM_VERSION );
@@ -453,6 +457,8 @@
wp_enqueue_style( 'jquery-ui' , EH_CRM_MAIN_CSS . 'jquery-ui.css', array(), EH_CRM_VERSION );
wp_enqueue_style( 'app_css', EH_CRM_MAIN_CSS . 'app.css', array(), EH_CRM_VERSION );
wp_enqueue_script( 'app_scripts', EH_CRM_MAIN_JS . 'app.js', array( 'jquery' ), EH_CRM_VERSION, true );
+ wp_localize_script( 'app_scripts', 'js_obj', $js_var );
+ wp_enqueue_script( 'crm_tickets_v2_source', EH_CRM_MAIN_JS . 'crm_tickets_v2.js', array( 'app_scripts' ), EH_CRM_VERSION, true );
}
}
}
--- a/elex-helpdesk-customer-support-ticket-system/includes/wp-fluent/src/QueryBuilder/Adapters/BaseAdapter.php
+++ b/elex-helpdesk-customer-support-ticket-system/includes/wp-fluent/src/QueryBuilder/Adapters/BaseAdapter.php
@@ -52,7 +52,8 @@
$orderBys = '';
if ( isset( $statements['orderBys'] ) && is_array( $statements['orderBys'] ) ) {
foreach ( $statements['orderBys'] as $orderBy ) {
- $orderBys .= $this->wrapSanitizer( $orderBy['field'] ) . ' ' . $orderBy['type'] . ', ';
+ $direction = strtoupper( $orderBy['type'] ) === 'DESC' ? 'DESC' : 'ASC';
+ $orderBys .= $this->wrapSanitizer( $orderBy['field'] ) . ' ' . $direction . ', ';
}
$orderBys = trim( $orderBys, ', ' );
if ( $orderBys ) {
--- a/elex-helpdesk-customer-support-ticket-system/index.php
+++ b/elex-helpdesk-customer-support-ticket-system/index.php
@@ -1 +0,0 @@
-<?php //silence is golden
--- a/elex-helpdesk-customer-support-ticket-system/views/tickets/crm_tickets_v2_all.php
+++ b/elex-helpdesk-customer-support-ticket-system/views/tickets/crm_tickets_v2_all.php
@@ -486,6 +486,7 @@
jQuery('button.buttons-select-none').addClass('hidden')
});
jQuery('#all_tickets_table_v2').on('xhr.dt', function (e, settings, json) {
+ if (!json) return;
if (!dtFilter.view.views) {
var activeItem = jQuery('.side-bar-filter').find('li.active');