fix: resolve all Week 2 performance & security issues (F1.10–F1.19)
Security:
- Replace maybe_serialize() in cookies with json_encode() (PHP object injection fix)
- Add PayPal webhook signature verification
- Add current_user_can('manage_options') to all 18 admin-ajax handlers
Performance:
- Remove flush_rewrite_rules() from init hooks (Thankyou + Payment)
- Add activation/deactivation hooks for flush_rewrite_rules
- Cache currency, country, flags JSON reads in static variables
- Add server-side pagination to Customer::formipay_tabledata_customers()
- Optimize Order::formipay_tabledata_orders() with COUNT(*) GROUP BY
Cleanup:
- Delete Paypal.phpbak backup file
- Fix timezone hardcode Asia/Jakarta → wp_timezone_string()
- Create uninstall.php for proper cleanup on uninstall
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -148,7 +148,7 @@ class Order {
|
||||
|
||||
$unique_id = isset($order_meta_data['session_id']) ? sanitize_text_field($order_meta_data['session_id']) : '';
|
||||
$thankyou_url = site_url('/' . $thankyou_link . '/' . base64_encode($form_id . ':::' . $order_data['id'] . ':::' . $unique_id));
|
||||
setcookie('fp_access', maybe_serialize([$order_data['id'] => $unique_id]), time() + 86400, '/');
|
||||
setcookie('fp_access', wp_json_encode([$order_data['id'] => $unique_id]), time() + 86400, '/', '', is_ssl(), true);
|
||||
|
||||
if (
|
||||
!empty($this->order_data['redirect_url']) &&
|
||||
@@ -768,6 +768,10 @@ class Order {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
}
|
||||
|
||||
$type = isset($_REQUEST['type']) ? sanitize_text_field( wp_unslash($_REQUEST['type']) ) : '';
|
||||
$search = isset($_REQUEST['search']) ? sanitize_text_field( wp_unslash($_REQUEST['search']) ) : '';
|
||||
|
||||
@@ -932,26 +936,33 @@ class Order {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
|
||||
$all_orders = $this->get();
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
}
|
||||
|
||||
global $wpdb;
|
||||
$table = $wpdb->prefix . 'formipay_orders';
|
||||
|
||||
// Count order statuses efficiently
|
||||
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.InterpolatedNotPrepared
|
||||
$status_counts = $wpdb->get_results("SELECT `status`, COUNT(*) as cnt FROM {$table} GROUP BY `status`", ARRAY_A);
|
||||
|
||||
$order_status = [
|
||||
'all' => 0,
|
||||
'completed' => 0,
|
||||
'on-hold' => 0,
|
||||
'payment-confirm' => 0
|
||||
];
|
||||
|
||||
// Count order statuses
|
||||
if (!empty($all_orders)) {
|
||||
foreach ($all_orders as $order) {
|
||||
$order_status['all']++;
|
||||
$order_status[$order->status]++;
|
||||
|
||||
if (!empty($status_counts)) {
|
||||
foreach ($status_counts as $row) {
|
||||
$order_status['all'] += (int) $row['cnt'];
|
||||
if (isset($order_status[$row['status']])) {
|
||||
$order_status[$row['status']] = (int) $row['cnt'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
global $wpdb;
|
||||
$table = $wpdb->prefix . 'formipay_orders';
|
||||
|
||||
$where = [];
|
||||
$params = [];
|
||||
|
||||
@@ -1028,6 +1039,10 @@ class Order {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
}
|
||||
|
||||
$order_id = isset($_REQUEST['id']) ? intval($_REQUEST['id']) : 0;
|
||||
|
||||
$delete = $this->delete($order_id);
|
||||
@@ -1052,6 +1067,10 @@ class Order {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
}
|
||||
|
||||
if( empty($_REQUEST['ids']) ){
|
||||
wp_send_json_error( [
|
||||
'title' => esc_html__( 'Failed', 'formipay' ),
|
||||
@@ -1095,6 +1114,10 @@ class Order {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
}
|
||||
|
||||
$order_id = isset($_REQUEST['order']) ? intval($_REQUEST['order']) : 0;
|
||||
|
||||
wp_send_json(formipay_get_order($order_id));
|
||||
@@ -1104,6 +1127,10 @@ class Order {
|
||||
public function formipay_change_order_status() {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
}
|
||||
|
||||
$order_id = isset($_REQUEST['id']) ? intval($_REQUEST['id']) : 0;
|
||||
$status = isset($_REQUEST['status']) ? sanitize_text_field( wp_unslash($_REQUEST['status']) ) : '';
|
||||
@@ -1139,6 +1166,10 @@ class Order {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
}
|
||||
|
||||
$editable_field = [];
|
||||
|
||||
$order_id = isset($_REQUEST['order_id']) ? intval($_REQUEST['order_id']) : 0;
|
||||
@@ -1183,6 +1214,10 @@ class Order {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
}
|
||||
|
||||
$order_id = isset($_REQUEST['order_id']) ? intval($_REQUEST['order_id']) : 0;
|
||||
// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
|
||||
$raw_data = isset($_REQUEST['new_values']) ? wp_unslash( $_REQUEST['new_values'] ) : [];
|
||||
@@ -1234,6 +1269,10 @@ class Order {
|
||||
|
||||
check_ajax_referer( 'formipay-order-details', '_wpnonce' );
|
||||
|
||||
if ( ! current_user_can( 'manage_options' ) ) {
|
||||
wp_send_json_error( [ 'message' => 'Unauthorized' ] );
|
||||
}
|
||||
|
||||
$order_id = isset($_REQUEST['order_id']) ? intval($_REQUEST['order_id']) : 0;
|
||||
$method = isset($_REQUEST['method']) ? sanitize_text_field( wp_unslash($_REQUEST['method']) ) : '';
|
||||
$password = isset($_REQUEST['password']) ? sanitize_text_field( wp_unslash($_REQUEST['password']) ) : '';
|
||||
|
||||
Reference in New Issue
Block a user