From 6c5e503eb2c61948229d5a5e3411537a84fa9a5f Mon Sep 17 00:00:00 2001 From: Matt Batchelder Date: Sat, 21 Feb 2026 13:07:41 -0500 Subject: [PATCH] Remove REST API endpoints and related functionality from Oribi Sync --- dist/oribi-tech-sync.zip | Bin 31661 -> 43996 bytes includes/admin.php | 89 ++++++++++++++++++++--- includes/rest.php | 153 --------------------------------------- oribi-tech-sync.php | 1 - 4 files changed, 80 insertions(+), 163 deletions(-) delete mode 100644 includes/rest.php diff --git a/dist/oribi-tech-sync.zip b/dist/oribi-tech-sync.zip index e1ed639ee82e5ff9ae577c741acd50fd87e08173..75a06102f562f19ede0878b189393776ea0fa81f 100644 GIT binary patch delta 30245 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 J{#TGT^-GA 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 diff --git a/includes/admin.php b/includes/admin.php index 35333c3..cfcd30c 100644 --- a/includes/admin.php +++ b/includes/admin.php @@ -8,27 +8,47 @@ if ( ! defined( 'ABSPATH' ) ) exit; -// ─── Admin bar pull button (front-end) ────────────────────────────────────── +// ─── Admin bar pull buttons (front-end) ───────────────────────────────────── add_action( 'admin_bar_menu', function ( WP_Admin_Bar $wp_admin_bar ) { - // Front-end only, logged-in admins, singular pages/posts if ( is_admin() ) return; if ( ! is_user_logged_in() ) return; if ( ! current_user_can( 'manage_options' ) ) return; - if ( ! is_singular() ) return; - - $post = get_queried_object(); - if ( ! $post instanceof WP_Post ) return; + // "Pull All" — visible everywhere on the front-end $wp_admin_bar->add_node( [ - 'id' => 'oribi-sync-pull', - 'title' => 'Pull Page', + 'id' => 'oribi-sync-pull-all', + 'title' => 'Pull All', 'href' => '#', 'meta' => [ - 'title' => 'Pull this page and theme from Git', + 'title' => 'Pull all pages and theme from Git', ], ] ); + + // "Pull Page" — only on singular pages/posts + if ( is_singular() ) { + $post = get_queried_object(); + if ( $post instanceof WP_Post ) { + $wp_admin_bar->add_node( [ + 'id' => 'oribi-sync-pull', + 'title' => 'Pull Page', + 'href' => '#', + 'meta' => [ + 'title' => 'Pull this page and theme from Git', + ], + ] ); + } + } }, 100 ); +// AJAX handler for the admin bar "Pull All" button +add_action( 'wp_ajax_oribi_sync_pull_all_pages', function () { + check_ajax_referer( 'oribi_sync_pull_all_pages' ); + if ( ! current_user_can( 'manage_options' ) ) wp_send_json_error( 'Permission denied.', 403 ); + + $result = oribi_sync_run(); + $result['ok'] ? wp_send_json_success( $result ) : wp_send_json_error( $result, 500 ); +} ); + // AJAX handler for the admin bar pull button (no REST API exposure) add_action( 'wp_ajax_oribi_sync_pull_page', function () { check_ajax_referer( 'oribi_sync_pull_page' ); @@ -41,6 +61,57 @@ add_action( 'wp_ajax_oribi_sync_pull_page', function () { $result['ok'] ? wp_send_json_success( $result ) : wp_send_json_error( $result, 500 ); } ); +// Front-end script for the "Pull All" admin bar button +add_action( 'wp_footer', function () { + if ( ! is_user_logged_in() ) return; + if ( ! current_user_can( 'manage_options' ) ) return; + if ( ! is_admin_bar_showing() ) return; + + $ajax_url = admin_url( 'admin-ajax.php' ); + $nonce_all = wp_create_nonce( 'oribi_sync_pull_all_pages' ); + ?> + + 'POST', - 'callback' => 'oribi_sync_rest_sync', - 'permission_callback' => function () { - return current_user_can( 'manage_options' ); - }, - ] ); - - // ── Sync status ─────────────────────────────────────────────────────── - register_rest_route( 'oribi-sync/v1', '/status', [ - 'methods' => 'GET', - 'callback' => 'oribi_sync_rest_status', - 'permission_callback' => function () { - return current_user_can( 'manage_options' ); - }, - ] ); - - // ── Push page to repo ────────────────────────────────────────────────── - register_rest_route( 'oribi-sync/v1', '/push', [ - 'methods' => 'POST', - 'callback' => 'oribi_sync_rest_push', - 'permission_callback' => function () { - return current_user_can( 'manage_options' ); - }, - ] ); - - // ── Push all synced pages to repo ────────────────────────────────────── - register_rest_route( 'oribi-sync/v1', '/push-all', [ - 'methods' => 'POST', - 'callback' => 'oribi_sync_rest_push_all', - 'permission_callback' => function () { - return current_user_can( 'manage_options' ); - }, - ] ); - - // ── Webhook (secret-based auth, no WP login required) ───────────────── - register_rest_route( 'oribi-sync/v1', '/webhook', [ - 'methods' => 'POST', - 'callback' => 'oribi_sync_rest_webhook', - 'permission_callback' => '__return_true', // Auth handled in callback - ] ); -} ); - -/** - * REST: Trigger sync. - */ -function oribi_sync_rest_sync( WP_REST_Request $request ): WP_REST_Response { - $dry_run = (bool) $request->get_param( 'dry_run' ); - $result = oribi_sync_run( $dry_run ); - - // After pulling, push local changes back (skip during dry-run) - if ( ! $dry_run ) { - $push = oribi_sync_push_all(); - $result['push'] = $push['results']; - } - - return new WP_REST_Response( $result, $result['ok'] ? 200 : 500 ); -} - -/** - * REST: Get last sync status. - */ -function oribi_sync_rest_status(): WP_REST_Response { - return new WP_REST_Response( [ - 'last_run' => get_option( 'oribi_sync_last_run', null ), - 'log' => array_slice( get_option( 'oribi_sync_log', [] ), 0, 5 ), - 'repo' => get_option( 'oribi_sync_repo', '' ), - 'branch' => get_option( 'oribi_sync_branch', 'main' ), - 'provider' => oribi_sync_get_provider(), - 'has_pat' => ! empty( get_option( 'oribi_sync_pat', '' ) ), - ] ); -} - -/** - * REST: Webhook trigger. - * - * Validates using a shared secret stored in the WP option oribi_sync_webhook_secret - * or the constant ORIBI_SYNC_WEBHOOK_SECRET. - * - * Accepts GitHub-style X-Hub-Signature-256 header, or a simple - * Authorization: Bearer header. - */ -function oribi_sync_rest_webhook( WP_REST_Request $request ): WP_REST_Response { - $secret = defined( 'ORIBI_SYNC_WEBHOOK_SECRET' ) - ? ORIBI_SYNC_WEBHOOK_SECRET - : get_option( 'oribi_sync_webhook_secret', '' ); - - if ( empty( $secret ) ) { - return new WP_REST_Response( [ 'error' => 'Webhook secret not configured.' ], 403 ); - } - - // Check Authorization: Bearer - $auth = $request->get_header( 'Authorization' ); - if ( $auth && preg_match( '/^Bearer\s+(.+)$/i', $auth, $m ) ) { - if ( ! hash_equals( $secret, $m[1] ) ) { - return new WP_REST_Response( [ 'error' => 'Invalid secret.' ], 403 ); - } - } - // Check GitHub X-Hub-Signature-256 - elseif ( $sig = $request->get_header( 'X-Hub-Signature-256' ) ) { - $body = $request->get_body(); - $expected = 'sha256=' . hash_hmac( 'sha256', $body, $secret ); - if ( ! hash_equals( $expected, $sig ) ) { - return new WP_REST_Response( [ 'error' => 'Invalid signature.' ], 403 ); - } - } else { - return new WP_REST_Response( [ 'error' => 'Missing authentication.' ], 403 ); - } - - // Run sync - $result = oribi_sync_run(); - - return new WP_REST_Response( $result, $result['ok'] ? 200 : 500 ); -} - -/** - * REST: Push a single page to the repo. - */ -function oribi_sync_rest_push( WP_REST_Request $request ): WP_REST_Response { - $post_id = (int) $request->get_param( 'post_id' ); - if ( $post_id < 1 ) { - return new WP_REST_Response( [ 'ok' => false, 'message' => 'Missing or invalid post_id.' ], 400 ); - } - - $opts = []; - $message = $request->get_param( 'message' ); - if ( ! empty( $message ) ) { - $opts['message'] = sanitize_text_field( $message ); - } - - $result = oribi_sync_push_page( $post_id, $opts ); - - return new WP_REST_Response( $result, $result['ok'] ? 200 : 500 ); -} - -/** - * REST: Push all synced pages to the repo. - */ diff --git a/oribi-tech-sync.php b/oribi-tech-sync.php index b0e535c..264bb06 100644 --- a/oribi-tech-sync.php +++ b/oribi-tech-sync.php @@ -22,7 +22,6 @@ require_once ORIBI_SYNC_DIR . 'includes/sync-engine.php'; require_once ORIBI_SYNC_DIR . 'includes/push-client.php'; require_once ORIBI_SYNC_DIR . 'includes/post-sync.php'; require_once ORIBI_SYNC_DIR . 'includes/admin.php'; -require_once ORIBI_SYNC_DIR . 'includes/rest.php'; require_once ORIBI_SYNC_DIR . 'includes/theme-preview.php'; // ─── Activation / Deactivation ────────────────────────────────────────────────