PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.11.15
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.11.15
4.0.8 4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 All 149 releases
← All changes | classes/Visualizer/Source/Json.php +56 -0 3.10.153.11.15 View file →
@@ -456,8 +456,19 @@
456 456 }
457 457 }
458 458 }
459 459
460 + // Check if this is a WooCommerce endpoint request and add verification token.
461 + if ( $this->is_woocommerce_request( $url ) ) {
462 + // Generate a unique token for this specific request.
463 + $token = wp_generate_password( 32, false );
464 + set_transient( 'visualizer_wc_token_' . $token, time(), 60 );
465 + if ( ! isset( $args['headers'] ) ) {
466 + $args['headers'] = array();
467 + }
468 + $args['headers']['X-Visualizer-Token'] = $token;
469 + }
470 +
460 471 do_action( 'themeisle_log_event', Visualizer_Plugin::NAME, sprintf( 'Connecting to %s with args = %s ', $url, print_r( $args, true ) ), 'debug', __FILE__, __LINE__ );
461 472 return wp_remote_request( $url, $args );
462 473 }
463 474
@@ -485,8 +496,53 @@
485 496 $data[] = $this->_normalizeData( $data_row );
486 497 }
487 498 $this->_data = $data;
488 499 return true;
500 + }
501 +
502 + /**
503 + * Check if the URL is a WooCommerce endpoint request.
504 + *
505 + * @access private
506 + * @param string $url The URL to check.
507 + * @return bool True if it's a WooCommerce request, false otherwise.
508 + */
509 + private function is_woocommerce_request( $url ) {
510 + if ( empty( $url ) ) {
511 + return false;
512 + }
513 +
514 + $parsed_url = function_exists( 'wp_parse_url' ) ? wp_parse_url( $url ) : parse_url( $url );
515 + if ( empty( $parsed_url ) || empty( $parsed_url['host'] ) || empty( $parsed_url['path'] ) ) {
516 + return false;
517 + }
518 +
519 + $site_url = function_exists( 'home_url' ) ? home_url() : ( function_exists( 'site_url' ) ? site_url() : '' );
520 + $site_parts = $site_url ? ( function_exists( 'wp_parse_url' ) ? wp_parse_url( $site_url ) : parse_url( $site_url ) ) : array();
521 + if ( empty( $site_parts['host'] ) ) {
522 + return false;
523 + }
524 +
525 + $target_host = strtolower( $parsed_url['host'] );
526 + $site_host = strtolower( $site_parts['host'] );
527 + if ( $target_host !== $site_host ) {
528 + return false;
529 + }
530 +
531 + $path = '/' . ltrim( $parsed_url['path'], '/' );
532 + $wc_patterns = array(
533 + '/wp-json/wc/',
534 + '/wp-json/wc-analytics/',
535 + '/wc-analytics/',
536 + );
537 +
538 + foreach ( $wc_patterns as $pattern ) {
539 + if ( strpos( $path, $pattern ) !== false ) {
540 + return true;
541 + }
542 + }
543 +
544 + return false;
489 545 }
490 546
491 547 /**
492 548 * Returns source name.