Below is a differential between the unpatched vulnerable code and the patched update, for reference.
--- a/gamipress/gamipress.php
+++ b/gamipress/gamipress.php
@@ -3,7 +3,7 @@
* Plugin Name: GamiPress
* Plugin URI: https://gamipress.com
* Description: The most flexible and powerful gamification system for WordPress.
- * Version: 7.8.7
+ * Version: 7.8.8
* Author: GamiPress
* Author URI: https://gamipress.com/
* Text Domain: gamipress
@@ -121,7 +121,7 @@
private function constants() {
// Plugin version
- define( 'GAMIPRESS_VER', '7.8.7' );
+ define( 'GAMIPRESS_VER', '7.8.8' );
// Plugin file
define( 'GAMIPRESS_FILE', __FILE__ );
--- a/gamipress/includes/custom-tables/logs.php
+++ b/gamipress/includes/custom-tables/logs.php
@@ -414,4 +414,18 @@
function gamipress_add_logs_meta_boxes() {
remove_meta_box( 'submitdiv', 'gamipress_logs', 'side' );
}
-add_action( 'add_meta_boxes', 'gamipress_add_logs_meta_boxes' );
No newline at end of file
+add_action( 'add_meta_boxes', 'gamipress_add_logs_meta_boxes' );
+
+// CT Ajax List
+// Override ajax list capability
+add_filter( 'ct_ajax_list_table_gamipress_logs_capability', 'gamipress_get_manager_capability' );
+
+// Parse query args
+function ct_ajax_list_table_gamipress_logs_query_args( $query_args ) {
+
+ $query_args = gamipress_sanitize_query_args( $query_args, gamipress_logs_query_vars_rules() );
+
+ return $query_args;
+
+}
+add_filter( 'ct_ajax_list_table_gamipress_logs_query_args', 'ct_ajax_list_table_gamipress_logs_query_args' );
--- a/gamipress/includes/custom-tables/user-earnings.php
+++ b/gamipress/includes/custom-tables/user-earnings.php
@@ -706,4 +706,18 @@
function gamipress_user_earnings_row_actions( $row_actions, $object ) {
return array();
}
-add_filter( 'gamipress_user_earnings_row_actions', 'gamipress_user_earnings_row_actions', 10, 2 );
No newline at end of file
+add_filter( 'gamipress_user_earnings_row_actions', 'gamipress_user_earnings_row_actions', 10, 2 );
+
+// CT Ajax List
+// Override ajax list capability
+add_filter( 'ct_ajax_list_table_gamipress_user_earnings_capability', 'gamipress_get_manager_capability' );
+
+// Parse query args
+function ct_ajax_list_table_gamipress_user_earnings_query_args( $query_args ) {
+
+ $query_args = gamipress_sanitize_query_args( $query_args, gamipress_user_earnings_query_vars_rules() );
+
+ return $query_args;
+
+}
+add_filter( 'ct_ajax_list_table_gamipress_user_earnings_query_args', 'ct_ajax_list_table_gamipress_user_earnings_query_args' );
No newline at end of file
--- a/gamipress/includes/shortcodes/gamipress_earnings.php
+++ b/gamipress/includes/shortcodes/gamipress_earnings.php
@@ -514,7 +514,58 @@
$ct_table = ct_setup_table( 'gamipress_user_earnings' );
// Sanitize query args
- $query_args = gamipress_sanitize_query_args( $query_args, array(
+ $query_args = gamipress_sanitize_query_args( $query_args, gamipress_user_earnings_query_vars_rules() );
+
+ return new CT_Query( $query_args );
+
+}
+
+/**
+ * Earnings shortcode defaults attributes values
+ *
+ * @since 7.1.6
+ *
+ * @return array
+ */
+function gamipress_earnings_shortcode_defaults() {
+
+ return apply_filters( 'gamipress_earnings_shortcode_defaults', array(
+ 'current_user' => 'yes',
+ 'user_id' => '0',
+ 'force_responsive' => '',
+ 'limit' => '10',
+ 'pagination' => 'yes',
+ 'order' => 'DESC',
+ 'include' => '',
+ 'exclude' => '',
+ 'points' => 'yes',
+ 'points_types' => 'all',
+ 'awards' => 'yes',
+ 'deducts' => 'yes',
+ 'achievements' => 'yes',
+ 'achievement_types' => 'all',
+ 'steps' => 'yes',
+ 'achievements_without_points' => 'yes',
+ 'ranks' => 'yes',
+ 'rank_types' => 'all',
+ 'rank_requirements' => 'yes',
+ ) );
+
+}
+
+/**
+ * User Earnings query vars rules
+ *
+ * @since 7.8.8
+ *
+ * @return array
+ */
+function gamipress_user_earnings_query_vars_rules() {
+
+ // Setup table
+ $ct_table = ct_setup_table( 'gamipress_user_earnings' );
+
+ $rules = apply_filters( 'gamipress_user_earnings_query_vars_rules', array(
// Query fields
'orderby' => array(
'type' => 'string',
@@ -565,39 +616,8 @@
),
) );
- return new CT_Query( $query_args );
-
-}
-
-/**
- * Earnings shortcode defaults attributes values
- *
- * @since 7.1.6
- *
- * @return array
- */
-function gamipress_earnings_shortcode_defaults() {
+ ct_reset_setup_table();
- return apply_filters( 'gamipress_earnings_shortcode_defaults', array(
- 'current_user' => 'yes',
- 'user_id' => '0',
- 'force_responsive' => '',
- 'limit' => '10',
- 'pagination' => 'yes',
- 'order' => 'DESC',
- 'include' => '',
- 'exclude' => '',
- 'points' => 'yes',
- 'points_types' => 'all',
- 'awards' => 'yes',
- 'deducts' => 'yes',
- 'achievements' => 'yes',
- 'achievement_types' => 'all',
- 'steps' => 'yes',
- 'achievements_without_points' => 'yes',
- 'ranks' => 'yes',
- 'rank_types' => 'all',
- 'rank_requirements' => 'yes',
- ) );
+ return $rules;
}
No newline at end of file
--- a/gamipress/includes/shortcodes/gamipress_logs.php
+++ b/gamipress/includes/shortcodes/gamipress_logs.php
@@ -302,7 +302,54 @@
$ct_table = ct_setup_table( 'gamipress_logs' );
// Sanitize query args
- $query_args = gamipress_sanitize_query_args( $query_args, array(
+ $query_args = gamipress_sanitize_query_args( $query_args, gamipress_logs_query_vars_rules() );
+
+ return new CT_Query( $query_args );
+
+}
+
+// CMB2 detects 'default' => 'date' as invalid callback because php has the date() function
+function gamipress_logs_order_by_default_cb() {
+ return 'date';
+}
+
+/**
+ * Logs shortcode defaults attributes values
+ *
+ * @since 7.1.6
+ *
+ * @return array
+ */
+function gamipress_logs_shortcode_defaults() {
+
+ return apply_filters( 'gamipress_logs_shortcode_defaults', array(
+ 'type' => 'all',
+ 'current_user' => 'no',
+ 'user_id' => '0',
+ 'access' => 'any',
+ 'limit' => '10',
+ 'pagination' => 'yes',
+ 'orderby' => 'date',
+ 'order' => 'ASC',
+ 'include' => '',
+ 'exclude' => '',
+ ) );
+
+}
+
+/**
+ * Logs query vars rules
+ *
+ * @since 7.8.8
+ *
+ * @return array
+ */
+function gamipress_logs_query_vars_rules() {
+
+ // Setup table
+ $ct_table = ct_setup_table( 'gamipress_logs' );
+
+ $rules = apply_filters( 'gamipress_logs_query_vars_rules', array(
// Query fields
'orderby' => array(
'type' => 'string',
@@ -344,35 +391,8 @@
),
) );
- return new CT_Query( $query_args );
-
-}
-
-// CMB2 detects 'default' => 'date' as invalid callback because php has the date() function
-function gamipress_logs_order_by_default_cb() {
- return 'date';
-}
+ ct_reset_setup_table();
-/**
- * Logs shortcode defaults attributes values
- *
- * @since 7.1.6
- *
- * @return array
- */
-function gamipress_logs_shortcode_defaults() {
-
- return apply_filters( 'gamipress_logs_shortcode_defaults', array(
- 'type' => 'all',
- 'current_user' => 'no',
- 'user_id' => '0',
- 'access' => 'any',
- 'limit' => '10',
- 'pagination' => 'yes',
- 'orderby' => 'date',
- 'order' => 'ASC',
- 'include' => '',
- 'exclude' => '',
- ) );
+ return $rules;
}
No newline at end of file
--- a/gamipress/libraries/ct-ajax-list-table/ct-ajax-list-table.php
+++ b/gamipress/libraries/ct-ajax-list-table/ct-ajax-list-table.php
@@ -44,7 +44,7 @@
private function constants() {
// Plugin version
- define( 'CT_AJAX_LIST_TABLE_VER', '1.0.1' );
+ define( 'CT_AJAX_LIST_TABLE_VER', '1.0.2' );
// Plugin file
define( 'CT_AJAX_LIST_TABLE_FILE', __FILE__ );
--- a/gamipress/libraries/ct-ajax-list-table/includes/ajax-functions.php
+++ b/gamipress/libraries/ct-ajax-list-table/includes/ajax-functions.php
@@ -20,12 +20,26 @@
wp_send_json_error();
}
+ // Setup the CT Table
$ct_table = ct_setup_table( sanitize_text_field( $_GET['object'] ) );
if( ! is_object( $ct_table ) ) {
wp_send_json_error();
}
+ /**
+ * Filter capability to check
+ *
+ * @param string $capability By default, "manage_options"
+ *
+ * @return string
+ */
+ $capability = apply_filters( 'ct_ajax_list_table_' . $ct_table->name . '_capability', 'manage_options' );
+
+ if( ! current_user_can( $capability ) ) {
+ wp_send_json_error();
+ }
+
// Setup this constant to allow from CT_List_Table meet that this render comes from this plugin
@define( 'IS_CT_AJAX_LIST_TABLE', true );
@@ -50,6 +64,15 @@
$query_args['paged'] = absint( $query_args['paged'] );
}
+ /**
+ * Filter query vars
+ *
+ * @param array $query_args
+ *
+ * @return array
+ */
+ $query_args = apply_filters( 'ct_ajax_list_table_' . $ct_table->name . '_query_args', $query_args );
+
$ct_ajax_list_items_per_page = $query_args['items_per_page'];
add_filter( 'edit_' . $ct_table->name . '_per_page', 'ct_ajax_list_override_items_per_page' );