From e5cc6a9d15033360371ae4d9600165ea05765b36 Mon Sep 17 00:00:00 2001 From: Kazem Alghasi Date: Sat, 3 Oct 2026 18:15:46 +0330 Subject: [PATCH] fix(bridge): resolve corrupted PDF downloads and improve token handling Relocate PDF and commitment form download logic from shortcode execution to the `template_redirect` hook to prevent HTML output from corrupting binary streams. Key improvements: - Moved download interception to `template_redirect` to ensure clean headers and prevent partial file downloads caused by early buffer output. - Replaced direct `get_user_meta` calls with `IFNEX_User_Bridge::get_user_token` to support automatic token renewal and improved authentication reliability. - Added PDF signature validation (`%PDF` header check) to ensure integrity of remote file responses. - Updated Laravel base controller to include standard `AuthorizesRequests` and `ValidatesRequests` traits. --- .../ifnex-bridge/includes/shortcodes.php | 71 +++++++++++++----- .../ifnex-bridge/includes/user-bridge.php | 12 +-- .../app/Http/Controllers/Controller.php | 10 +-- 04_Laravel/storage/real-invoice.pdf | Bin 0 -> 34306 bytes 4 files changed, 61 insertions(+), 32 deletions(-) create mode 100644 04_Laravel/storage/real-invoice.pdf diff --git a/03_WordPress/wp-content/plugins/ifnex-bridge/includes/shortcodes.php b/03_WordPress/wp-content/plugins/ifnex-bridge/includes/shortcodes.php index ecbd770..0817dc5 100644 --- a/03_WordPress/wp-content/plugins/ifnex-bridge/includes/shortcodes.php +++ b/03_WordPress/wp-content/plugins/ifnex-bridge/includes/shortcodes.php @@ -1069,22 +1069,9 @@ function ifnex_order_detail_shortcode($atts) { } - // Handle PDF download - - $download_type = sanitize_text_field($_GET['download'] ?? ''); - if ($download_type && in_array($download_type, ['awb', 'invoice', 'label', 'import-invoice'])) { - ifnex_handle_pdf_download($order_id, $download_type); - return ''; - } - - - // Handle commitment form downloads (template / signed) — proxied با توکن لاراول - if (in_array($download_type, ['commitment-template', 'commitment-signed'], true)) { - $form_id = intval($_GET['form_id'] ?? 0); - $type = ($download_type === 'commitment-signed') ? 'signed' : 'template'; - ifnex_handle_commitment_download($order_id, $form_id, $type); - return ''; - } + // ⚠️ هندلر دانلودها (PDF و تعهدنامه) به template_redirect منتقل شده — + // اجرای آن داخل شورت‌کد یعنی بعد از چاپ HTML هدر قالب؛ خروجی باینری به + // HTML می‌چسبد و با Content-Length ناهم‌خوان، PDF نیمه‌تمام دانلود می‌شود. $bridge = new IFNEX_User_Bridge(); $user_id = get_current_user_id(); @@ -1411,6 +1398,32 @@ function uploadCommitmentForm(orderId, formId, input) { return ob_get_clean(); } +// ══════════════════════════════════════════════════════════════ +// رهگیری درخواست‌های دانلود قبل از هر خروجی صفحه (template_redirect) +// اجرای دانلود داخل شورت‌کد یعنی بعد از چاپ HTML هدر قالب — بایت‌های HTML +// به ابتدای فایل می‌چسبند و با Content-Length ناهم‌خوان، فایل ناقص می‌رسد. +// ══════════════════════════════════════════════════════════════ + +add_action('template_redirect', 'ifnex_intercept_download_request', 1); + +function ifnex_intercept_download_request(): void { + $download = sanitize_text_field($_GET['download'] ?? ''); + $order_id = intval($_GET['order_id'] ?? 0); + if (!$download || !$order_id) return; + + if (in_array($download, ['awb', 'invoice', 'label', 'import-invoice'], true)) { + ifnex_handle_pdf_download($order_id, $download); // exit داخل تابع + } + + if (in_array($download, ['commitment-template', 'commitment-signed'], true)) { + ifnex_handle_commitment_download( + $order_id, + intval($_GET['form_id'] ?? 0), + $download === 'commitment-signed' ? 'signed' : 'template' + ); // exit داخل تابع + } +} + // ══════════════════════════════════════════════════════════════ // آیکون‌های SVG مدرن (سبک Heroicons) // ══════════════════════════════════════════════════════════════ @@ -1426,8 +1439,8 @@ function ifnex_handle_pdf_download($order_id, $download_type) { $api_url = get_option('ifnex_api_url', 'http://localhost:8000/api/v1'); $download_url = rtrim($api_url, '/') . "/customer/orders/{$order_id}/pdf/{$download_type}"; - $token = get_user_meta($user_id, 'ifnex_laravel_token', true); - if (!$token) wp_die('توکن احراز هویت یافت نشد.'); + $token = $bridge->get_user_token($user_id); // با تجدید خودکار در صورت انقضا/حذف + if (!$token) wp_die('توکن احراز هویت در دسترس نیست — لطفاً دوباره وارد شوید.'); $response = wp_remote_get($download_url, array( 'headers' => array( @@ -1443,8 +1456,17 @@ function ifnex_handle_pdf_download($order_id, $download_type) { if ($status_code !== 200) wp_die('خطا در دانلود فایل.'); $file_content = wp_remote_retrieve_body($response); + + // پاسخ باید PDF خام باشد؛ وگرنه به‌جای فایل خراب، پیام واضح نمایش بده + if (substr($file_content, 0, 4) !== '%PDF') { + wp_die('پاسخ سرور یک فایل PDF معتبر نبود — لطفاً دوباره تلاش کنید.'); + } + $filename = strtoupper($download_type) . '-' . $order['data']['awb_no'] . '.pdf'; + // پاک‌سازی همه بافرهای خروجی تا جریان فایل تمیز و هم‌طول با Content-Length ارسال شود + while (ob_get_level()) { ob_end_clean(); } + nocache_headers(); header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename="' . $filename . '"'); @@ -1471,8 +1493,8 @@ function ifnex_handle_commitment_download($order_id, $form_id, $type = 'template $endpoint = ($type === 'signed') ? 'download' : 'template'; $download_url = rtrim($api_url, '/') . "/customer/orders/{$order_id}/commitment-forms/{$form_id}/{$endpoint}"; - $token = get_user_meta($user_id, 'ifnex_laravel_token', true); - if (!$token) wp_die('توکن احراز هویت یافت نشد.'); + $token = $bridge->get_user_token($user_id); // با تجدید خودکار در صورت انقضا/حذف + if (!$token) wp_die('توکن احراز هویت در دسترس نیست — لطفاً دوباره وارد شوید.'); $response = wp_remote_get($download_url, array( 'headers' => array( @@ -1493,6 +1515,12 @@ function ifnex_handle_commitment_download($order_id, $form_id, $type = 'template } $file_content = wp_remote_retrieve_body($response); + + // پاسخ باید فایل باینری باشد؛ شروع با '<' یعنی HTML/خطا برگشته + if ($file_content === '' || $file_content[0] === '<') { + wp_die('پاسخ سرور یک فایل معتبر نبود — لطفاً دوباره تلاش کنید.'); + } + $awb = $order['data']['awb_no'] ?? ('order-' . $order_id); // تشخیص نوع محتوا و نام فایل از روی هدر Laravel @@ -1511,6 +1539,9 @@ function ifnex_handle_commitment_download($order_id, $form_id, $type = 'template $filename .= '.' . $ext; } + // پاک‌سازی همه بافرهای خروجی تا جریان فایل تمیز و هم‌طول با Content-Length ارسال شود + while (ob_get_level()) { ob_end_clean(); } + nocache_headers(); header('Content-Type: ' . $ctype); header('Content-Disposition: attachment; filename="' . $filename . '"'); diff --git a/03_WordPress/wp-content/plugins/ifnex-bridge/includes/user-bridge.php b/03_WordPress/wp-content/plugins/ifnex-bridge/includes/user-bridge.php index 62903a5..05babef 100644 --- a/03_WordPress/wp-content/plugins/ifnex-bridge/includes/user-bridge.php +++ b/03_WordPress/wp-content/plugins/ifnex-bridge/includes/user-bridge.php @@ -855,8 +855,8 @@ function ifnex_download_order_pdf_ajax() { $download_url = rtrim($api_url, '/') . "/customer/orders/{$order_id}/pdf/{$download_type}"; // ارسال درخواست به لاراول با توکن احراز هویت - $token = get_user_meta($user_id, 'ifnex_laravel_token', true); - if (!$token) wp_send_json_error('توکن احراز هویت یافت نشد.'); + $token = $bridge->get_user_token($user_id); // با تجدید خودکار در صورت انقضا/حذف + if (!$token) wp_send_json_error('توکن احراز هویت در دسترس نیست — لطفاً دوباره وارد شوید.'); $response = wp_remote_get($download_url, array( 'headers' => array( @@ -908,8 +908,8 @@ function ifnex_get_commitment_forms_ajax() { $api_url = get_option('ifnex_api_url', 'http://localhost:8000/api/v1'); $url = rtrim($api_url, '/') . "/customer/orders/{$order_id}/commitment-forms"; - $token = get_user_meta($user_id, 'ifnex_laravel_token', true); - if (!$token) wp_send_json_error('توکن احراز هویت یافت نشد.'); + $token = $bridge->get_user_token($user_id); // با تجدید خودکار در صورت انقضا/حذف + if (!$token) wp_send_json_error('توکن احراز هویت در دسترس نیست — لطفاً دوباره وارد شوید.'); $response = wp_remote_get($url, array( 'headers' => array( @@ -973,8 +973,8 @@ function ifnex_upload_commitment_form_ajax() { $api_url = get_option('ifnex_api_url', 'http://localhost:8000/api/v1'); $url = rtrim($api_url, '/') . "/customer/orders/{$order_id}/commitment-forms/{$form_id}/upload"; - $token = get_user_meta($user_id, 'ifnex_laravel_token', true); - if (!$token) wp_send_json_error('توکن احراز هویت یافت نشد.'); + $token = $bridge->get_user_token($user_id); // با تجدید خودکار در صورت انقضا/حذف + if (!$token) wp_send_json_error('توکن احراز هویت در دسترس نیست — لطفاً دوباره وارد شوید.'); $multipart = new CURLFile($upload['file'], $file['type'], $file['name']); $post_fields = array( diff --git a/04_Laravel/app/Http/Controllers/Controller.php b/04_Laravel/app/Http/Controllers/Controller.php index 62b4969..ef916e5 100644 --- a/04_Laravel/app/Http/Controllers/Controller.php +++ b/04_Laravel/app/Http/Controllers/Controller.php @@ -2,12 +2,10 @@ namespace App\Http\Controllers; +use Illuminate\Foundation\Auth\Access\AuthorizesRequests; +use Illuminate\Foundation\Validation\ValidatesRequests; + abstract class Controller { - // + use AuthorizesRequests, ValidatesRequests; } - -class CustomerOrderController -{ - // ... -} \ No newline at end of file diff --git a/04_Laravel/storage/real-invoice.pdf b/04_Laravel/storage/real-invoice.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d5dbe4bf292f10cf59a456d46bb7bfd3f5315ea6 GIT binary patch literal 34306 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%0AL(4 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 ID+>2N0QIviMF0Q* literal 0 HcmV?d00001