iledFilepath]; } if (!\file_exists($path)) { throw new \InvalidArgumentException(\sprintf("File not found: %s", $path)); } return \json_decode(\file_get_contents($path), \true); } /** * No-op */ function clear_compiled_json() { // pass } //----------------------------------------------------------------------------- // Directory iterator functions. //----------------------------------------------------------------------------- /** * Iterates over the files in a directory and works with custom wrappers. * * @param string $path Path to open (e.g., "s3://foo/bar"). * @param resource $context Stream wrapper context. * * @return \Generator Yields relative filename strings. */ function dir_iterator($path, $context = null) { $dh = $context ? \opendir($path, $context) : \opendir($path); if (!$dh) { throw new \InvalidArgumentException('File not found: ' . $path); } while (($file = \readdir($dh)) !== \false) { (yield $file); } \closedir($dh); } /** * Returns a recursive directory iterator that yields absolute filenames. * * This iterator is not broken like PHP's built-in DirectoryIterator (which * will read the first file from a stream wrapper, then rewind, then read * it again). * * @param string $path Path to traverse (e.g., s3://bucket/key, /tmp) * @param resource $context Stream context options. * * @return \Generator Yields absolute filenames. */ function recursive_dir_iterator($path, $context = null) { $invalid = ['.' => \true, '..' => \true]; $pathLen = \strlen($path) + 1; $iterator = dir_iterator($path, $context); $queue = []; do { while ($iterator->valid()) { $file = $iterator->current(); $iterator->next(); if (isset($invalid[\basename($file)])) { continue; } $fullPath = "{$path}/{$file}"; (yield $fullPath); if (\is_dir($fullPath)) { $queue[] = $iterator; $iterator = map(dir_iterator($fullPath, $context), function ($file) use($fullPath, $pathLen) { return \substr("{$fullPath}/{$file}", $pathLen); }); continue; } } $iterator = \array_pop($queue); } while ($iterator); } //----------------------------------------------------------------------------- // Misc. functions. //----------------------------------------------------------------------------- /** * Debug function used to describe the provided value type and class. * * @param mixed $input * * @return string Returns a string containing the type of the variable and * if a class is provided, the class name. */ function describe_type($input) { switch (\gettype($input)) { case 'object': return 'object(' . \get_class($input) . ')'; case 'array': return 'array(' . \count($input) . ')'; default: \ob_start(); \var_dump($input); // normalize float vs double return \str_replace('double(', 'float(', \rtrim(\ob_get_clean())); } } /** * Creates a default HTTP handler based on the available clients. * * @return callable */ function default_http_handler() { $version = guzzle_major_version(); // If Guzzle 6 or 7 installed if ($version === 6 || $version === 7) { return new \Dudlewebs\WPMCS\s3\Aws\Handler\GuzzleV6\GuzzleHandler(); } // If Guzzle 5 installed if ($version === 5) { return new \Dudlewebs\WPMCS\s3\Aws\Handler\GuzzleV5\GuzzleHandler(); } throw new \RuntimeException('Unknown Guzzle version: ' . $version); } /** * Gets the default user agent string depending on the Guzzle version * * @return string */ function default_user_agent() { $version = guzzle_major_version(); // If Guzzle 6 or 7 installed if ($version === 6 || $version === 7) { return \Dudlewebs\WPMCS\s3\GuzzleHttp\default_user_agent(); } // If Guzzle 5 installed if ($version === 5) { return \Dudlewebs\WPMCS\s3\GuzzleHttp\Client::getDefaultUserAgent(); } throw new \RuntimeException('Unknown Guzzle version: ' . $version); } /** * Get the major version of guzzle that is installed. * * @internal This function is internal and should not be used outside aws/aws-sdk-php. * @return int * @throws \RuntimeException */ function guzzle_major_version() { static $cache = null; if (null !== $cache) { return $cache; } if (\defined('Dudlewebs\\WPMCS\\s3\\GuzzleHttp\\ClientInterface::VERSION')) { $version = (string) ClientInterface::VERSION; if ($version[0] === '6') { return $cache = 6; } if ($version[0] === '5') { return $cache = 5; } } elseif (\defined('Dudlewebs\\WPMCS\\s3\\GuzzleHttp\\ClientInterface::MAJOR_VERSION')) { return $cache = ClientInterface::MAJOR_VERSION; } throw new \RuntimeException('Unable to determine what Guzzle version is installed.'); } /** * Serialize a request for a command but do not send it. * * Returns a promise that is fulfilled with the serialized request. * * @param CommandInterface $command Command to serialize. * * @return RequestInterface * @throws \RuntimeException */ function serialize(CommandInterface $command) { $request = null; $handlerList = $command->getHandlerList(); // Return a mock result. $handlerList->setHandler(function (CommandInterface $_, RequestInterface $r) use(&$request) { $request = $r; return new FulfilledPromise(new Result([])); }); \call_user_func($handlerList->resolve(), $command)->wait(); if (!$request instanceof RequestInterface) { throw new \RuntimeException('Calling handler did not serialize request'); } return $request; } /** * Retrieves data for a service from the SDK's service manifest file. * * Manifest data is stored statically, so it does not need to be loaded more * than once per process. The JSON data is also cached in opcache. * * @param string $service Case-insensitive namespace or endpoint prefix of the * service for which you are retrieving manifest data. * * @return array * @throws \InvalidArgumentException if the service is not supported. */ function manifest($service = null) { // Load the manifest and create aliases for lowercased namespaces static $manifest = []; static $aliases = []; if (empty($manifest)) { $manifest = load_compiled_json(__DIR__ . '/data/manifest.json'); foreach ($manifest as $endpoint => $info) { $alias = \strtolower($info['namespace']); if ($alias !== $endpoint) { $aliases[$alias] = $endpoint; } } } // If no service specified, then return the whole manifest. if ($service === null) { return $manifest; } // Look up the service's info in the manifest data. $service = \strtolower($service); if (isset($manifest[$service])) { return $manifest[$service] + ['endpoint' => $service]; } if (isset($aliases[$service])) { return manifest($aliases[$service]); } throw new \InvalidArgumentException("The service \"{$service}\" is not provided by the AWS SDK for PHP."); } /** * Checks if supplied parameter is a valid hostname * * @param string $hostname * @return bool */ function is_valid_hostname($hostname) { return \preg_match("/^([a-z\\d](-*[a-z\\d])*)(\\.([a-z\\d](-*[a-z\\d])*))*\\.?\$/i", $hostname) && \preg_match("/^.{1,253}\$/", $hostname) && \preg_match("/^[^\\.]{1,63}(\\.[^\\.]{0,63})*\$/", $hostname); } /** * Checks if supplied parameter is a valid host label * * @param $label * @return bool */ function is_valid_hostlabel($label) { return \preg_match("/^(?!-)[a-zA-Z0-9-]{1,63}(?register( Package::container()->get( Cheque::class ) ); $payment_method_registry->register( Package::container()->get( PayPal::class ) ); $payment_method_registry->register( Package::container()->get( BankTransfer::class ) ); $payment_method_registry->register( Package::container()->get( CashOnDelivery::class ) ); } /** * Verify all dependencies of registered payment methods have been registered. * If not, remove that payment method script from the list of dependencies * of Cart and Checkout block scripts so it doesn't break the blocks and show * an error in the admin. */ public function verify_payment_methods_dependencies() { // Check that the wc-blocks script is registered before continuing. Some extensions may cause this function to run // before the payment method scripts' dependencies are registered. if ( ! wp_script_is( 'wc-blocks', 'registered' ) ) { return; } $wp_scripts = wp_scripts(); $payment_method_scripts = $this->payment_method_registry->get_all_active_payment_method_script_dependencies(); foreach ( $payment_method_scripts as $payment_method_script ) { if ( ! array_key_exists( $payment_method_script, $wp_scripts->registered ) || ! property_exists( $wp_scripts->registered[ $payment_method_script ], 'deps' ) ) { continue; } $deps = $wp_scripts->registered[ $payment_method_script ]->deps; foreach ( $deps as $dep ) { if ( ! wp_script_is( $dep, 'registered' ) ) { $error_handle = $dep . '-dependency-error'; $error_message = sprintf( 'Payment gateway with handle \'%1$s\' has been deactivated in Cart and Checkout blocks because its dependency \'%2$s\' is not registered. Read the docs about registering assets for payment methods: https://github.com/woocommerce/woocommerce-blocks/blob/060f63c04f0f34f645200b5d4da9212125c49177/docs/third-party-developers/extensibility/checkout-payment-methods/payment-method-integration.md#registering-assets', esc_html( $payment_method_script ), esc_html( $dep ) ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log error_log( $error_message ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.NotInFooter,WordPress.WP.EnqueuedResourceParameters.MissingVersion wp_register_script( $error_handle, '' ); wp_enqueue_script( $error_handle ); wp_add_inline_script( $error_handle, sprintf( 'console.error( "%s" );', $error_message ) ); $cart_checkout_scripts = [ 'wc-cart-block', 'wc-cart-block-frontend', 'wc-checkout-block', 'wc-checkout-block-frontend' ]; foreach ( $cart_checkout_scripts as $script_handle ) { if ( ! array_key_exists( $script_handle, $wp_scripts->registered ) || ! property_exists( $wp_scripts->registered[ $script_handle ], 'deps' ) ) { continue; } // Remove payment method script from dependencies. $wp_scripts->registered[ $script_handle ]->deps = array_diff( $wp_scripts->registered[ $script_handle ]->deps, [ $payment_method_script ] ); } } } } } }