Plugin Directory

Changeset 3379026


Ignore:
Timestamp:
10/15/2025 04:19:24 PM (6 months ago)
Author:
ajitdas
Message:

vulnerable file upload fixed

Location:
flex-qr-code-generator
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • flex-qr-code-generator/tags/1.2.5/qr-code-generator.php

    r3301390 r3379026  
    11<?php
     2
    23/**
    34 * Plugin Name: Flex QR Code Generator
     
    1314 * @package flex-qr-code-generator
    1415 */
     16
     17// Ensure WordPress functions are available if run directly
     18if (! defined('ABSPATH')) {
     19  require_once(dirname(__FILE__, 4) . '/wp-load.php');
     20}
    1521if (!defined('FLEXQR_CODE_GENERATOR_PATH')) {
    1622  define('FLEXQR_CODE_GENERATOR_PATH', plugin_dir_path(__FILE__));
     
    3036
    3137    add_action('wp_ajax_flexqr_save_qr', [$this, 'save_qr_code_to_db']);
    32     add_action('wp_ajax_nopriv_flexqr_save_qr', [$this, 'save_qr_code_to_db']);
     38    // add_action('wp_ajax_nopriv_flexqr_save_qr', [$this, 'save_qr_code_to_db']);
    3339
    3440    // update qr
     
    206212  }
    207213
     214  // function save_qr_code_to_db()
     215  // {
     216
     217  //   if ( ! isset($_POST['nonce']) || ! wp_verify_nonce($_POST['nonce'], 'wp_rest') ) {
     218  //       wp_send_json_error(['message' => 'Security check failed.']);
     219  //       wp_die();
     220  //   }
     221
     222  //   if (isset($_POST['qrData'])) {
     223  //     global $wpdb;
     224  //     $qrData = json_decode(stripslashes($_POST['qrData']), true);
     225  //     $qrName = isset($_POST['qrName']) ? $_POST['qrName'] : null;
     226  //     $isTrackingEnabled = $_POST['isTrackingEnabled'] === 'true';
     227
     228  //     if (!$qrData) {
     229  //       echo 'Invalid QR data.';
     230  //       wp_die();
     231  //     }
     232
     233  //     $originalText = sanitize_text_field($qrData['data']);
     234
     235  //     $input_data = array(
     236  //       'text' => $originalText,
     237  //       'qr_data' => json_encode($qrData, JSON_UNESCAPED_SLASHES),
     238  //     );
     239
     240  //     // Add qr_name only if it's not null
     241  //     if ($qrName !== null) {
     242  //       $input_data['qr_name'] = sanitize_text_field($qrName);
     243  //     }
     244
     245  //     // Save it to the database first to get the ID
     246  //     $result = $wpdb->insert(
     247  //       $wpdb->prefix . 'qr_codes',
     248  //       $input_data
     249  //     );
     250
     251  //     if (!$result) {
     252  //       wp_send_json_error(['message' => 'Error saving QR code.']);
     253  //       wp_die();
     254  //     }
     255
     256  //     $inserted_id = $wpdb->insert_id;
     257
     258  //     // Handle the logo (file upload) - now that we have the ID
     259  //     $logo_url = '';
     260
     261  //     if (isset($_FILES['logo']) && $_FILES['logo']['error'] === UPLOAD_ERR_OK) {
     262  //       $logo = $_FILES['logo'];
     263  //       $upload_dir = wp_upload_dir();
     264
     265  //       $file_ext = pathinfo($logo['name'], PATHINFO_EXTENSION);
     266  //       $file_name = pathinfo($logo['name'], PATHINFO_FILENAME);
     267
     268  //       // Create new filename with ID
     269  //       $new_file_name = $file_name . '_' . $inserted_id . '.' . $file_ext;
     270  //       $file_path = $upload_dir['path'] . '/' . $new_file_name;
     271
     272  //       if (move_uploaded_file($logo['tmp_name'], $file_path)) {
     273  //         $logo_url = $upload_dir['url'] . '/' . $new_file_name;
     274  //         $logo_url = str_replace(home_url(), '', $logo_url);
     275
     276  //         // Update the database with the logo URL
     277  //         $wpdb->update(
     278  //           $wpdb->prefix . 'qr_codes',
     279  //           ['logo_url' => $logo_url],
     280  //           ['id' => $inserted_id]
     281  //         );
     282  //       }
     283  //     }
     284
     285  //     // qr_image handling
     286  //     $qr_image_url = '';
     287
     288  //     if (isset($_FILES['qr_image']) && $_FILES['qr_image']['error'] === UPLOAD_ERR_OK) {
     289  //       $qr_image = $_FILES['qr_image'];
     290  //       $upload_dir = wp_upload_dir();
     291
     292  //       $file_ext = pathinfo($qr_image['name'], PATHINFO_EXTENSION);
     293  //       $file_name = pathinfo($qr_image['name'], PATHINFO_FILENAME);
     294
     295  //       // Create new filename with ID
     296  //       $new_file_name = $file_name . '_' . $inserted_id . '.' . $file_ext;
     297  //       $file_path = $upload_dir['path'] . '/' . $new_file_name;
     298
     299  //       if (move_uploaded_file($qr_image['tmp_name'], $file_path)) {
     300  //         $qr_image_url = $upload_dir['url'] . '/' . $new_file_name;
     301  //         $qr_image_url = str_replace(home_url(), '', $qr_image_url);
     302
     303  //         // Update the database with the QR image URL
     304  //         $wpdb->update(
     305  //           $wpdb->prefix . 'qr_codes',
     306  //           ['qr_image_url' => $qr_image_url],
     307  //           ['id' => $inserted_id]
     308  //         );
     309  //       }
     310  //     }
     311
     312  //     if ($isTrackingEnabled) {
     313  //       $trackedUrl = $this->add_tracking_param_to_url($originalText, $inserted_id);
     314
     315  //       $qrData['data'] = $trackedUrl;
     316
     317  //       $wpdb->update(
     318  //         $wpdb->prefix . 'qr_codes',
     319  //         ['qr_data' => json_encode($qrData, JSON_UNESCAPED_SLASHES)],
     320  //         ['id' => $inserted_id]
     321  //       );
     322  //     }
     323
     324  //     wp_send_json_success([
     325  //       'message' => 'QR code saved successfully.',
     326  //       'id' => $inserted_id,
     327  //       'finalUrl' => $isTrackingEnabled ? $trackedUrl : $originalText,
     328  //     ]);
     329
     330  //   } else {
     331  //     wp_send_json_error(array('message' => 'Missing QR data.'));
     332  //   }
     333
     334  //   wp_die();
     335  // }
    208336  function save_qr_code_to_db()
    209337  {
    210     if (isset($_POST['qrData'])) {
    211       global $wpdb;
    212       $qrData = json_decode(stripslashes($_POST['qrData']), true);
    213       $qrName = isset($_POST['qrName']) ? $_POST['qrName'] : null;
    214       $isTrackingEnabled = $_POST['isTrackingEnabled'] === 'true';
    215 
    216       if (!$qrData) {
    217         echo 'Invalid QR data.';
     338    if (! is_user_logged_in() || ! current_user_can('upload_files')) {
     339      wp_send_json_error(['message' => 'Unauthorized access.']);
     340      wp_die();
     341    }
     342
     343    // Verify nonce
     344    if (! isset($_POST['nonce']) || ! wp_verify_nonce($_POST['nonce'], 'wp_rest')) {
     345      wp_send_json_error(['message' => 'Security check failed.']);
     346      wp_die();
     347    }
     348
     349    if (! isset($_POST['qrData'])) {
     350      wp_send_json_error(['message' => 'Missing QR data.']);
     351      wp_die();
     352    }
     353
     354    global $wpdb;
     355
     356    $qrData = json_decode(stripslashes($_POST['qrData']), true);
     357    if (! $qrData || ! isset($qrData['data'])) {
     358      wp_send_json_error(['message' => 'Invalid QR data.']);
     359      wp_die();
     360    }
     361
     362    $qrName = isset($_POST['qrName']) ? sanitize_text_field($_POST['qrName']) : null;
     363    $isTrackingEnabled = isset($_POST['isTrackingEnabled']) && $_POST['isTrackingEnabled'] === 'true';
     364    $originalText = sanitize_text_field($qrData['data']);
     365
     366    $input_data = [
     367      'text'     => $originalText,
     368      'qr_data'  => wp_json_encode($qrData, JSON_UNESCAPED_SLASHES),
     369    ];
     370
     371    if ($qrName) {
     372      $input_data['qr_name'] = $qrName;
     373    }
     374
     375    // Insert to DB
     376    $result = $wpdb->insert(
     377      $wpdb->prefix . 'qr_codes',
     378      $input_data
     379    );
     380
     381    if (! $result) {
     382      wp_send_json_error(['message' => 'Error saving QR code.']);
     383      wp_die();
     384    }
     385
     386    $inserted_id = $wpdb->insert_id;
     387
     388    require_once(ABSPATH . 'wp-admin/includes/file.php');
     389
     390    // Allowed MIME types
     391    $allowed_mimes = [
     392      'jpg|jpeg|jpe' => 'image/jpeg',
     393      'png'          => 'image/png',
     394      'gif'          => 'image/gif',
     395      'webp'         => 'image/webp',
     396      'svg'          => 'image/svg+xml',
     397    ];
     398
     399    $upload_overrides = [
     400      'test_form' => false,
     401      'mimes'     => $allowed_mimes,
     402    ];
     403
     404    // Handle logo upload
     405    if (! empty($_FILES['logo']['name'])) {
     406      $uploaded = wp_handle_upload($_FILES['logo'], $upload_overrides);
     407
     408      if (isset($uploaded['error'])) {
     409        wp_send_json_error(['message' => 'Logo upload failed: ' . $uploaded['error']]);
    218410        wp_die();
    219411      }
    220412
    221       $originalText = sanitize_text_field($qrData['data']);
    222 
    223       $input_data = array(
    224         'text' => $originalText,
    225         'qr_data' => json_encode($qrData, JSON_UNESCAPED_SLASHES),
     413      $logo_url = esc_url_raw($uploaded['url']);
     414      $wpdb->update(
     415        $wpdb->prefix . 'qr_codes',
     416        ['logo_url' => $logo_url],
     417        ['id' => $inserted_id]
    226418      );
    227 
    228       // Add qr_name only if it's not null
    229       if ($qrName !== null) {
    230         $input_data['qr_name'] = sanitize_text_field($qrName);
    231       }
    232 
    233       // Save it to the database first to get the ID
    234       $result = $wpdb->insert(
     419    }
     420
     421    // Handle QR image upload
     422    if (! empty($_FILES['qr_image']['name'])) {
     423      $uploaded_qr = wp_handle_upload($_FILES['qr_image'], $upload_overrides);
     424
     425      if (isset($uploaded_qr['error'])) {
     426        wp_send_json_error(['message' => 'QR image upload failed: ' . $uploaded_qr['error']]);
     427        wp_die();
     428      }
     429
     430      $qr_image_url = esc_url_raw($uploaded_qr['url']);
     431      $wpdb->update(
    235432        $wpdb->prefix . 'qr_codes',
    236         $input_data
     433        ['qr_image_url' => $qr_image_url],
     434        ['id' => $inserted_id]
    237435      );
    238 
    239       if (!$result) {
    240         wp_send_json_error(['message' => 'Error saving QR code.']);
    241         wp_die();
    242       }
    243 
    244       $inserted_id = $wpdb->insert_id;
    245 
    246       // Handle the logo (file upload) - now that we have the ID
    247       $logo_url = '';
    248 
    249       if (isset($_FILES['logo']) && $_FILES['logo']['error'] === UPLOAD_ERR_OK) {
    250         $logo = $_FILES['logo'];
    251         $upload_dir = wp_upload_dir();
    252 
    253         $file_ext = pathinfo($logo['name'], PATHINFO_EXTENSION);
    254         $file_name = pathinfo($logo['name'], PATHINFO_FILENAME);
    255 
    256         // Create new filename with ID
    257         $new_file_name = $file_name . '_' . $inserted_id . '.' . $file_ext;
    258         $file_path = $upload_dir['path'] . '/' . $new_file_name;
    259 
    260         if (move_uploaded_file($logo['tmp_name'], $file_path)) {
    261           $logo_url = $upload_dir['url'] . '/' . $new_file_name;
    262           $logo_url = str_replace(home_url(), '', $logo_url);
    263 
    264           // Update the database with the logo URL
    265           $wpdb->update(
    266             $wpdb->prefix . 'qr_codes',
    267             ['logo_url' => $logo_url],
    268             ['id' => $inserted_id]
    269           );
    270         }
    271       }
    272 
    273       // qr_image handling
    274       $qr_image_url = '';
    275 
    276       if (isset($_FILES['qr_image']) && $_FILES['qr_image']['error'] === UPLOAD_ERR_OK) {
    277         $qr_image = $_FILES['qr_image'];
    278         $upload_dir = wp_upload_dir();
    279 
    280         $file_ext = pathinfo($qr_image['name'], PATHINFO_EXTENSION);
    281         $file_name = pathinfo($qr_image['name'], PATHINFO_FILENAME);
    282 
    283         // Create new filename with ID
    284         $new_file_name = $file_name . '_' . $inserted_id . '.' . $file_ext;
    285         $file_path = $upload_dir['path'] . '/' . $new_file_name;
    286 
    287         if (move_uploaded_file($qr_image['tmp_name'], $file_path)) {
    288           $qr_image_url = $upload_dir['url'] . '/' . $new_file_name;
    289           $qr_image_url = str_replace(home_url(), '', $qr_image_url);
    290 
    291           // Update the database with the QR image URL
    292           $wpdb->update(
    293             $wpdb->prefix . 'qr_codes',
    294             ['qr_image_url' => $qr_image_url],
    295             ['id' => $inserted_id]
    296           );
    297         }
    298       }
    299 
    300       if ($isTrackingEnabled) {
    301         $trackedUrl = $this->add_tracking_param_to_url($originalText, $inserted_id);
    302 
    303         $qrData['data'] = $trackedUrl;
    304 
    305         $wpdb->update(
    306           $wpdb->prefix . 'qr_codes',
    307           ['qr_data' => json_encode($qrData, JSON_UNESCAPED_SLASHES)],
    308           ['id' => $inserted_id]
    309         );
    310       }
    311 
    312       wp_send_json_success([
    313         'message' => 'QR code saved successfully.',
    314         'id' => $inserted_id,
    315         'finalUrl' => $isTrackingEnabled ? $trackedUrl : $originalText,
    316       ]);
    317 
    318     } else {
    319       wp_send_json_error(array('message' => 'Missing QR data.'));
    320     }
     436    }
     437
     438    // Handle tracking
     439    if ($isTrackingEnabled && method_exists($this, 'add_tracking_param_to_url')) {
     440      $trackedUrl = $this->add_tracking_param_to_url($originalText, $inserted_id);
     441      $qrData['data'] = $trackedUrl;
     442
     443      $wpdb->update(
     444        $wpdb->prefix . 'qr_codes',
     445        ['qr_data' => wp_json_encode($qrData, JSON_UNESCAPED_SLASHES)],
     446        ['id' => $inserted_id]
     447      );
     448    }
     449
     450    wp_send_json_success([
     451      'message'  => 'QR code saved successfully.',
     452      'id'       => $inserted_id,
     453      'finalUrl' => $isTrackingEnabled ? $trackedUrl : $originalText,
     454    ]);
    321455
    322456    wp_die();
    323457  }
     458
    324459
    325460  public function update_qr_code()
     
    450585        'finalUrl' => $isTrackingEnabled ? $trackedUrl : $originalText,
    451586      ]);
    452 
    453587    } else {
    454588      wp_send_json_error(array('message' => 'Missing QR data or ID.'));
     
    716850      );
    717851    }
    718 
    719852  }
    720853
     
    8911024    ]);
    8921025  }
    893 
    8941026}
    8951027
  • flex-qr-code-generator/trunk/qr-code-generator.php

    r3301390 r3379026  
    11<?php
     2
    23/**
    34 * Plugin Name: Flex QR Code Generator
     
    1314 * @package flex-qr-code-generator
    1415 */
     16
     17// Ensure WordPress functions are available if run directly
     18if (! defined('ABSPATH')) {
     19  require_once(dirname(__FILE__, 4) . '/wp-load.php');
     20}
    1521if (!defined('FLEXQR_CODE_GENERATOR_PATH')) {
    1622  define('FLEXQR_CODE_GENERATOR_PATH', plugin_dir_path(__FILE__));
     
    3036
    3137    add_action('wp_ajax_flexqr_save_qr', [$this, 'save_qr_code_to_db']);
    32     add_action('wp_ajax_nopriv_flexqr_save_qr', [$this, 'save_qr_code_to_db']);
     38    // add_action('wp_ajax_nopriv_flexqr_save_qr', [$this, 'save_qr_code_to_db']);
    3339
    3440    // update qr
     
    206212  }
    207213
     214  // function save_qr_code_to_db()
     215  // {
     216
     217  //   if ( ! isset($_POST['nonce']) || ! wp_verify_nonce($_POST['nonce'], 'wp_rest') ) {
     218  //       wp_send_json_error(['message' => 'Security check failed.']);
     219  //       wp_die();
     220  //   }
     221
     222  //   if (isset($_POST['qrData'])) {
     223  //     global $wpdb;
     224  //     $qrData = json_decode(stripslashes($_POST['qrData']), true);
     225  //     $qrName = isset($_POST['qrName']) ? $_POST['qrName'] : null;
     226  //     $isTrackingEnabled = $_POST['isTrackingEnabled'] === 'true';
     227
     228  //     if (!$qrData) {
     229  //       echo 'Invalid QR data.';
     230  //       wp_die();
     231  //     }
     232
     233  //     $originalText = sanitize_text_field($qrData['data']);
     234
     235  //     $input_data = array(
     236  //       'text' => $originalText,
     237  //       'qr_data' => json_encode($qrData, JSON_UNESCAPED_SLASHES),
     238  //     );
     239
     240  //     // Add qr_name only if it's not null
     241  //     if ($qrName !== null) {
     242  //       $input_data['qr_name'] = sanitize_text_field($qrName);
     243  //     }
     244
     245  //     // Save it to the database first to get the ID
     246  //     $result = $wpdb->insert(
     247  //       $wpdb->prefix . 'qr_codes',
     248  //       $input_data
     249  //     );
     250
     251  //     if (!$result) {
     252  //       wp_send_json_error(['message' => 'Error saving QR code.']);
     253  //       wp_die();
     254  //     }
     255
     256  //     $inserted_id = $wpdb->insert_id;
     257
     258  //     // Handle the logo (file upload) - now that we have the ID
     259  //     $logo_url = '';
     260
     261  //     if (isset($_FILES['logo']) && $_FILES['logo']['error'] === UPLOAD_ERR_OK) {
     262  //       $logo = $_FILES['logo'];
     263  //       $upload_dir = wp_upload_dir();
     264
     265  //       $file_ext = pathinfo($logo['name'], PATHINFO_EXTENSION);
     266  //       $file_name = pathinfo($logo['name'], PATHINFO_FILENAME);
     267
     268  //       // Create new filename with ID
     269  //       $new_file_name = $file_name . '_' . $inserted_id . '.' . $file_ext;
     270  //       $file_path = $upload_dir['path'] . '/' . $new_file_name;
     271
     272  //       if (move_uploaded_file($logo['tmp_name'], $file_path)) {
     273  //         $logo_url = $upload_dir['url'] . '/' . $new_file_name;
     274  //         $logo_url = str_replace(home_url(), '', $logo_url);
     275
     276  //         // Update the database with the logo URL
     277  //         $wpdb->update(
     278  //           $wpdb->prefix . 'qr_codes',
     279  //           ['logo_url' => $logo_url],
     280  //           ['id' => $inserted_id]
     281  //         );
     282  //       }
     283  //     }
     284
     285  //     // qr_image handling
     286  //     $qr_image_url = '';
     287
     288  //     if (isset($_FILES['qr_image']) && $_FILES['qr_image']['error'] === UPLOAD_ERR_OK) {
     289  //       $qr_image = $_FILES['qr_image'];
     290  //       $upload_dir = wp_upload_dir();
     291
     292  //       $file_ext = pathinfo($qr_image['name'], PATHINFO_EXTENSION);
     293  //       $file_name = pathinfo($qr_image['name'], PATHINFO_FILENAME);
     294
     295  //       // Create new filename with ID
     296  //       $new_file_name = $file_name . '_' . $inserted_id . '.' . $file_ext;
     297  //       $file_path = $upload_dir['path'] . '/' . $new_file_name;
     298
     299  //       if (move_uploaded_file($qr_image['tmp_name'], $file_path)) {
     300  //         $qr_image_url = $upload_dir['url'] . '/' . $new_file_name;
     301  //         $qr_image_url = str_replace(home_url(), '', $qr_image_url);
     302
     303  //         // Update the database with the QR image URL
     304  //         $wpdb->update(
     305  //           $wpdb->prefix . 'qr_codes',
     306  //           ['qr_image_url' => $qr_image_url],
     307  //           ['id' => $inserted_id]
     308  //         );
     309  //       }
     310  //     }
     311
     312  //     if ($isTrackingEnabled) {
     313  //       $trackedUrl = $this->add_tracking_param_to_url($originalText, $inserted_id);
     314
     315  //       $qrData['data'] = $trackedUrl;
     316
     317  //       $wpdb->update(
     318  //         $wpdb->prefix . 'qr_codes',
     319  //         ['qr_data' => json_encode($qrData, JSON_UNESCAPED_SLASHES)],
     320  //         ['id' => $inserted_id]
     321  //       );
     322  //     }
     323
     324  //     wp_send_json_success([
     325  //       'message' => 'QR code saved successfully.',
     326  //       'id' => $inserted_id,
     327  //       'finalUrl' => $isTrackingEnabled ? $trackedUrl : $originalText,
     328  //     ]);
     329
     330  //   } else {
     331  //     wp_send_json_error(array('message' => 'Missing QR data.'));
     332  //   }
     333
     334  //   wp_die();
     335  // }
    208336  function save_qr_code_to_db()
    209337  {
    210     if (isset($_POST['qrData'])) {
    211       global $wpdb;
    212       $qrData = json_decode(stripslashes($_POST['qrData']), true);
    213       $qrName = isset($_POST['qrName']) ? $_POST['qrName'] : null;
    214       $isTrackingEnabled = $_POST['isTrackingEnabled'] === 'true';
    215 
    216       if (!$qrData) {
    217         echo 'Invalid QR data.';
     338    if (! is_user_logged_in() || ! current_user_can('upload_files')) {
     339      wp_send_json_error(['message' => 'Unauthorized access.']);
     340      wp_die();
     341    }
     342
     343    // Verify nonce
     344    if (! isset($_POST['nonce']) || ! wp_verify_nonce($_POST['nonce'], 'wp_rest')) {
     345      wp_send_json_error(['message' => 'Security check failed.']);
     346      wp_die();
     347    }
     348
     349    if (! isset($_POST['qrData'])) {
     350      wp_send_json_error(['message' => 'Missing QR data.']);
     351      wp_die();
     352    }
     353
     354    global $wpdb;
     355
     356    $qrData = json_decode(stripslashes($_POST['qrData']), true);
     357    if (! $qrData || ! isset($qrData['data'])) {
     358      wp_send_json_error(['message' => 'Invalid QR data.']);
     359      wp_die();
     360    }
     361
     362    $qrName = isset($_POST['qrName']) ? sanitize_text_field($_POST['qrName']) : null;
     363    $isTrackingEnabled = isset($_POST['isTrackingEnabled']) && $_POST['isTrackingEnabled'] === 'true';
     364    $originalText = sanitize_text_field($qrData['data']);
     365
     366    $input_data = [
     367      'text'     => $originalText,
     368      'qr_data'  => wp_json_encode($qrData, JSON_UNESCAPED_SLASHES),
     369    ];
     370
     371    if ($qrName) {
     372      $input_data['qr_name'] = $qrName;
     373    }
     374
     375    // Insert to DB
     376    $result = $wpdb->insert(
     377      $wpdb->prefix . 'qr_codes',
     378      $input_data
     379    );
     380
     381    if (! $result) {
     382      wp_send_json_error(['message' => 'Error saving QR code.']);
     383      wp_die();
     384    }
     385
     386    $inserted_id = $wpdb->insert_id;
     387
     388    require_once(ABSPATH . 'wp-admin/includes/file.php');
     389
     390    // Allowed MIME types
     391    $allowed_mimes = [
     392      'jpg|jpeg|jpe' => 'image/jpeg',
     393      'png'          => 'image/png',
     394      'gif'          => 'image/gif',
     395      'webp'         => 'image/webp',
     396      'svg'          => 'image/svg+xml',
     397    ];
     398
     399    $upload_overrides = [
     400      'test_form' => false,
     401      'mimes'     => $allowed_mimes,
     402    ];
     403
     404    // Handle logo upload
     405    if (! empty($_FILES['logo']['name'])) {
     406      $uploaded = wp_handle_upload($_FILES['logo'], $upload_overrides);
     407
     408      if (isset($uploaded['error'])) {
     409        wp_send_json_error(['message' => 'Logo upload failed: ' . $uploaded['error']]);
    218410        wp_die();
    219411      }
    220412
    221       $originalText = sanitize_text_field($qrData['data']);
    222 
    223       $input_data = array(
    224         'text' => $originalText,
    225         'qr_data' => json_encode($qrData, JSON_UNESCAPED_SLASHES),
     413      $logo_url = esc_url_raw($uploaded['url']);
     414      $wpdb->update(
     415        $wpdb->prefix . 'qr_codes',
     416        ['logo_url' => $logo_url],
     417        ['id' => $inserted_id]
    226418      );
    227 
    228       // Add qr_name only if it's not null
    229       if ($qrName !== null) {
    230         $input_data['qr_name'] = sanitize_text_field($qrName);
    231       }
    232 
    233       // Save it to the database first to get the ID
    234       $result = $wpdb->insert(
     419    }
     420
     421    // Handle QR image upload
     422    if (! empty($_FILES['qr_image']['name'])) {
     423      $uploaded_qr = wp_handle_upload($_FILES['qr_image'], $upload_overrides);
     424
     425      if (isset($uploaded_qr['error'])) {
     426        wp_send_json_error(['message' => 'QR image upload failed: ' . $uploaded_qr['error']]);
     427        wp_die();
     428      }
     429
     430      $qr_image_url = esc_url_raw($uploaded_qr['url']);
     431      $wpdb->update(
    235432        $wpdb->prefix . 'qr_codes',
    236         $input_data
     433        ['qr_image_url' => $qr_image_url],
     434        ['id' => $inserted_id]
    237435      );
    238 
    239       if (!$result) {
    240         wp_send_json_error(['message' => 'Error saving QR code.']);
    241         wp_die();
    242       }
    243 
    244       $inserted_id = $wpdb->insert_id;
    245 
    246       // Handle the logo (file upload) - now that we have the ID
    247       $logo_url = '';
    248 
    249       if (isset($_FILES['logo']) && $_FILES['logo']['error'] === UPLOAD_ERR_OK) {
    250         $logo = $_FILES['logo'];
    251         $upload_dir = wp_upload_dir();
    252 
    253         $file_ext = pathinfo($logo['name'], PATHINFO_EXTENSION);
    254         $file_name = pathinfo($logo['name'], PATHINFO_FILENAME);
    255 
    256         // Create new filename with ID
    257         $new_file_name = $file_name . '_' . $inserted_id . '.' . $file_ext;
    258         $file_path = $upload_dir['path'] . '/' . $new_file_name;
    259 
    260         if (move_uploaded_file($logo['tmp_name'], $file_path)) {
    261           $logo_url = $upload_dir['url'] . '/' . $new_file_name;
    262           $logo_url = str_replace(home_url(), '', $logo_url);
    263 
    264           // Update the database with the logo URL
    265           $wpdb->update(
    266             $wpdb->prefix . 'qr_codes',
    267             ['logo_url' => $logo_url],
    268             ['id' => $inserted_id]
    269           );
    270         }
    271       }
    272 
    273       // qr_image handling
    274       $qr_image_url = '';
    275 
    276       if (isset($_FILES['qr_image']) && $_FILES['qr_image']['error'] === UPLOAD_ERR_OK) {
    277         $qr_image = $_FILES['qr_image'];
    278         $upload_dir = wp_upload_dir();
    279 
    280         $file_ext = pathinfo($qr_image['name'], PATHINFO_EXTENSION);
    281         $file_name = pathinfo($qr_image['name'], PATHINFO_FILENAME);
    282 
    283         // Create new filename with ID
    284         $new_file_name = $file_name . '_' . $inserted_id . '.' . $file_ext;
    285         $file_path = $upload_dir['path'] . '/' . $new_file_name;
    286 
    287         if (move_uploaded_file($qr_image['tmp_name'], $file_path)) {
    288           $qr_image_url = $upload_dir['url'] . '/' . $new_file_name;
    289           $qr_image_url = str_replace(home_url(), '', $qr_image_url);
    290 
    291           // Update the database with the QR image URL
    292           $wpdb->update(
    293             $wpdb->prefix . 'qr_codes',
    294             ['qr_image_url' => $qr_image_url],
    295             ['id' => $inserted_id]
    296           );
    297         }
    298       }
    299 
    300       if ($isTrackingEnabled) {
    301         $trackedUrl = $this->add_tracking_param_to_url($originalText, $inserted_id);
    302 
    303         $qrData['data'] = $trackedUrl;
    304 
    305         $wpdb->update(
    306           $wpdb->prefix . 'qr_codes',
    307           ['qr_data' => json_encode($qrData, JSON_UNESCAPED_SLASHES)],
    308           ['id' => $inserted_id]
    309         );
    310       }
    311 
    312       wp_send_json_success([
    313         'message' => 'QR code saved successfully.',
    314         'id' => $inserted_id,
    315         'finalUrl' => $isTrackingEnabled ? $trackedUrl : $originalText,
    316       ]);
    317 
    318     } else {
    319       wp_send_json_error(array('message' => 'Missing QR data.'));
    320     }
     436    }
     437
     438    // Handle tracking
     439    if ($isTrackingEnabled && method_exists($this, 'add_tracking_param_to_url')) {
     440      $trackedUrl = $this->add_tracking_param_to_url($originalText, $inserted_id);
     441      $qrData['data'] = $trackedUrl;
     442
     443      $wpdb->update(
     444        $wpdb->prefix . 'qr_codes',
     445        ['qr_data' => wp_json_encode($qrData, JSON_UNESCAPED_SLASHES)],
     446        ['id' => $inserted_id]
     447      );
     448    }
     449
     450    wp_send_json_success([
     451      'message'  => 'QR code saved successfully.',
     452      'id'       => $inserted_id,
     453      'finalUrl' => $isTrackingEnabled ? $trackedUrl : $originalText,
     454    ]);
    321455
    322456    wp_die();
    323457  }
     458
    324459
    325460  public function update_qr_code()
     
    450585        'finalUrl' => $isTrackingEnabled ? $trackedUrl : $originalText,
    451586      ]);
    452 
    453587    } else {
    454588      wp_send_json_error(array('message' => 'Missing QR data or ID.'));
     
    716850      );
    717851    }
    718 
    719852  }
    720853
     
    8911024    ]);
    8921025  }
    893 
    8941026}
    8951027
Note: See TracChangeset for help on using the changeset viewer.